import { createPentagon } from "https://deno.land/x/pentagon@v0.1.5/mod.ts"; import { project_root_dir } from "../utils.ts"; import { z } from "https://deno.land/x/zod@v3.21.4/mod.ts"; const kv = await Deno.openKv(project_root_dir() + "local/kv"); export type User = z.infer; export const user_model = z.object({ id: z.string().uuid().describe("primary"), name: z.string(), email: z.string(), password: z.string(), pfp_url: z.string(), like_set: z.set(z.string().uuid()), }); export type Post = z.infer; export const post_model = z.object({ id: z.string().uuid().describe("primary"), title: z.string(), content: z.string(), date: z.number(), like_count: z.number(), author_id: z.string().uuid(), }); export type Comment = z.infer; export const comment_model = z.object({ id: z.string().uuid().describe("primary"), date: z.number(), post_id: z.string().uuid(), author_id: z.string().uuid(), }); export const db = createPentagon(kv, { users: { schema: user_model, relations: { posts: ["posts", [post_model], "id", "author_id"], comments: ["comments", [comment_model], "id", "author_id"], }, }, posts: { schema: post_model, relations: { author: ["users", user_model, "author_id", "id"], comments: ["comments", [comment_model], "id", "post_id"], }, }, comments: { schema: comment_model, relations: { author: ["users", user_model, "author_id", "id"], post: ["post", post_model, "post_id", "id"], }, }, });