54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import type { HousekeepingPreferences } from "./schema";
|
|
import {
|
|
defaultHousekeepingPreferences,
|
|
parseHousekeepingPreferences,
|
|
} from "./schema";
|
|
|
|
export interface HousekeepingPreferencesStorageRow {
|
|
schemaVersion: number;
|
|
payload: string;
|
|
}
|
|
|
|
export interface HousekeepingPreferencesStorage {
|
|
findByUserId(
|
|
userId: number,
|
|
): Promise<HousekeepingPreferencesStorageRow | null>;
|
|
upsert(row: {
|
|
userId: number;
|
|
schemaVersion: 1;
|
|
payload: string;
|
|
}): Promise<void>;
|
|
}
|
|
|
|
export interface HousekeepingPreferencesRepository {
|
|
read(userId: number): Promise<HousekeepingPreferences>;
|
|
upsert(userId: number, value: HousekeepingPreferences): Promise<void>;
|
|
}
|
|
|
|
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),
|
|
});
|
|
},
|
|
};
|
|
}
|