38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
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;
|