Add public catalog APIs, website slots, featured slots, and int category/product IDs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-09-27 18:30:36 +03:30
co-authored by Cursor
parent 15dd3597f0
commit 835c8a0ac1
25 changed files with 1399 additions and 41 deletions
@@ -0,0 +1,92 @@
-- Convert Category.id (cuid text) → serial integer; remap Product.categoryId + parentId.
ALTER TABLE "Product" DROP CONSTRAINT IF EXISTS "Product_categoryId_fkey";
ALTER TABLE "Category" DROP CONSTRAINT IF EXISTS "Category_parentId_fkey";
ALTER TABLE "Category" DROP CONSTRAINT IF EXISTS "Category_storeId_fkey";
DROP INDEX IF EXISTS "Category_storeId_idx";
DROP INDEX IF EXISTS "Category_parentId_idx";
DROP INDEX IF EXISTS "Category_sortOrder_idx";
DROP INDEX IF EXISTS "Product_categoryId_idx";
CREATE TABLE "_category_id_map" (
"old_id" TEXT PRIMARY KEY,
"new_id" INTEGER NOT NULL UNIQUE
);
INSERT INTO "_category_id_map" ("old_id", "new_id")
SELECT "id", ROW_NUMBER() OVER (ORDER BY "id")::INTEGER
FROM "Category";
CREATE TABLE "Category_new" (
"id" INTEGER NOT NULL,
"storeId" TEXT NOT NULL,
"parentId" INTEGER,
"nameFa" TEXT NOT NULL,
"nameEn" TEXT NOT NULL DEFAULT '',
"sortOrder" INTEGER NOT NULL DEFAULT 0,
"colors" TEXT[] DEFAULT ARRAY[]::TEXT[],
"sizes" TEXT[] DEFAULT ARRAY[]::TEXT[],
"packages" TEXT[] DEFAULT ARRAY[]::TEXT[],
"technicalFields" JSONB NOT NULL DEFAULT '[]',
CONSTRAINT "Category_new_pkey" PRIMARY KEY ("id")
);
INSERT INTO "Category_new" (
"id", "storeId", "parentId", "nameFa", "nameEn", "sortOrder",
"colors", "sizes", "packages", "technicalFields"
)
SELECT
m."new_id",
c."storeId",
mp."new_id",
c."nameFa",
c."nameEn",
c."sortOrder",
c."colors",
c."sizes",
c."packages",
COALESCE(c."technicalFields", '[]'::jsonb)
FROM "Category" c
JOIN "_category_id_map" m ON m."old_id" = c."id"
LEFT JOIN "_category_id_map" mp ON mp."old_id" = c."parentId";
ALTER TABLE "Product" ADD COLUMN "categoryId_new" INTEGER;
UPDATE "Product" AS p
SET "categoryId_new" = m."new_id"
FROM "_category_id_map" AS m
WHERE p."categoryId" = m."old_id";
ALTER TABLE "Product" DROP COLUMN "categoryId";
ALTER TABLE "Product" RENAME COLUMN "categoryId_new" TO "categoryId";
DROP TABLE "Category";
ALTER TABLE "Category_new" RENAME TO "Category";
ALTER TABLE "Category" RENAME CONSTRAINT "Category_new_pkey" TO "Category_pkey";
CREATE SEQUENCE "Category_id_seq" OWNED BY "Category"."id";
SELECT setval(
'"Category_id_seq"',
COALESCE((SELECT MAX("id") FROM "Category"), 1)
);
ALTER TABLE "Category" ALTER COLUMN "id" SET DEFAULT nextval('"Category_id_seq"');
CREATE INDEX "Category_storeId_idx" ON "Category"("storeId");
CREATE INDEX "Category_parentId_idx" ON "Category"("parentId");
CREATE INDEX "Category_sortOrder_idx" ON "Category"("sortOrder");
CREATE INDEX "Product_categoryId_idx" ON "Product"("categoryId");
ALTER TABLE "Category"
ADD CONSTRAINT "Category_storeId_fkey"
FOREIGN KEY ("storeId") REFERENCES "Store"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "Category"
ADD CONSTRAINT "Category_parentId_fkey"
FOREIGN KEY ("parentId") REFERENCES "Category"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "Product"
ADD CONSTRAINT "Product_categoryId_fkey"
FOREIGN KEY ("categoryId") REFERENCES "Category"("id") ON DELETE SET NULL ON UPDATE CASCADE;
DROP TABLE "_category_id_map";