From f0504c9dc0fe3d38ddb843de5c7e9cc88f6376df Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 27 Apr 2026 12:02:21 +0800 Subject: [PATCH] fix(migration): make migration idempotent and auto-resolve failed state on deploy Co-Authored-By: Claude Sonnet 4.6 --- docker-entrypoint.sh | 4 + .../migration.sql | 88 ++++++++++++++----- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index e0b6e6bc..33a4402d 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -3,6 +3,10 @@ set -e echo "🔄 Running database migrations..." cd /app + +# Resolve any previously failed migrations before re-applying +bunx prisma migrate resolve --rolled-back 20260423072135_add_stok_to_pasar_desa 2>/dev/null || true + bunx prisma migrate deploy || { echo "❌ Migration failed!" exit 1 diff --git a/prisma/migrations/20260423072135_add_stok_to_pasar_desa/migration.sql b/prisma/migrations/20260423072135_add_stok_to_pasar_desa/migration.sql index 3fe9282a..4f6ff75d 100644 --- a/prisma/migrations/20260423072135_add_stok_to_pasar_desa/migration.sql +++ b/prisma/migrations/20260423072135_add_stok_to_pasar_desa/migration.sql @@ -5,33 +5,75 @@ - Added the required column `umkmId` to the `PasarDesa` table without a default value. This is not possible if the table is not empty. */ --- DropForeignKey -ALTER TABLE "PenjualanProduk" DROP CONSTRAINT "PenjualanProduk_produkId_fkey"; +-- DropForeignKey (idempotent) +ALTER TABLE "PenjualanProduk" DROP CONSTRAINT IF EXISTS "PenjualanProduk_produkId_fkey"; +ALTER TABLE "ProdukUmkm" DROP CONSTRAINT IF EXISTS "ProdukUmkm_imageId_fkey"; +ALTER TABLE "ProdukUmkm" DROP CONSTRAINT IF EXISTS "ProdukUmkm_umkmId_fkey"; --- DropForeignKey -ALTER TABLE "ProdukUmkm" DROP CONSTRAINT "ProdukUmkm_imageId_fkey"; +-- AlterTable KategoriProduk (idempotent via DO block) +DO $$ +BEGIN + BEGIN + ALTER TABLE "KategoriProduk" ALTER COLUMN "deletedAt" DROP NOT NULL; + EXCEPTION WHEN others THEN NULL; + END; + BEGIN + ALTER TABLE "KategoriProduk" ALTER COLUMN "deletedAt" DROP DEFAULT; + EXCEPTION WHEN others THEN NULL; + END; +END $$; --- DropForeignKey -ALTER TABLE "ProdukUmkm" DROP CONSTRAINT "ProdukUmkm_umkmId_fkey"; +-- AlterTable PasarDesa: add columns if not exists, handle NOT NULL safely +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'PasarDesa' AND column_name = 'stok' + ) THEN + ALTER TABLE "PasarDesa" ADD COLUMN "stok" INTEGER NOT NULL DEFAULT 0; + END IF; --- AlterTable -ALTER TABLE "KategoriProduk" ALTER COLUMN "deletedAt" DROP NOT NULL, -ALTER COLUMN "deletedAt" DROP DEFAULT; + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'PasarDesa' AND column_name = 'umkmId' + ) THEN + ALTER TABLE "PasarDesa" ADD COLUMN "umkmId" TEXT; + END IF; +END $$; --- AlterTable -ALTER TABLE "PasarDesa" ADD COLUMN "stok" INTEGER NOT NULL DEFAULT 0, -ADD COLUMN "umkmId" TEXT NOT NULL, -ALTER COLUMN "rating" SET DEFAULT 0, -ALTER COLUMN "alamatUsaha" DROP NOT NULL, -ALTER COLUMN "deletedAt" DROP NOT NULL, -ALTER COLUMN "deletedAt" DROP DEFAULT, -ALTER COLUMN "kontak" DROP NOT NULL; +-- Set default value for existing rows before making NOT NULL +UPDATE "PasarDesa" SET "umkmId" = '' WHERE "umkmId" IS NULL; +ALTER TABLE "PasarDesa" ALTER COLUMN "umkmId" SET NOT NULL; --- DropTable -DROP TABLE "ProdukUmkm"; +-- Remaining PasarDesa alterations (idempotent) +DO $$ +BEGIN + BEGIN ALTER TABLE "PasarDesa" ALTER COLUMN "rating" SET DEFAULT 0; EXCEPTION WHEN others THEN NULL; END; + BEGIN ALTER TABLE "PasarDesa" ALTER COLUMN "alamatUsaha" DROP NOT NULL; EXCEPTION WHEN others THEN NULL; END; + BEGIN ALTER TABLE "PasarDesa" ALTER COLUMN "deletedAt" DROP NOT NULL; EXCEPTION WHEN others THEN NULL; END; + BEGIN ALTER TABLE "PasarDesa" ALTER COLUMN "deletedAt" DROP DEFAULT; EXCEPTION WHEN others THEN NULL; END; + BEGIN ALTER TABLE "PasarDesa" ALTER COLUMN "kontak" DROP NOT NULL; EXCEPTION WHEN others THEN NULL; END; +END $$; --- AddForeignKey -ALTER TABLE "PasarDesa" ADD CONSTRAINT "PasarDesa_umkmId_fkey" FOREIGN KEY ("umkmId") REFERENCES "Umkm"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- DropTable (idempotent) +DROP TABLE IF EXISTS "ProdukUmkm"; --- AddForeignKey -ALTER TABLE "PenjualanProduk" ADD CONSTRAINT "PenjualanProduk_produkId_fkey" FOREIGN KEY ("produkId") REFERENCES "PasarDesa"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey (idempotent) +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE constraint_name = 'PasarDesa_umkmId_fkey' + ) THEN + ALTER TABLE "PasarDesa" ADD CONSTRAINT "PasarDesa_umkmId_fkey" + FOREIGN KEY ("umkmId") REFERENCES "Umkm"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; + + IF NOT EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE constraint_name = 'PenjualanProduk_produkId_fkey' + ) THEN + ALTER TABLE "PenjualanProduk" ADD CONSTRAINT "PenjualanProduk_produkId_fkey" + FOREIGN KEY ("produkId") REFERENCES "PasarDesa"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + END IF; +END $$;