diff --git a/src/utils/PlatformServiceMixin.ts b/src/utils/PlatformServiceMixin.ts index aefc30c2..d19f6a2f 100644 --- a/src/utils/PlatformServiceMixin.ts +++ b/src/utils/PlatformServiceMixin.ts @@ -10,6 +10,7 @@ * - Mixin pattern for easy integration with existing class components * - Enhanced utility methods for common patterns * - Robust error handling and logging + * - Ultra-concise database interaction methods * * Benefits: * - Eliminates repeated PlatformServiceFactory.getInstance() calls @@ -18,15 +19,17 @@ * - Maintains type safety with TypeScript * - Includes common database utility patterns * - Enhanced error handling and logging + * - Ultra-concise method names for frequent operations * * @author Matthew Raymer - * @version 2.0.0 + * @version 3.0.0 * @since 2025-07-02 */ import { PlatformServiceFactory } from "@/services/PlatformServiceFactory"; import type { PlatformService } from "@/services/PlatformService"; import { mapColumnsToValues, parseJsonField } from "@/db/databaseUtil"; +import { MASTER_SETTINGS_KEY } from "@/db/tables/settings"; /** * Enhanced mixin that provides cached platform service access and utility methods @@ -284,6 +287,103 @@ export const PlatformServiceMixin = { throw error; } }, + + // ================================================= + // ULTRA-CONCISE DATABASE METHODS (shortest names) + // ================================================= + + /** + * Ultra-short database query - just $db() + * @param sql SQL query string + * @param params Query parameters + */ + async $db(sql: string, params: unknown[] = []): Promise { + return await (this as any).platformService.dbQuery(sql, params); + }, + + /** + * Ultra-short database exec - just $exec() + * @param sql SQL statement string + * @param params Statement parameters + */ + async $exec(sql: string, params: unknown[] = []): Promise { + return await (this as any).platformService.dbExec(sql, params); + }, + + /** + * Ultra-short single row query - just $one() + * @param sql SQL query string + * @param params Query parameters + */ + async $one(sql: string, params: unknown[] = []): Promise { + return await (this as any).platformService.dbGetOneRow(sql, params); + }, + + // ================================================= + // QUERY + MAPPING COMBO METHODS (ultimate conciseness) + // ================================================= + + /** + * Query with automatic result mapping - $query() + * Combines database query + mapping in one call + * @param sql SQL query string + * @param params Query parameters + * @returns Mapped array of results + */ + async $query(sql: string, params: unknown[] = []): Promise { + const result = await (this as any).platformService.dbQuery(sql, params); + if (!result?.columns || !result?.values) { + return []; + } + return mapColumnsToValues(result.columns, result.values) || []; + }, + + /** + * Get first result with automatic mapping - $first() + * @param sql SQL query string + * @param params Query parameters + * @returns First mapped result or null + */ + async $first(sql: string, params: unknown[] = []): Promise { + const results = await (this as any).$query(sql, params); + return results.length > 0 ? results[0] : null; + }, + + // ================================================= + // SPECIALIZED SHORTCUTS (common patterns) + // ================================================= + + /** + * Load all contacts in one call - $contacts() + * Ultra-concise shortcut for the most common query + * @returns Mapped array of all contacts + */ + async $contacts(): Promise { + return await (this as any).$query("SELECT * FROM contacts ORDER BY name"); + }, + + /** + * Load settings with optional defaults - $settings() + * @param defaults Optional default values + * @returns Settings object + */ + async $settings(defaults: any = {}): Promise { + return await (this as any).$getSettings(MASTER_SETTINGS_KEY, defaults); + }, + + /** + * Load account-specific settings - $accountSettings() + * @param did DID identifier (optional, uses current active DID) + * @param defaults Optional default values + * @returns Merged settings object + */ + async $accountSettings(did?: string, defaults: any = {}): Promise { + const currentDid = did || (this as any).activeDid; + if (!currentDid) { + return await (this as any).$settings(defaults); + } + return await (this as any).$getMergedSettings(MASTER_SETTINGS_KEY, currentDid, defaults); + }, }, }; @@ -307,3 +407,37 @@ export interface IPlatformServiceMixin { isElectron: boolean; capabilities: any; } + +// TypeScript declaration merging to eliminate (this as any) type assertions +declare module "@vue/runtime-core" { + interface ComponentCustomProperties { + // Core platform service access + platformService: PlatformService; + isCapacitor: boolean; + isWeb: boolean; + isElectron: boolean; + capabilities: any; + + // Ultra-concise database methods (shortest possible names) + $db(sql: string, params?: unknown[]): Promise; + $exec(sql: string, params?: unknown[]): Promise; + $one(sql: string, params?: unknown[]): Promise; + + // Query + mapping combo methods + $query(sql: string, params?: unknown[]): Promise; + $first(sql: string, params?: unknown[]): Promise; + + // Enhanced utility methods + $dbQuery(sql: string, params?: unknown[]): Promise; + $dbExec(sql: string, params?: unknown[]): Promise; + $dbGetOneRow(sql: string, params?: unknown[]): Promise; + $getSettings(key: string, defaults?: any): Promise; + $getMergedSettings(key: string, did?: string, defaults?: any): Promise; + $withTransaction(fn: () => Promise): Promise; + + // Specialized shortcuts for ultra-common patterns + $contacts(): Promise; + $settings(defaults?: any): Promise; + $accountSettings(did?: string, defaults?: any): Promise; + } +} diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index ea23fe17..287d9d36 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -538,10 +538,10 @@ export default class HomeView extends Vue { } } - // Load settings with better error context using enhanced mixin + // Load settings with better error context using ultra-concise mixin let settings; try { - settings = await (this as any).$getSettings(MASTER_SETTINGS_KEY, { + settings = await this.$settings({ apiServer: "", activeDid: "", isRegistered: false, @@ -610,7 +610,7 @@ export default class HomeView extends Vue { this.activeDid, ); if (resp.status === 200) { - const currentSettings = await (this as any).$getSettings(MASTER_SETTINGS_KEY, {}); + const currentSettings = await this.$settings(); await databaseUtil.updateDidSpecificSettings(this.activeDid, { isRegistered: true, ...currentSettings, @@ -681,7 +681,7 @@ export default class HomeView extends Vue { } /** - * Loads user settings from storage using enhanced mixin utilities + * Loads user settings from storage using ultra-concise mixin utilities * Sets component state for: * - API server, Active DID, Feed filters and view settings * - Registration status, Notification acknowledgments @@ -690,17 +690,14 @@ export default class HomeView extends Vue { * Called by mounted() and reloadFeedOnChange() */ private async loadSettings() { - // Use enhanced mixin utility for default settings - much more concise! - const settings = await (this as any).$getSettings( - MASTER_SETTINGS_KEY, - { - apiServer: "", - activeDid: "", - filterFeedByVisible: false, - filterFeedByNearby: false, - isRegistered: false, - } - ); + // Ultra-concise settings loading with defaults! + const settings = await this.$settings({ + apiServer: "", + activeDid: "", + filterFeedByVisible: false, + filterFeedByNearby: false, + isRegistered: false, + }); this.apiServer = settings.apiServer || ""; this.activeDid = settings.activeDid || ""; @@ -718,17 +715,14 @@ export default class HomeView extends Vue { } /** - * Loads user contacts from database + * Loads user contacts from database using ultra-concise mixin * Used for displaying contact info in feed and actions * * @internal * Called by mounted() and initializeIdentity() */ private async loadContacts() { - const dbContacts = await (this as any).$dbQuery("SELECT * FROM contacts"); - this.allContacts = databaseUtil.mapQueryResultToValues( - dbContacts, - ) as unknown as Contact[]; + this.allContacts = await this.$contacts(); this.blockedContactDids = this.allContacts .filter((c) => !c.iViewContent) .map((c) => c.did); @@ -752,7 +746,7 @@ export default class HomeView extends Vue { this.activeDid, ); if (resp.status === 200) { - const currentSettings = await (this as any).$getSettings(MASTER_SETTINGS_KEY, {}); + const currentSettings = await this.$settings(); await databaseUtil.updateDidSpecificSettings(this.activeDid, { isRegistered: true, ...currentSettings, @@ -810,14 +804,14 @@ export default class HomeView extends Vue { } /** - * Checks if user needs onboarding using enhanced mixin utilities + * Checks if user needs onboarding using ultra-concise mixin utilities * Opens onboarding dialog if not completed * * @internal * Called by mounted() */ private async checkOnboarding() { - const settings = await (this as any).$getSettings(MASTER_SETTINGS_KEY, {}); + const settings = await this.$settings(); if (!settings.finishedOnboarding) { (this.$refs.onboardingDialog as OnboardingDialog).open(OnboardPage.Home); } @@ -877,7 +871,7 @@ export default class HomeView extends Vue { } /** - * Reloads feed when filter settings change using enhanced mixin utilities + * Reloads feed when filter settings change using ultra-concise mixin utilities * - Updates filter states * - Clears existing feed data * - Triggers new feed load @@ -886,11 +880,10 @@ export default class HomeView extends Vue { * Called by FeedFilters component when filters change */ async reloadFeedOnChange() { - const settings = await (this as any).$getMergedSettings( - MASTER_SETTINGS_KEY, - this.activeDid, - { filterFeedByVisible: false, filterFeedByNearby: false } - ); + const settings = await this.$accountSettings(this.activeDid, { + filterFeedByVisible: false, + filterFeedByNearby: false, + }); this.isFeedFilteredByVisible = !!settings.filterFeedByVisible; this.isFeedFilteredByNearby = !!settings.filterFeedByNearby; this.isAnyFeedFilterOn = checkIsAnyFeedFilterOn(settings);