deno-fresh-saurpc-lyrics/db.ts
2024-02-20 13:29:29 -06:00

48 lines
1.1 KiB
TypeScript

import { Display, Playlist, Song } from '@lyrics/models.ts'
export const kv = await Deno.openKv('lyrics')
export const TablesForModels = {
'song': Song,
'playlist': Playlist,
'display': Display,
}
export type Table = keyof typeof TablesForModels
function crudFor<
P extends keyof typeof TablesForModels,
T extends { id: string },
M extends { parse: (a: unknown) => T },
>(m: M, p: P) {
return {
async all(): Promise<T[]> {
const result: T[] = []
for await (const v of kv.list<T>({ prefix: [p] })) {
result.push(m.parse(v.value))
}
return result
},
async get(id: string): Promise<T | null> {
const e = await kv.get<T>([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'),
}