import { AuthUser, Display, Playlist, Song, Team } from '@lyrics/models.ts' export const kv = await Deno.openKv('lyrics') export const TablesForModels = { 'song': Song, 'playlist': Playlist, 'display': Display, 'user': AuthUser, 'team': Team, } export type Table = keyof typeof TablesForModels function crudFor< T extends { id: string }, P extends keyof typeof TablesForModels, M extends { parse: (a: unknown) => T }, >(m: M, p: P) { return { async all(): Promise { const result: T[] = [] for await (const v of kv.list({ prefix: [p] })) { result.push(m.parse(v.value)) } return result }, async get(id: string): Promise { const e = await kv.get([p, id]) if (e.value == null) return null return m.parse(e.value) }, async save(t: T) { return await kv.set([p, t.id], t) }, async delete(id: string) { return await kv.delete([p, id]) }, } } export function isTable(value: string): value is Table { return (value in TablesForModels) } export const db = { song: crudFor(Song, 'song'), playlist: crudFor( Playlist, 'playlist', ), display: crudFor(Display, 'display'), user: crudFor(AuthUser, 'user'), team: crudFor(Team, 'team'), }