import { index, integer, sqliteTable, text, uniqueIndex, type AnySQLiteColumn, } from "drizzle-orm/sqlite-core"; import { users } from "./auth"; export const posts = sqliteTable( "posts", { id: integer().primaryKey(), userId: integer("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), title: text().notNull(), slug: text().notNull(), bodyMarkdown: text("body_markdown").notNull(), excerpt: text().notNull(), coverUrl: text("cover_url"), tagsJson: text("tags_json").notNull().default("[]"), publishedAt: integer("published_at", { mode: "timestamp_ms" }), visibility: text().notNull().default("private"), shareToken: text("share_token"), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() .$onUpdate(() => new Date()) .notNull(), }, (table) => [uniqueIndex("posts_user_id_slug_unique").on(table.userId, table.slug)], ); export const timelineEvents = sqliteTable("timeline_events", { id: integer().primaryKey(), userId: integer("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), occurredOn: integer("occurred_on", { mode: "timestamp_ms" }).notNull(), title: text().notNull(), bodyMarkdown: text("body_markdown"), linkUrl: text("link_url"), visibility: text().notNull().default("private"), shareToken: text("share_token"), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() .$onUpdate(() => new Date()) .notNull(), }); export const postComments = sqliteTable( "post_comments", { id: integer().primaryKey(), postId: integer("post_id") .notNull() .references(() => posts.id, { onDelete: "cascade" }), parentId: integer("parent_id").references((): AnySQLiteColumn => postComments.id), authorUserId: integer("author_user_id").references(() => users.id, { onDelete: "set null" }), guestDisplayName: text("guest_display_name"), body: text().notNull(), kind: text().notNull(), deletedAt: integer("deleted_at", { mode: "timestamp_ms" }), deletedByUserId: integer("deleted_by_user_id").references(() => users.id, { onDelete: "set null", }), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() .$onUpdate(() => new Date()) .notNull(), }, (table) => [ index("post_comments_post_id_idx").on(table.postId), index("post_comments_parent_id_idx").on(table.parentId), ], );