import { Display, Playlist, Song } from '@lyrics/models.ts' export const kv = await Deno.openKv('lyrics') export const TablesForModels = { 'song': Song, 'playlist': Playlist, 'display': Display, } function crudFor< P extends keyof typeof TablesForModels, T extends { id: string }, M extends { parse: (a: T) => 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 const db = { song: crudFor(Song, 'song'), playlist: crudFor(Playlist, 'playlist'), display: crudFor(Display, 'display'), }