IndexedDB migration: fix settings update

This commit is contained in:
2025-06-19 18:12:56 -06:00
parent 37f2ba1382
commit 2e34d31594
2 changed files with 66 additions and 52 deletions

View File

@@ -898,6 +898,10 @@ export function generateComparisonYaml(comparison: DataComparison): string {
* }
* ```
*/
/**
*
* I recommend using the existing contact import view to migrate contacts.
*
export async function migrateContacts(
overwriteExisting: boolean = false,
): Promise<MigrationResult> {
@@ -976,6 +980,8 @@ export async function migrateContacts(
return result;
}
}
*
*/
/**
* Migrates specific settings fields from Dexie to SQLite database
@@ -991,13 +997,12 @@ export async function migrateContacts(
*
* @async
* @function migrateSettings
* @param {boolean} [overwriteExisting=false] - Whether to overwrite existing settings in SQLite
* @returns {Promise<MigrationResult>} Detailed results of the migration operation
* @throws {Error} If the migration process fails completely
* @example
* ```typescript
* try {
* const result = await migrateSettings(true); // Overwrite existing
* const result = await migrateSettings();
* if (result.success) {
* console.log(`Successfully migrated ${result.settingsMigrated} settings`);
* } else {
@@ -1008,12 +1013,8 @@ export async function migrateContacts(
* }
* ```
*/
export async function migrateSettings(
overwriteExisting: boolean = false,
): Promise<MigrationResult> {
logger.info("[MigrationService] Starting settings migration", {
overwriteExisting,
});
export async function migrateSettings(): Promise<MigrationResult> {
logger.info("[MigrationService] Starting settings migration");
const result: MigrationResult = {
success: true,
@@ -1026,19 +1027,34 @@ export async function migrateSettings(
try {
const dexieSettings = await getDexieSettings();
logger.info("[MigrationService] Migrating settings", {
dexieSettings: dexieSettings.length,
});
const platformService = PlatformServiceFactory.getInstance();
// loop through dexieSettings,
// load the one with the matching accountDid from sqlite,
// and if one doesn't exist then insert it,
// otherwise, update the fields
dexieSettings.forEach(async (setting) => {
const sqliteSettingRaw = await platformService.dbQuery(
"SELECT * FROM settings WHERE accountDid = ?",
[setting.accountDid]
);
// Create an array of promises for all settings migrations
const migrationPromises = dexieSettings.map(async (setting) => {
logger.info("[MigrationService] Starting to migrate settings", setting);
let sqliteSettingRaw: { columns: string[], values: unknown[][] } | undefined;
if (!setting.accountDid) {
sqliteSettingRaw = await platformService.dbQuery(
"SELECT * FROM settings WHERE accountDid is null"
);
} else {
sqliteSettingRaw = await platformService.dbQuery(
"SELECT * FROM settings WHERE accountDid = ?",
[setting.accountDid]
)
}
logger.info("[MigrationService] Migrating one set of settings:", {
setting,
sqliteSettingRaw,
});
if (sqliteSettingRaw?.values?.length) {
// should cover the master settings, were accountDid is null
const sqliteSetting = mapColumnsToValues(sqliteSettingRaw.columns, sqliteSettingRaw.values) as unknown as Settings;
const sqliteSettings = mapColumnsToValues(sqliteSettingRaw.columns, sqliteSettingRaw.values) as unknown as Settings[];
const sqliteSetting = sqliteSettings[0];
console.log('sqliteSetting', sqliteSetting)
let conditional: string;
let preparams: unknown[];
if (!setting.accountDid) {
@@ -1054,7 +1070,7 @@ export async function migrateSettings(
conditional,
preparams
);
await platformService.dbExec(sql, params);
await platformService.dbExec(sql, params)
result.settingsMigrated++;
} else {
// insert new setting
@@ -1068,12 +1084,17 @@ export async function migrateSettings(
}
});
// Wait for all migrations to complete
const updatedSettings = await Promise.all(migrationPromises);
logger.info("[MigrationService] Finished migrating settings", updatedSettings, result);
return result;
} catch (error) {
logger.error("[MigrationService] Complete settings migration failed:", error);
const errorMessage = `Settings migration failed: ${error}`;
result.errors.push(errorMessage);
result.success = false;
logger.error("[MigrationService] Complete settings migration failed:", error);
return result;
}
}
@@ -1083,7 +1104,7 @@ export async function migrateSettings(
*
* This function transfers all accounts from the Dexie database to the
* SQLite database. It handles both new accounts (INSERT) and existing
* accounts (UPDATE) based on the overwriteExisting parameter.
* accounts (UPDATE).
*
* For accounts with mnemonic data, the function uses importFromMnemonic
* to ensure proper key derivation and identity creation during migration.
@@ -1100,7 +1121,7 @@ export async function migrateSettings(
* @example
* ```typescript
* try {
* const result = await migrateAccounts(true); // Overwrite existing
* const result = await migrateAccounts();
* if (result.success) {
* console.log(`Successfully migrated ${result.accountsMigrated} accounts`);
* } else {
@@ -1199,12 +1220,9 @@ export async function migrateAccounts(): Promise<MigrationResult> {
* The migration runs within a transaction to ensure atomicity. If any step fails,
* the entire migration is rolled back.
*
* @param overwriteExisting - Whether to overwrite existing records in SQLite
* @returns Promise<MigrationResult> - Detailed result of the migration operation
*/
export async function migrateAll(
overwriteExisting: boolean = false,
): Promise<MigrationResult> {
export async function migrateAll(): Promise<MigrationResult> {
const result: MigrationResult = {
success: false,
contactsMigrated: 0,
@@ -1233,7 +1251,7 @@ export async function migrateAll(
// Step 2: Migrate Settings (depends on accounts)
logger.info("[MigrationService] Step 2: Migrating settings...");
const settingsResult = await migrateSettings(overwriteExisting);
const settingsResult = await migrateSettings();
if (!settingsResult.success) {
result.errors.push(
`Settings migration failed: ${settingsResult.errors.join(", ")}`,
@@ -1244,16 +1262,17 @@ export async function migrateAll(
result.warnings.push(...settingsResult.warnings);
// Step 3: Migrate Contacts (independent, but after accounts for consistency)
logger.info("[MigrationService] Step 3: Migrating contacts...");
const contactsResult = await migrateContacts(overwriteExisting);
if (!contactsResult.success) {
result.errors.push(
`Contact migration failed: ${contactsResult.errors.join(", ")}`,
);
return result;
}
result.contactsMigrated = contactsResult.contactsMigrated;
result.warnings.push(...contactsResult.warnings);
// ... but which is better done through the contact import view
// logger.info("[MigrationService] Step 3: Migrating contacts...");
// const contactsResult = await migrateContacts();
// if (!contactsResult.success) {
// result.errors.push(
// `Contact migration failed: ${contactsResult.errors.join(", ")}`,
// );
// return result;
// }
// result.contactsMigrated = contactsResult.contactsMigrated;
// result.warnings.push(...contactsResult.warnings);
// All migrations successful
result.success = true;