Files

155 lines
5.4 KiB
SQL

-- Convert Product.id (cuid text) → serial integer; remap ProductVariant + OrderItem FKs.
ALTER TABLE "ProductVariant" DROP CONSTRAINT IF EXISTS "ProductVariant_productId_fkey";
ALTER TABLE "OrderItem" DROP CONSTRAINT IF EXISTS "OrderItem_productId_fkey";
ALTER TABLE "Product" DROP CONSTRAINT IF EXISTS "Product_storeId_fkey";
ALTER TABLE "Product" DROP CONSTRAINT IF EXISTS "Product_categoryId_fkey";
ALTER TABLE "Product" DROP CONSTRAINT IF EXISTS "Product_brandId_fkey";
DROP INDEX IF EXISTS "Product_storeId_idx";
DROP INDEX IF EXISTS "Product_categoryId_idx";
DROP INDEX IF EXISTS "Product_brandId_idx";
DROP INDEX IF EXISTS "Product_price_idx";
DROP INDEX IF EXISTS "Product_published_idx";
DROP INDEX IF EXISTS "Product_featuredSlot_idx";
DROP INDEX IF EXISTS "Product_vipEnabled_idx";
DROP INDEX IF EXISTS "Product_vipOnly_idx";
DROP INDEX IF EXISTS "ProductVariant_productId_idx";
DROP INDEX IF EXISTS "OrderItem_productId_idx";
CREATE TABLE "_product_id_map" (
"old_id" TEXT PRIMARY KEY,
"new_id" INTEGER NOT NULL UNIQUE
);
INSERT INTO "_product_id_map" ("old_id", "new_id")
SELECT "id", ROW_NUMBER() OVER (ORDER BY "createdAt", "id")::INTEGER
FROM "Product";
CREATE TABLE "Product_new" (
"id" INTEGER NOT NULL,
"storeId" TEXT NOT NULL,
"categoryId" INTEGER,
"brandId" TEXT,
"nameFa" TEXT NOT NULL,
"nameEn" TEXT NOT NULL DEFAULT '',
"summary" TEXT NOT NULL DEFAULT '',
"description" TEXT NOT NULL DEFAULT '',
"price" INTEGER NOT NULL DEFAULT 0,
"discountPrice" INTEGER,
"imageUrl" TEXT,
"imageKey" TEXT,
"galleryUrls" TEXT[] DEFAULT ARRAY[]::TEXT[],
"galleryKeys" TEXT[] DEFAULT ARRAY[]::TEXT[],
"tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
"published" BOOLEAN NOT NULL DEFAULT true,
"featuredSlot" TEXT,
"vipEnabled" BOOLEAN NOT NULL DEFAULT false,
"vipOnly" BOOLEAN NOT NULL DEFAULT false,
"vipSpecialPrice" BOOLEAN NOT NULL DEFAULT false,
"vipPrice" INTEGER,
"technicalData" JSONB NOT NULL DEFAULT '{}',
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Product_new_pkey" PRIMARY KEY ("id")
);
INSERT INTO "Product_new" (
"id", "storeId", "categoryId", "brandId", "nameFa", "nameEn", "summary", "description",
"price", "discountPrice", "imageUrl", "imageKey", "galleryUrls", "galleryKeys", "tags",
"published", "featuredSlot", "vipEnabled", "vipOnly", "vipSpecialPrice", "vipPrice",
"technicalData", "createdAt", "updatedAt"
)
SELECT
m."new_id",
p."storeId",
p."categoryId",
p."brandId",
p."nameFa",
p."nameEn",
p."summary",
p."description",
p."price",
p."discountPrice",
p."imageUrl",
p."imageKey",
p."galleryUrls",
p."galleryKeys",
p."tags",
p."published",
p."featuredSlot",
p."vipEnabled",
p."vipOnly",
p."vipSpecialPrice",
p."vipPrice",
COALESCE(p."technicalData", '{}'::jsonb),
p."createdAt",
p."updatedAt"
FROM "Product" p
JOIN "_product_id_map" m ON m."old_id" = p."id";
ALTER TABLE "ProductVariant" ADD COLUMN "productId_new" INTEGER;
UPDATE "ProductVariant" AS v
SET "productId_new" = m."new_id"
FROM "_product_id_map" AS m
WHERE v."productId" = m."old_id";
ALTER TABLE "ProductVariant" DROP COLUMN "productId";
ALTER TABLE "ProductVariant" RENAME COLUMN "productId_new" TO "productId";
ALTER TABLE "ProductVariant" ALTER COLUMN "productId" SET NOT NULL;
ALTER TABLE "OrderItem" ADD COLUMN "productId_new" INTEGER;
UPDATE "OrderItem" AS oi
SET "productId_new" = m."new_id"
FROM "_product_id_map" AS m
WHERE oi."productId" = m."old_id";
ALTER TABLE "OrderItem" DROP COLUMN "productId";
ALTER TABLE "OrderItem" RENAME COLUMN "productId_new" TO "productId";
DROP TABLE "Product";
ALTER TABLE "Product_new" RENAME TO "Product";
ALTER TABLE "Product" RENAME CONSTRAINT "Product_new_pkey" TO "Product_pkey";
CREATE SEQUENCE "Product_id_seq" OWNED BY "Product"."id";
SELECT setval(
'"Product_id_seq"',
COALESCE((SELECT MAX("id") FROM "Product"), 1)
);
ALTER TABLE "Product" ALTER COLUMN "id" SET DEFAULT nextval('"Product_id_seq"');
CREATE INDEX "Product_storeId_idx" ON "Product"("storeId");
CREATE INDEX "Product_categoryId_idx" ON "Product"("categoryId");
CREATE INDEX "Product_brandId_idx" ON "Product"("brandId");
CREATE INDEX "Product_price_idx" ON "Product"("price");
CREATE INDEX "Product_published_idx" ON "Product"("published");
CREATE INDEX "Product_featuredSlot_idx" ON "Product"("featuredSlot");
CREATE INDEX "Product_vipEnabled_idx" ON "Product"("vipEnabled");
CREATE INDEX "Product_vipOnly_idx" ON "Product"("vipOnly");
CREATE INDEX "ProductVariant_productId_idx" ON "ProductVariant"("productId");
CREATE INDEX "OrderItem_productId_idx" ON "OrderItem"("productId");
ALTER TABLE "Product"
ADD CONSTRAINT "Product_storeId_fkey"
FOREIGN KEY ("storeId") REFERENCES "Store"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "Product"
ADD CONSTRAINT "Product_categoryId_fkey"
FOREIGN KEY ("categoryId") REFERENCES "Category"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "Product"
ADD CONSTRAINT "Product_brandId_fkey"
FOREIGN KEY ("brandId") REFERENCES "Brand"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "ProductVariant"
ADD CONSTRAINT "ProductVariant_productId_fkey"
FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "OrderItem"
ADD CONSTRAINT "OrderItem_productId_fkey"
FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE SET NULL ON UPDATE CASCADE;
DROP TABLE "_product_id_map";