deno-fresh-saurpc-lyrics/db.ts

43 lines
945 B
TypeScript
Raw Normal View History

2024-02-18 14:18:51 -06:00
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<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 const db = {
song: crudFor(Song, 'song'),
playlist: crudFor(Playlist, 'playlist'),
display: crudFor(Display, 'display'),
}