43 lines
945 B
TypeScript
43 lines
945 B
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,
|
||
|
}
|
||
|
|
||
|
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'),
|
||
|
}
|