homeman-deno/db.ts
2024-02-18 09:23:37 -06:00

46 lines
1.1 KiB
TypeScript

import { Identifiable, Task, Todo, User } from '@homeman/models.ts'
import { z } from 'https://deno.land/x/zod@v3.21.4/mod.ts'
import { Created } from '@homeman/models.ts'
export const kv = await Deno.openKv('homeman.db')
export const schema = {
// key is table name, value is zod schema
user: User,
todo: Todo,
task: Task,
}
export type Schema = typeof schema
export type Table = keyof Schema
export type Model<T extends Table> = z.infer<Schema[T]>
export async function get<T extends Table>(
a: T,
id: z.infer<typeof Identifiable>['id'],
): Promise<Deno.KvEntryMaybe<Model<T>>> {
return await kv.get<Model<T>>([a, id])
}
export function all<T extends Table>(
a: T,
): Deno.KvListIterator<Model<T>> {
return kv.list<Model<T>>({ prefix: [a] })
}
type Create<T> = Omit<T, 'id' | 'createdAt'> | Partial<T>
export function create<T extends Table, K extends Identifiable>(
a: T,
payload: Create<K>,
): Deno.KvListIterator<Model<T>> {
const data: Create<Model<T>> | undefined = schema[a].parse(payload)
if (Identifiable.safeParse(data).success) {
delete data.id
}
if (Created.safeParse(data).success) {
delete data.createdBy
}
return kv.set([a, )
}