81 lines
1.7 KiB
TypeScript
81 lines
1.7 KiB
TypeScript
import { z } from 'https://deno.land/x/zod@v3.21.4/mod.ts'
|
|
import {
|
|
createPentagon,
|
|
TableDefinition,
|
|
} from 'https://deno.land/x/pentagon@v0.1.5/mod.ts'
|
|
// import { ulid } from 'https://deno.land/x/ulid@v0.3.0/mod.ts'
|
|
|
|
export 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 schema: Record<string, TableDefinition> = {
|
|
users: {
|
|
schema: User,
|
|
relations: {
|
|
assignedTodos: ['todos', [Todo], 'id', 'assigneeUserId'],
|
|
},
|
|
},
|
|
todos: {
|
|
schema: Todo,
|
|
relations: {
|
|
assignee: ['users', User, 'assigneeUserId', 'id'],
|
|
},
|
|
},
|
|
}
|
|
|
|
export const db = createPentagon(kv, schema)
|
|
|
|
// 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 })
|