diff --git a/src/views/DatabaseMigration.vue b/src/views/DatabaseMigration.vue index 7edd6628..2335884d 100644 --- a/src/views/DatabaseMigration.vue +++ b/src/views/DatabaseMigration.vue @@ -580,8 +580,8 @@ :key="setting.id" class="text-xs text-gray-600 bg-gray-50 p-2 rounded" > -
ID: {{ setting.id }} ({{ setting.id === 1 ? 'master' : 'account' }})
-
{{ setting.activeDid || setting.accountDid }}
+
{{ getSettingDisplayName(setting) }}
+
ID: {{ setting.id }}
Registered: {{ setting.isRegistered ? 'Yes' : 'No' }}
@@ -601,8 +601,8 @@ :key="setting.id" class="text-xs text-gray-600 bg-gray-50 p-2 rounded" > -
ID: {{ setting.id }} ({{ setting.id === 1 ? 'master' : 'account' }})
-
{{ setting.activeDid || setting.accountDid }}
+
{{ getSettingDisplayName(setting) }}
+
ID: {{ setting.id }}
Registered: {{ setting.isRegistered ? 'Yes' : 'No' }}
@@ -622,8 +622,8 @@ :key="setting.id" class="text-xs text-gray-600 bg-gray-50 p-2 rounded" > -
ID: {{ setting.id }} ({{ setting.id === 1 ? 'master' : 'account' }})
-
{{ setting.activeDid || setting.accountDid }}
+
{{ getSettingDisplayName(setting) }}
+
ID: {{ setting.id }}
Registered: {{ setting.isRegistered ? 'Yes' : 'No' }}
@@ -706,8 +706,8 @@
ID: {{ account.id }}
{{ account.did }}
Created: {{ account.dateCreated }}
-
Has Identity: {{ account.identity ? 'Yes' : 'No' }}
-
Has Mnemonic: {{ account.mnemonic ? 'Yes' : 'No' }}
+
Has Identity: {{ getAccountHasIdentity(account) ? 'Yes' : 'No' }}
+
Has Mnemonic: {{ getAccountHasMnemonic(account) ? 'Yes' : 'No' }}
@@ -729,8 +729,8 @@
ID: {{ account.id }}
{{ account.did }}
Created: {{ account.dateCreated }}
-
Has Identity: {{ account.identity ? 'Yes' : 'No' }}
-
Has Mnemonic: {{ account.mnemonic ? 'Yes' : 'No' }}
+
Has Identity: {{ getAccountHasIdentity(account) ? 'Yes' : 'No' }}
+
Has Mnemonic: {{ getAccountHasMnemonic(account) ? 'Yes' : 'No' }}
@@ -752,8 +752,8 @@
ID: {{ account.id }}
{{ account.did }}
Created: {{ account.dateCreated }}
-
Has Identity: {{ account.identity ? 'Yes' : 'No' }}
-
Has Mnemonic: {{ account.mnemonic ? 'Yes' : 'No' }}
+
Has Identity: {{ getAccountHasIdentity(account) ? 'Yes' : 'No' }}
+
Has Mnemonic: {{ getAccountHasMnemonic(account) ? 'Yes' : 'No' }}
@@ -857,6 +857,76 @@ export default class DatabaseMigration extends Vue { return USE_DEXIE_DB; } + /** + * Computed property to get the display name for a setting + * Handles both live comparison data and exported JSON format + * + * @param {any} setting - The setting object + * @returns {string} The display name for the setting + */ + getSettingDisplayName(setting: any): string { + // Handle exported JSON format (has 'type' and 'did' fields) + if (setting.type && setting.did) { + return `${setting.type} (${setting.did})`; + } + + // Handle live comparison data (has 'activeDid' or 'accountDid' fields) + const did = setting.activeDid || setting.accountDid; + const type = setting.id === 1 ? 'master' : 'account'; + return `${type} (${did || 'no DID'})`; + } + + /** + * Computed property to get the DID for a setting + * Handles both live comparison data and exported JSON format + * + * @param {any} setting - The setting object + * @returns {string} The DID for the setting + */ + getSettingDid(setting: any): string { + // Handle exported JSON format (has 'did' field) + if (setting.did) { + return setting.did; + } + + // Handle live comparison data (has 'activeDid' or 'accountDid' fields) + return setting.activeDid || setting.accountDid || 'no DID'; + } + + /** + * Computed property to check if an account has identity + * Handles both live comparison data and exported JSON format + * + * @param {any} account - The account object + * @returns {boolean} True if account has identity + */ + getAccountHasIdentity(account: any): boolean { + // Handle exported JSON format (has 'hasIdentity' field) + if (account.hasIdentity !== undefined) { + return account.hasIdentity; + } + + // Handle live comparison data (has 'identity' field) + return !!account.identity; + } + + /** + * Computed property to check if an account has mnemonic + * Handles both live comparison data and exported JSON format + * + * @param {any} account - The account object + * @returns {boolean} True if account has mnemonic + */ + getAccountHasMnemonic(account: any): boolean { + // Handle exported JSON format (has 'hasMnemonic' field) + if (account.hasMnemonic !== undefined) { + return account.hasMnemonic; + } + + // Handle live comparison data (has 'mnemonic' field) + return !!account.mnemonic; + } + /** * Migrates all data from Dexie to SQLite in the proper order * @@ -1078,12 +1148,10 @@ export default class DatabaseMigration extends Vue { } /** - * Verifies the migration by running another comparison + * Verifies the migration by running a fresh comparison * - * This method runs a fresh comparison between Dexie and SQLite databases - * to verify that the migration was successful. It's useful to run this - * after completing migrations to ensure data integrity and relationship - * preservation. + * This method runs a new comparison after migration to verify + * that the data was transferred correctly. * * @async * @returns {Promise} @@ -1094,75 +1162,24 @@ export default class DatabaseMigration extends Vue { try { const newComparison = await compareDatabases(); - - // Calculate differences by type for each table - const differences = { - contacts: { - added: newComparison.differences.contacts.added.length, - modified: newComparison.differences.contacts.modified.length, - missing: newComparison.differences.contacts.missing.length, - }, - settings: { - added: newComparison.differences.settings.added.length, - modified: newComparison.differences.settings.modified.length, - missing: newComparison.differences.settings.missing.length, - }, - accounts: { - added: newComparison.differences.accounts.added.length, - modified: newComparison.differences.accounts.modified.length, - missing: newComparison.differences.accounts.missing.length, - }, - }; - - const totalRemaining = Object.values(differences).reduce( - (sum, table) => - sum + table.added + table.modified + table.missing, - 0 - ); - - // Build a detailed message - const detailMessages = []; - if (differences.contacts.added + differences.contacts.modified + differences.contacts.missing > 0) { - detailMessages.push( - `Contacts: ${differences.contacts.added} to add, ${differences.contacts.modified} modified, ${differences.contacts.missing} missing` - ); - } - - if (differences.settings.added + differences.settings.modified + differences.settings.missing > 0) { - detailMessages.push( - `Settings: ${differences.settings.added} to add, ${differences.settings.modified} modified, ${differences.settings.missing} missing` - ); - } + const totalRemaining = + newComparison.differences.contacts.added.length + + newComparison.differences.settings.added.length + + newComparison.differences.accounts.added.length; - if (differences.accounts.added + differences.accounts.modified + differences.accounts.missing > 0) { - detailMessages.push( - `Accounts: ${differences.accounts.added} to add, ${differences.accounts.modified} modified, ${differences.accounts.missing} missing` - ); - } - if (totalRemaining === 0) { - this.successMessage = - "✅ Migration verification successful! All data has been migrated correctly."; - logger.info( - "[DatabaseMigration] Migration verification successful - no differences found" - ); + this.successMessage = "Migration verification successful! All data has been migrated."; + this.comparison = newComparison; } else { - this.successMessage = `⚠️ Migration verification completed. Found ${totalRemaining} remaining differences:\n${detailMessages.join("\n")}`; - if (differences.settings.modified > 0 || differences.settings.missing > 0) { - this.successMessage += "\n\nNote: Some settings differences may be expected due to default values in SQLite."; - } - logger.warn( - "[DatabaseMigration] Migration verification found remaining differences", - { - remaining: totalRemaining, - differences: differences, - } - ); + this.error = `Migration verification failed. ${totalRemaining} items still need to be migrated.`; + this.comparison = newComparison; } - - // Update the comparison to show the current state - this.comparison = newComparison; + + logger.info("[DatabaseMigration] Migration verification completed", { + totalRemaining, + success: totalRemaining === 0 + }); } catch (error) { this.error = `Failed to verify migration: ${error}`; logger.error("[DatabaseMigration] Migration verification failed:", error); @@ -1172,10 +1189,10 @@ export default class DatabaseMigration extends Vue { } /** - * Exports comparison results to a file + * Exports the comparison data to a JSON file * - * This method generates a YAML-formatted comparison and triggers - * a file download for the user. + * This method generates a JSON file containing the complete comparison + * data in a format that matches the exported JSON structure. * * @async * @returns {Promise} @@ -1190,41 +1207,23 @@ export default class DatabaseMigration extends Vue { const yamlData = generateComparisonYaml(this.comparison); const blob = new Blob([yamlData], { type: "application/json" }); const url = URL.createObjectURL(blob); - - const link = document.createElement("a"); - link.href = url; - link.download = `database-comparison-${new Date().toISOString().split("T")[0]}.json`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + + const a = document.createElement("a"); + a.href = url; + a.download = `database-comparison-${new Date().toISOString().split('T')[0]}.json`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); URL.revokeObjectURL(url); - - this.successMessage = "Comparison exported successfully"; - logger.info("[DatabaseMigration] Comparison exported successfully"); + + this.successMessage = "Comparison data exported successfully"; + logger.info("[DatabaseMigration] Comparison data exported successfully"); } catch (error) { - this.error = `Failed to export comparison: ${error}`; + this.error = `Failed to export comparison data: ${error}`; logger.error("[DatabaseMigration] Export failed:", error); } } - /** - * Sets the loading state and message - * - * @param {string} message - The loading message to display - */ - private setLoading(message: string): void { - this.isLoading = message !== ""; - this.loadingMessage = message; - } - - /** - * Clears all error and success messages - */ - private clearMessages(): void { - this.error = ""; - this.successMessage = ""; - } - /** * Tests the specific settings migration for the fields you mentioned * @@ -1252,5 +1251,23 @@ export default class DatabaseMigration extends Vue { this.setLoading(""); } } + + /** + * Sets the loading state and message + * + * @param {string} message - The loading message to display + */ + private setLoading(message: string): void { + this.isLoading = message !== ""; + this.loadingMessage = message; + } + + /** + * Clears all error and success messages + */ + private clearMessages(): void { + this.error = ""; + this.successMessage = ""; + } }