From f0fd8c0f12272989cee448ca5c486e9d25a10754 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Mon, 25 Aug 2025 10:18:42 +0000 Subject: [PATCH] feat(diagnostics): add comprehensive logging for server switching and user registration - Enhanced user registration diagnostics with detailed error context - Server switching flow logging with before/after values - Improved error handling with server context - Fixed type safety issues Confirms server switching fix is working perfectly while providing comprehensive debugging for user migration and environment issues. --- src/libs/endorserServer.ts | 42 +++++++++++++++++ src/views/AccountViewView.vue | 88 ++++++++++++++++++++++++++++++----- src/views/HomeView.vue | 19 +++++++- 3 files changed, 136 insertions(+), 13 deletions(-) diff --git a/src/libs/endorserServer.ts b/src/libs/endorserServer.ts index a543ea8d..bf0d3f95 100644 --- a/src/libs/endorserServer.ts +++ b/src/libs/endorserServer.ts @@ -1493,14 +1493,56 @@ export async function fetchEndorserRateLimits( ) { const url = `${apiServer}/api/report/rateLimits`; const headers = await getHeaders(issuerDid); + + // Enhanced diagnostic logging for user registration tracking + logger.info("[User Registration] Checking user status on server:", { + did: issuerDid, + server: apiServer, + endpoint: url, + timestamp: new Date().toISOString(), + }); + try { const response = await axios.get(url, { headers } as AxiosRequestConfig); + + // Log successful registration check + logger.info("[User Registration] User registration check successful:", { + did: issuerDid, + server: apiServer, + status: response.status, + isRegistered: true, + timestamp: new Date().toISOString(), + }); + return response; } catch (error) { + // Enhanced error logging with user registration context + const axiosError = error as { + response?: { + data?: { error?: { code?: string; message?: string } }; + status?: number; + }; + }; + const errorCode = axiosError.response?.data?.error?.code; + const errorMessage = axiosError.response?.data?.error?.message; + const httpStatus = axiosError.response?.status; + + logger.warn("[User Registration] User not registered on server:", { + did: issuerDid, + server: apiServer, + errorCode: errorCode, + errorMessage: errorMessage, + httpStatus: httpStatus, + needsRegistration: true, + timestamp: new Date().toISOString(), + }); + + // Log the original error for debugging logger.error( `[fetchEndorserRateLimits] Error for DID ${issuerDid}:`, errorStringForLog(error), ); + throw error; } } diff --git a/src/views/AccountViewView.vue b/src/views/AccountViewView.vue index 1c368676..1a072cd2 100644 --- a/src/views/AccountViewView.vue +++ b/src/views/AccountViewView.vue @@ -1427,14 +1427,13 @@ export default class AccountViewView extends Vue { async checkLimits(): Promise { this.loadingLimits = true; - try { - const did = this.activeDid; - - if (!did) { - this.limitsMessage = ACCOUNT_VIEW_CONSTANTS.LIMITS.NO_IDENTIFIER; - return; - } + const did = this.activeDid; + if (!did) { + this.limitsMessage = ACCOUNT_VIEW_CONSTANTS.LIMITS.NO_IDENTIFIER; + return; + } + try { await this.$saveUserSettings(did, { apiServer: this.apiServer, partnerApiServer: this.partnerApiServer, @@ -1467,7 +1466,26 @@ export default class AccountViewView extends Vue { } catch (error) { this.limitsMessage = ACCOUNT_VIEW_CONSTANTS.LIMITS.ERROR_RETRIEVING_LIMITS; - logger.error("Error retrieving limits: ", error); + + // Enhanced error logging with server context + const axiosError = error as { + response?: { + data?: { error?: { code?: string; message?: string } }; + status?: number; + }; + }; + logger.error("[Server Limits] Error retrieving limits:", { + error: error instanceof Error ? error.message : String(error), + did: did, + apiServer: this.apiServer, + partnerApiServer: this.partnerApiServer, + errorCode: axiosError?.response?.data?.error?.code, + errorMessage: axiosError?.response?.data?.error?.message, + httpStatus: axiosError?.response?.status, + needsUserMigration: true, + timestamp: new Date().toISOString(), + }); + // this.notify.error(this.limitsMessage, TIMEOUTS.STANDARD); } finally { this.loadingLimits = false; @@ -1475,24 +1493,70 @@ export default class AccountViewView extends Vue { } async onClickSaveApiServer(): Promise { + // Enhanced diagnostic logging for claim URL changes + const previousApiServer = this.apiServer; + const newApiServer = this.apiServerInput; + + logger.info("[Server Switching] Claim URL change initiated:", { + did: this.activeDid, + previousServer: previousApiServer, + newServer: newApiServer, + changeType: "apiServer", + timestamp: new Date().toISOString(), + }); + await this.$saveSettings({ - apiServer: this.apiServerInput, + apiServer: newApiServer, }); - this.apiServer = this.apiServerInput; + this.apiServer = newApiServer; + // Add this line to save to user-specific settings await this.$saveUserSettings(this.activeDid, { apiServer: this.apiServer, }); + + // Log successful server switch + logger.info("[Server Switching] Claim URL change completed:", { + did: this.activeDid, + previousServer: previousApiServer, + newServer: newApiServer, + changeType: "apiServer", + settingsSaved: true, + timestamp: new Date().toISOString(), + }); } async onClickSavePartnerServer(): Promise { + // Enhanced diagnostic logging for partner server changes + const previousPartnerServer = this.partnerApiServer; + const newPartnerServer = this.partnerApiServerInput; + + logger.info("[Server Switching] Partner server change initiated:", { + did: this.activeDid, + previousServer: previousPartnerServer, + newServer: newPartnerServer, + changeType: "partnerApiServer", + timestamp: new Date().toISOString(), + }); + await this.$saveSettings({ - partnerApiServer: this.partnerApiServerInput, + partnerApiServer: newPartnerServer, }); - this.partnerApiServer = this.partnerApiServerInput; + this.partnerApiServer = newPartnerServer; + await this.$saveUserSettings(this.activeDid, { partnerApiServer: this.partnerApiServer, }); + + // Log successful partner server switch + logger.info("[Server Switching] Partner server change completed:", { + did: this.activeDid, + previousServer: previousPartnerServer, + newServer: newPartnerServer, + changeType: "partnerApiServer", + settingsSaved: true, + timestamp: new Date().toISOString(), + }); } async onClickSavePushServer(): Promise { diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index fe6fbc28..5609096f 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -567,10 +567,27 @@ export default class HomeView extends Vue { this.isRegistered = true; } } catch (error) { + // Enhanced error logging with server context + const errorMessage = + error instanceof Error ? error.message : String(error); + const axiosError = error as { + response?: { + data?: { error?: { code?: string; message?: string } }; + status?: number; + }; + }; + logger.warn( "[HomeView Settings Trace] ⚠️ Registration check failed", { - error: error instanceof Error ? error.message : String(error), + error: errorMessage, + did: this.activeDid, + server: this.apiServer, + errorCode: axiosError?.response?.data?.error?.code, + errorMessage: axiosError?.response?.data?.error?.message, + httpStatus: axiosError?.response?.status, + needsUserMigration: true, + timestamp: new Date().toISOString(), }, ); }