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
+130
View File
@@ -0,0 +1,130 @@
/**
* Add subcategories under remaining women categories + men clothes.
* Run: npx tsx scripts/fill-category-children.ts
*/
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const SUBS: Record<string, Array<[string, string]>> = {
// پالتو و کت
cmujwdqxd0001q9g7gbkdzp90: [
["پالتو بلند", "Long Coat"],
["کت کوتاه", "Short Coat"],
["پالتو فوتر", "Wool Coat"],
],
// پیراهن
cmujwdqxh0003q9g7ywj3xtkg: [
["پیراهن کوتاه", "Short Dress"],
["پیراهن بلند", "Long Dress"],
["پیراهن مجلسی", "Party Dress"],
],
// شومیز
cmujwdqxj0005q9g7dmrujmar: [
["شومیز رسمی", "Formal Blouse"],
["شومیز روزانه", "Casual Blouse"],
["شومیز آستین کوتاه", "Short Sleeve"],
],
// تی‌شرت
cmujwdqxl0007q9g72fa9i1u6: [
["تی‌شرت ساده", "Basic Tee"],
["تی‌شرت طرح‌دار", "Printed Tee"],
["تی‌شرت یقه‌دار", "Collar Tee"],
],
// دامن
cmujwdqxm0009q9g7dygpixfl: [
["دامن کوتاه", "Mini Skirt"],
["دامن متوسط", "Midi Skirt"],
["دامن بلند", "Maxi Skirt"],
],
// لباس مجلسی
cmujwdqxn000bq9g769r3oaq2: [
["شب", "Evening"],
["عروس", "Bridal"],
["مهمانی", "Party"],
],
// کت و شلوار
cmujwdqxo000dq9g7syqycf39: [
["رسمی", "Formal"],
["نیمه‌رسمی", "Semi Formal"],
["کت تک", "Blazer"],
],
// کیف
cmujwdqxp000fq9g7pww4264v: [
["کیف دستی", "Handbag"],
["کیف دوشی", "Shoulder Bag"],
["کیف پول", "Wallet"],
],
// عینک
cmujwdqxq000hq9g7hsyx1c6p: [
["آفتابی", "Sunglasses"],
["طبی", "Optical"],
],
// جوراب
cmujwdqxr000jq9g7kesb73gy: [
["کوتاه", "Ankle"],
["بلند", "Knee High"],
["ورزشی", "Sport"],
],
};
const MEN_ID = "cmtrlp2zu000dqmyewzr566tk";
const MEN_CHILDREN: Array<[string, string]> = [
["پیراهن", "Shirt"],
["شلوار", "Pants"],
["کت", "Jacket"],
["تی‌شرت", "T-Shirt"],
["کت و شلوار", "Suit"],
];
async function ensureChild(
storeId: string,
parentId: string,
nameFa: string,
nameEn: string,
sortOrder: number,
) {
const existing = await prisma.category.findFirst({
where: { storeId, parentId, nameFa },
});
if (existing) {
return prisma.category.update({
where: { id: existing.id },
data: { nameEn, sortOrder },
});
}
return prisma.category.create({
data: { storeId, parentId, nameFa, nameEn, sortOrder },
});
}
async function main() {
for (const [parentId, children] of Object.entries(SUBS)) {
const parent = await prisma.category.findUnique({ where: { id: parentId } });
if (!parent) {
console.warn("skip missing", parentId);
continue;
}
for (let i = 0; i < children.length; i++) {
const [nameFa, nameEn] = children[i]!;
await ensureChild(parent.storeId, parentId, nameFa, nameEn, i);
}
console.log(`${parent.nameFa}: +${children.length}`);
}
const men = await prisma.category.findUnique({ where: { id: MEN_ID } });
if (men) {
for (let i = 0; i < MEN_CHILDREN.length; i++) {
const [nameFa, nameEn] = MEN_CHILDREN[i]!;
await ensureChild(men.storeId, MEN_ID, nameFa, nameEn, i);
}
console.log(`لباس مردانه: +${MEN_CHILDREN.length}`);
}
}
main()
.catch((err) => {
console.error(err);
process.exit(1);
})
.finally(() => prisma.$disconnect());