-- CreateEnum CREATE TYPE "AppStatus" AS ENUM ('ACTIVE', 'READY', 'DISABLED'); -- CreateEnum CREATE TYPE "ComponentType" AS ENUM ('ELECTRON', 'CONTAINER', 'STATIC_WEB', 'DATABASE', 'MIGRATION'); -- CreateEnum CREATE TYPE "JobStatus" AS ENUM ('PENDING', 'RUNNING', 'SUCCEEDED', 'FAILED', 'CANCELED'); -- CreateTable CREATE TABLE "apps" ( "id" UUID NOT NULL, "key" TEXT NOT NULL, "name" TEXT NOT NULL, "description" TEXT, "namespace" TEXT, "status" "AppStatus" NOT NULL DEFAULT 'READY', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "apps_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "app_components" ( "id" UUID NOT NULL, "app_id" UUID NOT NULL, "name" TEXT NOT NULL, "type" "ComponentType" NOT NULL, "repository" TEXT, "branch" TEXT, "build_target" TEXT, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "app_components_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "build_jobs" ( "id" UUID NOT NULL, "component_id" UUID NOT NULL, "branch" TEXT NOT NULL, "commit_sha" TEXT, "artifact" TEXT, "image" TEXT, "status" "JobStatus" NOT NULL DEFAULT 'PENDING', "logs" TEXT, "started_at" TIMESTAMPTZ(3), "finished_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "build_jobs_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "app_releases" ( "id" UUID NOT NULL, "app_id" UUID NOT NULL, "version" TEXT NOT NULL, "branch" TEXT NOT NULL, "commit_sha" TEXT, "artifact" TEXT, "image_tags" JSONB, "status" "JobStatus" NOT NULL DEFAULT 'PENDING', "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "app_releases_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "deployment_jobs" ( "id" UUID NOT NULL, "app_id" UUID NOT NULL, "release_id" UUID, "environment" TEXT NOT NULL, "namespace" TEXT NOT NULL, "status" "JobStatus" NOT NULL DEFAULT 'PENDING', "requested_by" TEXT, "logs" TEXT, "started_at" TIMESTAMPTZ(3), "finished_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "deployment_jobs_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "notices" ( "id" UUID NOT NULL, "scope" TEXT NOT NULL, "title" TEXT NOT NULL, "body" TEXT NOT NULL, "audience" TEXT NOT NULL, "is_active" BOOLEAN NOT NULL DEFAULT true, "starts_at" TIMESTAMPTZ(3), "ends_at" TIMESTAMPTZ(3), "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "notices_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "apps_key_key" ON "apps"("key"); -- CreateIndex CREATE UNIQUE INDEX "app_components_app_id_name_key" ON "app_components"("app_id", "name"); -- CreateIndex CREATE INDEX "build_jobs_component_id_created_at_idx" ON "build_jobs"("component_id", "created_at"); -- CreateIndex CREATE UNIQUE INDEX "app_releases_app_id_version_key" ON "app_releases"("app_id", "version"); -- CreateIndex CREATE INDEX "deployment_jobs_app_id_created_at_idx" ON "deployment_jobs"("app_id", "created_at"); -- CreateIndex CREATE INDEX "notices_scope_is_active_idx" ON "notices"("scope", "is_active"); -- AddForeignKey ALTER TABLE "app_components" ADD CONSTRAINT "app_components_app_id_fkey" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "build_jobs" ADD CONSTRAINT "build_jobs_component_id_fkey" FOREIGN KEY ("component_id") REFERENCES "app_components"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "app_releases" ADD CONSTRAINT "app_releases_app_id_fkey" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "deployment_jobs" ADD CONSTRAINT "deployment_jobs_app_id_fkey" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "deployment_jobs" ADD CONSTRAINT "deployment_jobs_release_id_fkey" FOREIGN KEY ("release_id") REFERENCES "app_releases"("id") ON DELETE SET NULL ON UPDATE CASCADE;