import { jsonb, pgEnum, pgTable, text, timestamp } from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; export interface SignatureFieldData { id: string; page: number; // 1-indexed x: number; // PDF user space, bottom-left origin, points y: number; // PDF user space, bottom-left origin, points width: number; // PDF points (default: 144 — 2 inches) height: number; // PDF points (default: 36 — 0.5 inches) } export const users = pgTable("users", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), email: text("email").notNull().unique(), passwordHash: text("password_hash").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), }); export const documentStatusEnum = pgEnum("document_status", [ "Draft", "Sent", "Viewed", "Signed", ]); export const clients = pgTable("clients", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), name: text("name").notNull(), email: text("email").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); export const formTemplates = pgTable("form_templates", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), name: text("name").notNull(), filename: text("filename").notNull().unique(), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); export const documents = pgTable("documents", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), name: text("name").notNull(), clientId: text("client_id") .notNull() .references(() => clients.id, { onDelete: "cascade" }), status: documentStatusEnum("status").notNull().default("Draft"), sentAt: timestamp("sent_at"), createdAt: timestamp("created_at").defaultNow().notNull(), formTemplateId: text("form_template_id").references(() => formTemplates.id), filePath: text("file_path"), signatureFields: jsonb("signature_fields").$type(), textFillData: jsonb("text_fill_data").$type>(), assignedClientId: text("assigned_client_id"), preparedFilePath: text("prepared_file_path"), /** Email addresses collected at prepare time: assigned client email + any CC addresses. */ emailAddresses: jsonb("email_addresses").$type(), }); export const documentsRelations = relations(documents, ({ one }) => ({ client: one(clients, { fields: [documents.clientId], references: [clients.id] }), })); export const clientsRelations = relations(clients, ({ many }) => ({ documents: many(documents), }));