import { relations } from "drizzle-orm"; import { integer, pgEnum, pgTable, text, timestamp, uuid, } from "drizzle-orm/pg-core"; import { user } from "./auth"; import { id, timestamps } from "./shared"; export const visibility = pgEnum("visibility", ["private", "public"]); export const timeline = pgTable("timeline", { ...id, ownerId: uuid("owner_id") .notNull() .references(() => user.id, { onDelete: "cascade" }), title: text("title").notNull(), visibility: visibility().notNull().default("public"), ...timestamps, }); export const timelineGroup = pgTable("timeline_group", { ...id, title: text("title").notNull(), sortOrder: integer().notNull().default(0), timelineId: uuid("timeline_id") .notNull() .references(() => timeline.id, { onDelete: "cascade" }), ...timestamps, }); export const timelineItem = pgTable("timeline_item", { ...id, timelineGroupId: uuid("timeline_group_id") .notNull() .references(() => timelineGroup.id, { onDelete: "cascade" }), title: text("title").notNull(), description: text("description").notNull().default(""), start: timestamp("start", { withTimezone: true }).notNull().defaultNow(), // Allow null to denote a event without duration end: timestamp("end", { withTimezone: true }), ...timestamps, }); export const timelineRelations = relations(timeline, ({ many }) => ({ groups: many(timelineGroup), })); export const groupRelations = relations(timelineGroup, ({ many }) => ({ items: many(timelineItem), }));