deno-fresh-saurpc-lyrics/db.ts

55 lines
1.2 KiB
TypeScript
Raw Permalink Normal View History

2024-03-10 16:06:38 -05:00
import { AuthUser, Display, Playlist, Song, Team } from '@lyrics/models.ts'
2024-02-18 14:18:51 -06:00
export const kv = await Deno.openKv('lyrics')
export const TablesForModels = {
'song': Song,
'playlist': Playlist,
'display': Display,
2024-03-10 16:06:38 -05:00
'user': AuthUser,
'team': Team,
2024-02-18 14:18:51 -06:00
}
2024-02-20 13:29:29 -06:00
export type Table = keyof typeof TablesForModels
2024-02-18 14:18:51 -06:00
function crudFor<
T extends { id: string },
2024-03-10 16:06:38 -05:00
P extends keyof typeof TablesForModels,
2024-02-20 13:29:29 -06:00
M extends { parse: (a: unknown) => T },
2024-02-18 14:18:51 -06:00
>(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])
},
}
}
2024-02-20 13:29:29 -06:00
export function isTable(value: string): value is Table {
return (value in TablesForModels)
}
2024-02-18 14:18:51 -06:00
export const db = {
song: crudFor(Song, 'song'),
2024-03-10 16:06:38 -05:00
playlist: crudFor(
Playlist,
'playlist',
),
2024-02-18 14:18:51 -06:00
display: crudFor(Display, 'display'),
2024-03-10 16:06:38 -05:00
user: crudFor(AuthUser, 'user'),
team: crudFor(Team, 'team'),
2024-02-18 14:18:51 -06:00
}