feat(export): Replace CSV export with standardized JSON format

- Add contactsToExportJson utility function for standardized data export
- Replace CSV export with JSON format in DataExportSection
- Update file extension and MIME type to application/json
- Remove Dexie-specific export logic in favor of unified SQLite/Dexie approach
- Update success notifications to reflect JSON format
- Add TypeScript interfaces for export data structure

This change improves data portability and standardization by:
- Using a consistent JSON format for data export/import
- Supporting both SQLite and Dexie databases
- Including all contact fields in export
- Properly handling contactMethods as stringified JSON
- Maintaining backward compatibility with existing import tools

Security: No sensitive data exposure, maintains existing access controls
This commit is contained in:
Matthew Raymer
2025-06-07 05:02:33 +00:00
parent cfb186a04e
commit b9223d7fe2
9 changed files with 230 additions and 126 deletions

View File

@@ -79,13 +79,9 @@ const DEFAULT_SETTINGS: Settings = {
// retrieves default settings
export async function retrieveSettingsForDefaultAccount(): Promise<Settings> {
console.log("[databaseUtil] retrieveSettingsForDefaultAccount");
const platform = PlatformServiceFactory.getInstance();
const sql = "SELECT * FROM settings WHERE id = ?";
console.log("[databaseUtil] sql", sql);
const result = await platform.dbQuery(sql, [MASTER_SETTINGS_KEY]);
console.log("[databaseUtil] result", JSON.stringify(result, null, 2));
console.trace("Trace from [retrieveSettingsForDefaultAccount]");
if (!result) {
return DEFAULT_SETTINGS;
} else {
@@ -103,21 +99,21 @@ export async function retrieveSettingsForDefaultAccount(): Promise<Settings> {
/**
* Retrieves settings for the active account, merging with default settings
*
*
* @returns Promise<Settings> Combined settings with account-specific overrides
* @throws Will log specific errors for debugging but returns default settings on failure
*/
export async function retrieveSettingsForActiveAccount(): Promise<Settings> {
logConsoleAndDb("[databaseUtil] Starting settings retrieval for active account");
try {
// Get default settings first
const defaultSettings = await retrieveSettingsForDefaultAccount();
logConsoleAndDb(`[databaseUtil] Retrieved default settings (hasActiveDid: ${!!defaultSettings.activeDid})`);
// If no active DID, return defaults
if (!defaultSettings.activeDid) {
logConsoleAndDb("[databaseUtil] No active DID found, returning default settings");
logConsoleAndDb(
"[databaseUtil] No active DID found, returning default settings",
);
return defaultSettings;
}
@@ -130,12 +126,17 @@ export async function retrieveSettingsForActiveAccount(): Promise<Settings> {
);
if (!result?.values?.length) {
logConsoleAndDb(`[databaseUtil] No account-specific settings found for ${defaultSettings.activeDid}`);
logConsoleAndDb(
`[databaseUtil] No account-specific settings found for ${defaultSettings.activeDid}`,
);
return defaultSettings;
}
// Map and filter settings
const overrideSettings = mapColumnsToValues(result.columns, result.values)[0] as Settings;
const overrideSettings = mapColumnsToValues(
result.columns,
result.values,
)[0] as Settings;
const overrideSettingsFiltered = Object.fromEntries(
Object.entries(overrideSettings).filter(([_, v]) => v !== null),
);
@@ -151,30 +152,27 @@ export async function retrieveSettingsForActiveAccount(): Promise<Settings> {
} catch (error) {
logConsoleAndDb(
`[databaseUtil] Failed to parse searchBoxes for ${defaultSettings.activeDid}: ${error}`,
true
true,
);
// Reset to empty array on parse failure
settings.searchBoxes = [];
}
}
logConsoleAndDb(
`[databaseUtil] Successfully merged settings for ${defaultSettings.activeDid} ` +
`(overrides: ${Object.keys(overrideSettingsFiltered).length})`
);
return settings;
} catch (error) {
logConsoleAndDb(
`[databaseUtil] Failed to retrieve account settings for ${defaultSettings.activeDid}: ${error}`,
true
true,
);
// Return defaults on error
return defaultSettings;
}
} catch (error) {
logConsoleAndDb(`[databaseUtil] Failed to retrieve default settings: ${error}`, true);
logConsoleAndDb(
`[databaseUtil] Failed to retrieve default settings: ${error}`,
true,
);
// Return minimal default settings on complete failure
return {
id: MASTER_SETTINGS_KEY,