// https://www.drawdb.app/ is ultra-useful for designing schemas. import { int, sqliteTable, text } from "drizzle-orm/sqlite-core"; import * as t from "drizzle-orm/sqlite-core"; import { defineRelations, sql } from 'drizzle-orm'; export const users = sqliteTable("users", { id: int().primaryKey({ autoIncrement: true }), uuid: text().$defaultFn(() => Bun.randomUUIDv7()), email: text().notNull().unique(), password: text().notNull(), role: t.text().$type<"user" | "admin">().default("user").notNull(), }); export const blogs = sqliteTable("blogs", { id: int().primaryKey({ autoIncrement: true }), user_id: int().notNull().references(() => users.id, { onDelete: 'cascade' }), uuid: text().$defaultFn(() => Bun.randomUUIDv7()), title: text().notNull(), description: text().notNull(), subdomain: text().notNull().unique(), }); export const posts = sqliteTable("posts", { id: int().primaryKey({ autoIncrement: true }), uuid: text().$defaultFn(() => Bun.randomUUIDv7()), blog_id: int().notNull().references(() => blogs.id, { onDelete: 'cascade' }), title: text().notNull(), content: t.text().notNull(), published_at: t.integer({ mode: "timestamp" }), updated_at: t.integer({ mode: "timestamp" }), }); export const sessions = sqliteTable("sessions", { id: int().primaryKey({ autoIncrement: true }), user_id: int().notNull().references(() => users.id, { onDelete: 'cascade' }), token: text().notNull().$defaultFn(() => Bun.randomUUIDv7()), issued_at: int({ mode: 'timestamp' }).default(sql`(unixepoch())`).notNull(), }); export const relations = defineRelations({ users, blogs, posts, sessions }, (r) => ({ users: { blogs: r.many.blogs(), sessions: r.many.sessions() }, blogs: { author: r.one.users({ from: r.blogs.user_id, to: r.users.id }), posts: r.many.posts(), }, posts: { blog: r.one.blogs({ from: r.posts.blog_id, to: r.blogs.id, }), }, sessions: { user: r.one.users({ from: r.sessions.user_id, to: r.users.id }), } }));