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 = "";
+ }
}