Complete Enhanced Triple Migration Pattern for contact components
- Migrate ContactBulkActions, ContactInputForm, ContactListHeader, ContactListItem, LargeIdenticonModal, and ContactsView to PlatformServiceMixin - Add comprehensive deep linking support to CapacitorPlatformService and WebPlatformService - Enhance PlatformService with new database operations and deep link handling - Update service worker and documentation for migration progress - Fix TypeScript type errors in util.ts and deepLinks.ts - Streamline circular dependency analysis and migration tracking docs
This commit is contained in:
@@ -155,6 +155,49 @@ export interface PlatformService {
|
||||
*/
|
||||
dbGetOneRow(sql: string, params?: unknown[]): Promise<unknown[] | undefined>;
|
||||
|
||||
// Database utility methods
|
||||
/**
|
||||
* Generates an INSERT SQL statement for a given model and table.
|
||||
* @param model - The model object containing the data to insert
|
||||
* @param tableName - The name of the table to insert into
|
||||
* @returns Object containing the SQL statement and parameters
|
||||
*/
|
||||
generateInsertStatement(
|
||||
model: Record<string, unknown>,
|
||||
tableName: string,
|
||||
): { sql: string; params: unknown[] };
|
||||
|
||||
/**
|
||||
* Updates default settings in the database.
|
||||
* @param settings - The settings object to update
|
||||
* @returns Promise that resolves when the update is complete
|
||||
*/
|
||||
updateDefaultSettings(settings: Record<string, unknown>): Promise<void>;
|
||||
|
||||
/**
|
||||
* Inserts DID-specific settings into the database.
|
||||
* @param did - The DID to associate with the settings
|
||||
* @returns Promise that resolves when the insertion is complete
|
||||
*/
|
||||
insertDidSpecificSettings(did: string): Promise<void>;
|
||||
|
||||
/**
|
||||
* Updates DID-specific settings in the database.
|
||||
* @param did - The DID to update settings for
|
||||
* @param settings - The settings object to update
|
||||
* @returns Promise that resolves when the update is complete
|
||||
*/
|
||||
updateDidSpecificSettings(
|
||||
did: string,
|
||||
settings: Record<string, unknown>,
|
||||
): Promise<void>;
|
||||
|
||||
/**
|
||||
* Retrieves settings for the active account.
|
||||
* @returns Promise resolving to the settings object
|
||||
*/
|
||||
retrieveSettingsForActiveAccount(): Promise<Record<string, unknown> | null>;
|
||||
|
||||
// --- PWA/Web-only methods (optional, only implemented on web) ---
|
||||
/**
|
||||
* Registers the service worker for PWA support (web only)
|
||||
|
||||
@@ -52,7 +52,6 @@ import {
|
||||
routeSchema,
|
||||
DeepLinkRoute,
|
||||
} from "../interfaces/deepLinks";
|
||||
import { logConsoleAndDb } from "../db/databaseUtil";
|
||||
import type { DeepLinkError } from "../interfaces/deepLinks";
|
||||
|
||||
// Helper function to extract the first key from a Zod object schema
|
||||
@@ -148,10 +147,8 @@ export class DeepLinkHandler {
|
||||
params[routeConfig.paramKey ?? "id"] = pathParams.join("/");
|
||||
}
|
||||
|
||||
// logConsoleAndDb(
|
||||
// `[DeepLink] Debug: Route Path: ${routePath} Path Params: ${JSON.stringify(params)} Query String: ${JSON.stringify(query)}`,
|
||||
// false,
|
||||
// );
|
||||
// Note: Logging removed to eliminate databaseUtil dependency
|
||||
// Deep link parsing debug info can be added back using PlatformServiceMixin if needed
|
||||
return { path: routePath, params, query };
|
||||
}
|
||||
|
||||
@@ -177,8 +174,8 @@ export class DeepLinkHandler {
|
||||
const validRoute = routeSchema.parse(path) as DeepLinkRoute;
|
||||
routeName = ROUTE_MAP[validRoute].name;
|
||||
} catch (error) {
|
||||
// Log the invalid route attempt
|
||||
logConsoleAndDb(`[DeepLink] Invalid route path: ${path}`, true);
|
||||
// Log the invalid route attempt - using console.error instead of databaseUtil
|
||||
console.error(`[DeepLink] Invalid route path: ${path}`);
|
||||
|
||||
// Redirect to error page with information about the invalid link
|
||||
await this.router.replace({
|
||||
@@ -205,9 +202,8 @@ export class DeepLinkHandler {
|
||||
validatedQuery = await schema.parseAsync(query);
|
||||
} catch (error) {
|
||||
// For parameter validation errors, provide specific error feedback
|
||||
logConsoleAndDb(
|
||||
console.error(
|
||||
`[DeepLink] Invalid parameters for route name ${routeName} for path: ${path}: ${JSON.stringify(error)} ... with params: ${JSON.stringify(params)} ... and query: ${JSON.stringify(query)}`,
|
||||
true,
|
||||
);
|
||||
await this.router.replace({
|
||||
name: "deep-link-error",
|
||||
@@ -231,9 +227,8 @@ export class DeepLinkHandler {
|
||||
query: validatedQuery,
|
||||
});
|
||||
} catch (error) {
|
||||
logConsoleAndDb(
|
||||
console.error(
|
||||
`[DeepLink] Error routing to route name ${routeName} for path: ${path}: ${JSON.stringify(error)} ... with validated params: ${JSON.stringify(validatedParams)} ... and validated query: ${JSON.stringify(validatedQuery)}`,
|
||||
true,
|
||||
);
|
||||
// For parameter validation errors, provide specific error feedback
|
||||
await this.router.replace({
|
||||
@@ -266,9 +261,9 @@ export class DeepLinkHandler {
|
||||
await this.validateAndRoute(path, sanitizedParams, query);
|
||||
} catch (error) {
|
||||
const deepLinkError = error as DeepLinkError;
|
||||
logConsoleAndDb(
|
||||
// Log the error using console.error instead of databaseUtil
|
||||
console.error(
|
||||
`[DeepLink] Error (${deepLinkError.code}): ${deepLinkError.details}`,
|
||||
true,
|
||||
);
|
||||
|
||||
throw {
|
||||
|
||||
@@ -1305,4 +1305,61 @@ export class CapacitorPlatformService implements PlatformService {
|
||||
public get isPWAEnabled(): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Database utility methods
|
||||
generateInsertStatement(
|
||||
model: Record<string, unknown>,
|
||||
tableName: string,
|
||||
): { sql: string; params: unknown[] } {
|
||||
const keys = Object.keys(model);
|
||||
const placeholders = keys.map(() => "?").join(", ");
|
||||
const sql = `INSERT INTO ${tableName} (${keys.join(", ")}) VALUES (${placeholders})`;
|
||||
const params = keys.map((key) => model[key]);
|
||||
return { sql, params };
|
||||
}
|
||||
|
||||
async updateDefaultSettings(
|
||||
settings: Record<string, unknown>,
|
||||
): Promise<void> {
|
||||
const keys = Object.keys(settings);
|
||||
const setClause = keys.map((key) => `${key} = ?`).join(", ");
|
||||
const sql = `UPDATE settings SET ${setClause} WHERE key = 'default'`;
|
||||
const params = keys.map((key) => settings[key]);
|
||||
await this.dbExec(sql, params);
|
||||
}
|
||||
|
||||
async insertDidSpecificSettings(did: string): Promise<void> {
|
||||
await this.dbExec("INSERT INTO settings (key, value) VALUES (?, ?)", [
|
||||
did,
|
||||
"{}",
|
||||
]);
|
||||
}
|
||||
|
||||
async updateDidSpecificSettings(
|
||||
did: string,
|
||||
settings: Record<string, unknown>,
|
||||
): Promise<void> {
|
||||
const keys = Object.keys(settings);
|
||||
const setClause = keys.map((key) => `${key} = ?`).join(", ");
|
||||
const sql = `UPDATE settings SET ${setClause} WHERE key = ?`;
|
||||
const params = [...keys.map((key) => settings[key]), did];
|
||||
await this.dbExec(sql, params);
|
||||
}
|
||||
|
||||
async retrieveSettingsForActiveAccount(): Promise<Record<
|
||||
string,
|
||||
unknown
|
||||
> | null> {
|
||||
const result = await this.dbQuery(
|
||||
"SELECT value FROM settings WHERE key = 'default'",
|
||||
);
|
||||
if (result?.values?.[0]?.[0]) {
|
||||
try {
|
||||
return JSON.parse(result.values[0][0] as string);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -669,4 +669,61 @@ export class WebPlatformService implements PlatformService {
|
||||
private initSharedArrayBuffer(): void {
|
||||
// SharedArrayBuffer initialization is handled by initBackend call in initializeWorker
|
||||
}
|
||||
|
||||
// Database utility methods
|
||||
generateInsertStatement(
|
||||
model: Record<string, unknown>,
|
||||
tableName: string,
|
||||
): { sql: string; params: unknown[] } {
|
||||
const keys = Object.keys(model);
|
||||
const placeholders = keys.map(() => "?").join(", ");
|
||||
const sql = `INSERT INTO ${tableName} (${keys.join(", ")}) VALUES (${placeholders})`;
|
||||
const params = keys.map((key) => model[key]);
|
||||
return { sql, params };
|
||||
}
|
||||
|
||||
async updateDefaultSettings(
|
||||
settings: Record<string, unknown>,
|
||||
): Promise<void> {
|
||||
const keys = Object.keys(settings);
|
||||
const setClause = keys.map((key) => `${key} = ?`).join(", ");
|
||||
const sql = `UPDATE settings SET ${setClause} WHERE key = 'default'`;
|
||||
const params = keys.map((key) => settings[key]);
|
||||
await this.dbExec(sql, params);
|
||||
}
|
||||
|
||||
async insertDidSpecificSettings(did: string): Promise<void> {
|
||||
await this.dbExec("INSERT INTO settings (key, value) VALUES (?, ?)", [
|
||||
did,
|
||||
"{}",
|
||||
]);
|
||||
}
|
||||
|
||||
async updateDidSpecificSettings(
|
||||
did: string,
|
||||
settings: Record<string, unknown>,
|
||||
): Promise<void> {
|
||||
const keys = Object.keys(settings);
|
||||
const setClause = keys.map((key) => `${key} = ?`).join(", ");
|
||||
const sql = `UPDATE settings SET ${setClause} WHERE key = ?`;
|
||||
const params = [...keys.map((key) => settings[key]), did];
|
||||
await this.dbExec(sql, params);
|
||||
}
|
||||
|
||||
async retrieveSettingsForActiveAccount(): Promise<Record<
|
||||
string,
|
||||
unknown
|
||||
> | null> {
|
||||
const result = await this.dbQuery(
|
||||
"SELECT value FROM settings WHERE key = 'default'",
|
||||
);
|
||||
if (result?.values?.[0]?.[0]) {
|
||||
try {
|
||||
return JSON.parse(result.values[0][0] as string);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user