homeman-deno/models.ts

60 lines
1.2 KiB
TypeScript
Raw Normal View History

2024-01-05 21:10:38 -06:00
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'
2024-01-05 13:22:56 -06:00
2024-01-05 21:10:38 -06:00
const kv = await Deno.openKv()
const User = z.object({
id: z.string().ulid().describe('primary'),
createdAt: z.date(),
name: z.string(),
avatarUrl: z.string().nullable(),
})
export type User = z.infer<typeof User>
const Todo = z.object({
id: z.string().ulid().describe('primary'),
createdAt: z.date(),
description: z.string(),
emoji: z.string().nullable(),
2024-01-05 13:22:56 -06:00
2024-01-05 21:10:38 -06:00
doneAt: z.date().nullable(),
assigneeUserId: z.string().ulid().nullable(),
})
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,
2024-01-05 13:22:56 -06:00
}
2024-01-05 21:10:38 -06:00
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 })