raqim / lib /db /src /schema /conversions.ts
RAQIM Deploy
Deploy RAQIM 2026-05-02 19:06
0e14acb
Raw
History Blame Contribute Delete
1.45 kB
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<unknown[]>().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;