import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core"; import { sql } from "drizzle-orm"; import { usersTable } from "./users"; import { filesTable } from "./files"; export const CONVERSION_STATUSES = [ "queued", "analyzing", "routing", "ocr", "layout", "scoring", "merging", "cleanup", "done", "failed" ] as const; export type ConversionStatus = (typeof CONVERSION_STATUSES)[number]; export const conversionsTable = sqliteTable("conversions", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), fileId: text("file_id").notNull().references(() => filesTable.id, { onDelete: "cascade" }), userId: text("user_id").notNull().references(() => usersTable.id, { onDelete: "cascade" }), status: text("status", { enum: CONVERSION_STATUSES }).notNull().default("queued"), progress: integer("progress").notNull().default(0), steps: text("steps", { mode: "json" }).notNull().$type().default([]), pageStart: integer("page_start"), pageEnd: integer("page_end"), elapsedSeconds: integer("elapsed_seconds"), estimatedSeconds: integer("estimated_seconds"), errorMessage: text("error_message"), startedAt: integer("started_at", { mode: "timestamp_ms" }), completedAt: integer("completed_at", { mode: "timestamp_ms" }), createdAt: integer("created_at", { mode: "timestamp_ms" }).notNull().default(sql`(unixepoch() * 1000)`), }); export type Conversion = typeof conversionsTable.$inferSelect;