55 lines
1.5 KiB
TypeScript
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),
|
|
}));
|