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()
);