import type { HousekeepingPreferences } from "./schema"; import { defaultHousekeepingPreferences, parseHousekeepingPreferences, } from "./schema"; export interface HousekeepingPreferencesStorageRow { schemaVersion: number; payload: string; } export interface HousekeepingPreferencesStorage { findByUserId( userId: number, ): Promise; upsert(row: { userId: number; schemaVersion: 1; payload: string; }): Promise; } export interface HousekeepingPreferencesRepository { read(userId: number): Promise; upsert(userId: number, value: HousekeepingPreferences): Promise; } export function createHousekeepingPreferencesRepository( storage: HousekeepingPreferencesStorage, ): HousekeepingPreferencesRepository { return { async read(userId) { const row = await storage.findByUserId(userId); if (!row) return defaultHousekeepingPreferences(); try { if (row.schemaVersion !== 1) { return defaultHousekeepingPreferences(); } return parseHousekeepingPreferences(row.payload); } catch { return defaultHousekeepingPreferences(); } }, async upsert(userId, value) { await storage.upsert({ userId, schemaVersion: value.schemaVersion, payload: JSON.stringify(value), }); }, }; }