Files
Epicnabbo-Catalogus-Updated…/src/features/housekeeping/foundation/preferences/repository.ts
T

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),
});
},
};
}