Files
zendegi/packages/db/src/schema/timeline.ts
2026-02-22 18:41:44 +01:00

55 lines
1.5 KiB
TypeScript

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),
}));