60 lines
1.2 KiB
TypeScript
60 lines
1.2 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()
|
|
|
|
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(),
|
|
|
|
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,
|
|
}
|
|
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 })
|