-- Phase 8: Export. -- -- Der Auftrag steht in der Datenbank, nicht im Speicher eines Prozesses: das -- Rendern dauert, und ein Neustart des Web-Containers soll einen laufenden -- Export nicht spurlos verschlucken. CREATE TYPE "ExportKind" AS ENUM ('CASE', 'DOCUMENT', 'BUNDLE', 'DATABASE'); CREATE TYPE "ExportStatus" AS ENUM ( 'PENDING_APPROVAL', 'QUEUED', 'RUNNING', 'READY', 'FAILED', 'REJECTED' ); CREATE TABLE "ExportJob" ( "id" TEXT NOT NULL, "kind" "ExportKind" NOT NULL, "targetId" TEXT, "requestedById" TEXT NOT NULL, "clearanceAtTime" INTEGER NOT NULL, "status" "ExportStatus" NOT NULL DEFAULT 'QUEUED', "cacheKey" TEXT NOT NULL, "storageKey" TEXT, "sizeBytes" INTEGER, "error" TEXT, "approvedById" TEXT, "approvedAt" TIMESTAMP(3), "rejectedById" TEXT, "rejectReason" TEXT, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "startedAt" TIMESTAMP(3), "finishedAt" TIMESTAMP(3), CONSTRAINT "ExportJob_pkey" PRIMARY KEY ("id") ); CREATE INDEX "ExportJob_status_createdAt_idx" ON "ExportJob"("status", "createdAt"); CREATE INDEX "ExportJob_requestedById_createdAt_idx" ON "ExportJob"("requestedById", "createdAt" DESC); CREATE INDEX "ExportJob_cacheKey_status_idx" ON "ExportJob"("cacheKey", "status"); -- Ein Auftrag wird nie gelöscht: er ist der Beleg dafür, wer wann was -- ausgeleitet hat, und ergänzt das Zugriffsprotokoll um den Ausgang. CREATE RULE export_job_no_delete AS ON DELETE TO "ExportJob" DO INSTEAD NOTHING;