diff --git a/apps/api/prisma/migrations/20261025120000_seed_iran_cities/migration.sql b/apps/api/prisma/migrations/20261025120000_seed_iran_cities/migration.sql index c5a7150..5a5993f 100644 --- a/apps/api/prisma/migrations/20261025120000_seed_iran_cities/migration.sql +++ b/apps/api/prisma/migrations/20261025120000_seed_iran_cities/migration.sql @@ -5,29 +5,6 @@ INSERT INTO "City" ("id", "name", "parentId") VALUES ('city-iran', 'ایران', NULL) ON CONFLICT ("id") DO NOTHING; --- If rows with 'city-tehran', etc. exist and have child relations, re-link them before cleanup -DO $$ -BEGIN - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-tehran') THEN - UPDATE "Customer" SET "cityId" = 'prov-e9dedb90e02298da' WHERE "cityId" = 'city-tehran'; - UPDATE "Branch" SET "cityId" = 'prov-e9dedb90e02298da' WHERE "cityId" = 'city-tehran'; - DELETE FROM "City" WHERE "id" = 'city-tehran'; - END IF; - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-mashhad') THEN - UPDATE "Customer" SET "cityId" = 'prov-e10485d2d3377704' WHERE "cityId" = 'city-mashhad'; - UPDATE "Branch" SET "cityId" = 'prov-e10485d2d3377704' WHERE "cityId" = 'city-mashhad'; - DELETE FROM "City" WHERE "id" = 'city-mashhad'; - END IF; - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-isfahan') THEN - UPDATE "Customer" SET "cityId" = 'prov-4bb74d0dee027e26' WHERE "cityId" = 'city-isfahan'; - DELETE FROM "City" WHERE "id" = 'city-isfahan'; - END IF; - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-tabriz') THEN - UPDATE "Customer" SET "cityId" = 'prov-368ec488a60e1e68' WHERE "cityId" = 'city-tabriz'; - DELETE FROM "City" WHERE "id" = 'city-tabriz'; - END IF; -END $$; - -- Strip any existing 'استان ' prefix UPDATE "City" SET "name" = regexp_replace("name", '^استان\s+', '') @@ -157,6 +134,43 @@ INSERT INTO "City" ("id", "name", "parentId") SELECT 'prov-8eafb7340d3dfe31', 'یزد', 'city-iran' WHERE NOT EXISTS (SELECT 1 FROM "City" WHERE "name" = 'یزد'); +-- Legacy demo cities (city-tehran, ...) are folded into their province. This +-- runs after the province inserts and the prefix strip so the target exists, +-- and the target is looked up by name under 'city-iran' rather than assumed: +-- when a legacy row already carried the province's name the 'prov-*' insert +-- above was skipped, and the province is then e.g. 'city-prov-tehran'. +-- Every table with a City foreign key is re-pointed before the delete. +DO $$ +DECLARE + m RECORD; + t TEXT; + target TEXT; +BEGIN + FOR m IN + SELECT * FROM (VALUES + ('city-tehran', 'تهران'), + ('city-mashhad', 'خراسان رضوی'), + ('city-isfahan', 'اصفهان'), + ('city-tabriz', 'آذربایجان شرقی') + ) AS v(legacy_id, province_name) + LOOP + IF NOT EXISTS (SELECT 1 FROM "City" WHERE "id" = m.legacy_id) THEN + CONTINUE; + END IF; + SELECT "id" INTO target FROM "City" + WHERE "name" = m.province_name AND "parentId" = 'city-iran' AND "id" <> m.legacy_id + ORDER BY "id" LIMIT 1; + IF target IS NULL THEN + CONTINUE; + END IF; + FOREACH t IN ARRAY ARRAY['Customer', 'CustomerAddress', 'Branch', 'PreOrder', 'SalesExpertProfile'] + LOOP + EXECUTE format('UPDATE %I SET "cityId" = %L WHERE "cityId" = %L', t, target, m.legacy_id); + END LOOP; + DELETE FROM "City" WHERE "id" = m.legacy_id; + END LOOP; +END $$; + UPDATE "City" SET "parentId" = 'city-iran' WHERE "parentId" IS NULL AND "id" <> 'city-iran'; diff --git a/apps/api/release/migrations/20261025120000_seed_iran_cities/migration.sql b/apps/api/release/migrations/20261025120000_seed_iran_cities/migration.sql index c5a7150..5a5993f 100644 --- a/apps/api/release/migrations/20261025120000_seed_iran_cities/migration.sql +++ b/apps/api/release/migrations/20261025120000_seed_iran_cities/migration.sql @@ -5,29 +5,6 @@ INSERT INTO "City" ("id", "name", "parentId") VALUES ('city-iran', 'ایران', NULL) ON CONFLICT ("id") DO NOTHING; --- If rows with 'city-tehran', etc. exist and have child relations, re-link them before cleanup -DO $$ -BEGIN - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-tehran') THEN - UPDATE "Customer" SET "cityId" = 'prov-e9dedb90e02298da' WHERE "cityId" = 'city-tehran'; - UPDATE "Branch" SET "cityId" = 'prov-e9dedb90e02298da' WHERE "cityId" = 'city-tehran'; - DELETE FROM "City" WHERE "id" = 'city-tehran'; - END IF; - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-mashhad') THEN - UPDATE "Customer" SET "cityId" = 'prov-e10485d2d3377704' WHERE "cityId" = 'city-mashhad'; - UPDATE "Branch" SET "cityId" = 'prov-e10485d2d3377704' WHERE "cityId" = 'city-mashhad'; - DELETE FROM "City" WHERE "id" = 'city-mashhad'; - END IF; - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-isfahan') THEN - UPDATE "Customer" SET "cityId" = 'prov-4bb74d0dee027e26' WHERE "cityId" = 'city-isfahan'; - DELETE FROM "City" WHERE "id" = 'city-isfahan'; - END IF; - IF EXISTS (SELECT 1 FROM "City" WHERE "id" = 'city-tabriz') THEN - UPDATE "Customer" SET "cityId" = 'prov-368ec488a60e1e68' WHERE "cityId" = 'city-tabriz'; - DELETE FROM "City" WHERE "id" = 'city-tabriz'; - END IF; -END $$; - -- Strip any existing 'استان ' prefix UPDATE "City" SET "name" = regexp_replace("name", '^استان\s+', '') @@ -157,6 +134,43 @@ INSERT INTO "City" ("id", "name", "parentId") SELECT 'prov-8eafb7340d3dfe31', 'یزد', 'city-iran' WHERE NOT EXISTS (SELECT 1 FROM "City" WHERE "name" = 'یزد'); +-- Legacy demo cities (city-tehran, ...) are folded into their province. This +-- runs after the province inserts and the prefix strip so the target exists, +-- and the target is looked up by name under 'city-iran' rather than assumed: +-- when a legacy row already carried the province's name the 'prov-*' insert +-- above was skipped, and the province is then e.g. 'city-prov-tehran'. +-- Every table with a City foreign key is re-pointed before the delete. +DO $$ +DECLARE + m RECORD; + t TEXT; + target TEXT; +BEGIN + FOR m IN + SELECT * FROM (VALUES + ('city-tehran', 'تهران'), + ('city-mashhad', 'خراسان رضوی'), + ('city-isfahan', 'اصفهان'), + ('city-tabriz', 'آذربایجان شرقی') + ) AS v(legacy_id, province_name) + LOOP + IF NOT EXISTS (SELECT 1 FROM "City" WHERE "id" = m.legacy_id) THEN + CONTINUE; + END IF; + SELECT "id" INTO target FROM "City" + WHERE "name" = m.province_name AND "parentId" = 'city-iran' AND "id" <> m.legacy_id + ORDER BY "id" LIMIT 1; + IF target IS NULL THEN + CONTINUE; + END IF; + FOREACH t IN ARRAY ARRAY['Customer', 'CustomerAddress', 'Branch', 'PreOrder', 'SalesExpertProfile'] + LOOP + EXECUTE format('UPDATE %I SET "cityId" = %L WHERE "cityId" = %L', t, target, m.legacy_id); + END LOOP; + DELETE FROM "City" WHERE "id" = m.legacy_id; + END LOOP; +END $$; + UPDATE "City" SET "parentId" = 'city-iran' WHERE "parentId" IS NULL AND "id" <> 'city-iran';