import { sql } from "drizzle-orm"; import { integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core"; import { users } from "./users.js"; import { mounts } from "./mounts.js"; export const mediaItems = sqliteTable( "media_items", { id: text("id") .primaryKey() .$defaultFn(() => crypto.randomUUID()), userId: text("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), mountId: text("mount_id").references(() => mounts.id, { onDelete: "set null" }), path: text("path").notNull(), rawName: text("raw_name").notNull(), title: text("title").notNull(), size: integer("size").notNull().default(0), mime: text("mime"), bangumiId: integer("bangumi_id"), epNumber: integer("ep_number"), scrapeStatus: text("scrape_status").notNull().default("pending"), scrapedAt: integer("scraped_at", { mode: "timestamp" }), posterUrl: text("poster_url"), matchedHash: text("matched_hash"), scannedAt: integer("scanned_at", { mode: "timestamp" }) .notNull() .default(sql`(unixepoch())`), updatedAt: integer("updated_at", { mode: "timestamp" }) .notNull() .default(sql`(unixepoch())`), }, (t) => [uniqueIndex("media_user_path_uq").on(t.userId, t.path)], ); export type MediaItem = typeof mediaItems.$inferSelect; export type NewMediaItem = typeof mediaItems.$inferInsert;