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
|
|
|
}
|