63 lines
2.9 KiB
SQL
63 lines
2.9 KiB
SQL
-- Private beta data is isolated from the production materials tables.
|
|
CREATE TABLE "detail_generator_projects" (
|
|
"id" TEXT PRIMARY KEY,
|
|
"owner_id" TEXT NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
|
|
"document" JSONB NOT NULL,
|
|
"revision" INTEGER NOT NULL DEFAULT 1,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
"deleted_at" TIMESTAMPTZ,
|
|
CONSTRAINT "detail_generator_project_document_object" CHECK (jsonb_typeof("document") = 'object')
|
|
);
|
|
CREATE INDEX "detail_generator_projects_owner_updated_idx" ON "detail_generator_projects"("owner_id", "updated_at" DESC) WHERE "deleted_at" IS NULL;
|
|
|
|
CREATE TABLE "detail_generator_assets" (
|
|
"id" TEXT PRIMARY KEY,
|
|
"project_id" TEXT NOT NULL REFERENCES "detail_generator_projects"("id") ON DELETE CASCADE,
|
|
"owner_id" TEXT NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
|
|
"kind" TEXT NOT NULL CHECK ("kind" IN ('product', 'reference', 'document', 'logo', 'generated', 'export')),
|
|
"name" TEXT NOT NULL,
|
|
"mime_type" TEXT NOT NULL,
|
|
"storage_key" TEXT NOT NULL UNIQUE,
|
|
"byte_size" INTEGER NOT NULL CHECK ("byte_size" > 0),
|
|
"width" INTEGER,
|
|
"height" INTEGER,
|
|
"extracted_text" TEXT,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
CREATE INDEX "detail_generator_assets_project_idx" ON "detail_generator_assets"("project_id", "owner_id");
|
|
|
|
CREATE TABLE "detail_generator_jobs" (
|
|
"id" TEXT PRIMARY KEY,
|
|
"project_id" TEXT NOT NULL REFERENCES "detail_generator_projects"("id") ON DELETE CASCADE,
|
|
"owner_id" TEXT NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
|
|
"kind" TEXT NOT NULL CHECK ("kind" IN ('analyze', 'generate', 'regenerate', 'export')),
|
|
"status" TEXT NOT NULL DEFAULT 'queued' CHECK ("status" IN ('queued', 'running', 'succeeded', 'failed', 'unknown', 'cancelled')),
|
|
"idempotency_key" TEXT NOT NULL,
|
|
"fingerprint" TEXT NOT NULL,
|
|
"project_revision" INTEGER NOT NULL,
|
|
"payload" JSONB NOT NULL DEFAULT '{}',
|
|
"checkpoint" JSONB NOT NULL DEFAULT '{}',
|
|
"progress" INTEGER NOT NULL DEFAULT 0 CHECK ("progress" BETWEEN 0 AND 100),
|
|
"error" TEXT,
|
|
"request_id" TEXT,
|
|
"lease_token" TEXT,
|
|
"lease_expires_at" TIMESTAMPTZ,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
"started_at" TIMESTAMPTZ,
|
|
"completed_at" TIMESTAMPTZ,
|
|
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE("owner_id", "idempotency_key")
|
|
);
|
|
CREATE INDEX "detail_generator_jobs_claim_idx" ON "detail_generator_jobs"("status", "created_at");
|
|
CREATE INDEX "detail_generator_jobs_owner_status_idx" ON "detail_generator_jobs"("owner_id", "status");
|
|
CREATE INDEX "detail_generator_jobs_lease_idx" ON "detail_generator_jobs"("lease_expires_at") WHERE "status" = 'running';
|
|
|
|
CREATE TABLE "detail_generator_brand_profiles" (
|
|
"id" TEXT PRIMARY KEY,
|
|
"name" TEXT NOT NULL UNIQUE,
|
|
"profile" JSONB NOT NULL,
|
|
"revision" INTEGER NOT NULL DEFAULT 1,
|
|
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|