homeman-deno/models.ts

76 lines
1.6 KiB
TypeScript

import { z } from 'https://deno.land/x/zod@v3.21.4/mod.ts'
import { createPentagon } from 'https://deno.land/x/pentagon@v0.1.5/mod.ts'
// import { ulid } from 'https://deno.land/x/ulid@v0.3.0/mod.ts'
const kv = await Deno.openKv('homeman.db')
// const todos = kv.list({ prefix: ['todos'] })
// const deleteme = []
// for await (const u of todos) {
// deleteme.push(u.key)
// console.log(u)
// }
// for (const d of deleteme) {
// await kv.delete(d)
// }
const User = z.object({
id: z.string().ulid().describe('primary'),
createdAt: z.date(),
name: z.string(),
avatarUrl: z.string(),
color: z.string(),
})
export const UserModel = User
export type User = z.infer<typeof User>
export type UserWithTodos = User & {
assignedTodos: Todo[]
}
const Todo = z.object({
id: z.string().ulid().describe('primary'),
createdAt: z.date(),
description: z.string(),
emoji: z.string().nullable(),
doneAt: z.date().nullable(),
assigneeUserId: z.string().ulid().nullable(),
})
export const TodoModel = Todo
export type Todo = z.infer<typeof Todo>
export const db = createPentagon(kv, {
users: {
schema: User,
relations: {
assignedTodos: ['todos', [Todo], 'id', 'assigneeUserId'],
},
},
todos: {
schema: Todo,
relations: {
assignee: ['users', User, 'assigneeUserId', 'id'],
},
},
})
// const daddy: User = {
// id: ulid(),
// createdAt: new Date(),
// name: 'Daddy',
// avatarUrl: null,
// }
// const todo: Todo = {
// emoji: null,
// id: ulid(),
// createdAt: new Date(),
// description: 'Test Todo',
// doneAt: null,
// assigneeUserId: daddy.id,
// }
// db.todos.create({ data: todo })
// db.users.create({ data: daddy })