557 lines
22 KiB
TypeScript
557 lines
22 KiB
TypeScript
import { faker } from "@faker-js/faker";
|
||
import { Types } from "mongoose";
|
||
|
||
faker.locale = "fa";
|
||
import { CategoryThemeEnum } from "../../common/enums/category.enum";
|
||
import { Logger } from "../../core/logging/logger";
|
||
import { AttributeValueModel } from "../../modules/category/models/attributeValue.model";
|
||
import { CategoryModel } from "../../modules/category/models/category.model";
|
||
import { CategoryAttributeModel } from "../../modules/category/models/CategoryAttribute.model";
|
||
import { ColorModel } from "../../modules/category/models/color.model";
|
||
import { MeterageModel } from "../../modules/category/models/meterage.model";
|
||
import { SizeModel } from "../../modules/category/models/size.model";
|
||
|
||
interface ICategorySeed {
|
||
title_fa: string;
|
||
title_en: string;
|
||
icon: string;
|
||
imageUrl: string;
|
||
description: string;
|
||
leaf: boolean;
|
||
theme?: CategoryThemeEnum;
|
||
parent?: Types.ObjectId;
|
||
}
|
||
|
||
interface ICategoryAttributeSeed {
|
||
title: string;
|
||
hint?: string;
|
||
type: string;
|
||
multiple: boolean;
|
||
required: boolean;
|
||
}
|
||
|
||
const rootCategories: ICategorySeed[] = [
|
||
{
|
||
title_fa: "موبایل و تبلت",
|
||
icon: "mobile",
|
||
imageUrl: faker.image.imageUrl(),
|
||
description: "لوازم جانبی",
|
||
title_en: "mobile",
|
||
leaf: false,
|
||
},
|
||
{
|
||
title_fa: "لوازم تحریر و اداری",
|
||
icon: "stationery",
|
||
description: "انواع لوازم تحریر و اداری",
|
||
title_en: "stationery-office",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "برق و الکتریکی",
|
||
icon: "electric",
|
||
description: "لوازم برق و الکتریکی",
|
||
title_en: "electric-electrical",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "لوازم و ابزارآلات",
|
||
icon: "tools",
|
||
description: "انواع لوازم و ابزارآلات",
|
||
title_en: "tools-equipment",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "صوت و تصویر",
|
||
icon: "audio-visual",
|
||
description: "انواع لوازم صوتی و تصویری",
|
||
title_en: "audio-visual",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "کامپیوتر",
|
||
icon: "computer",
|
||
description: "انواع کامپیوتر و لوازم جانبی",
|
||
title_en: "computer",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "کنسول بازی",
|
||
icon: "console",
|
||
description: "انواع کنسول بازی و لوازم جانبی",
|
||
title_en: "game-console",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "ورزش و سفر",
|
||
icon: "sports",
|
||
description: "لوازم ورزشی و سفر",
|
||
title_en: "sports-travel",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{ title_fa: "پوشاک و مد", icon: "fashion", description: "لباس و مد", title_en: "fashion", leaf: false, imageUrl: faker.image.imageUrl() },
|
||
{
|
||
title_fa: "لوازم خانگی",
|
||
icon: "home-appliances",
|
||
description: "لوازم خانه",
|
||
title_en: "home-appliances",
|
||
leaf: false,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "متفرقه",
|
||
icon: "malicious",
|
||
description: "متفرقه",
|
||
title_en: "malicious",
|
||
leaf: true,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
];
|
||
|
||
const subcategories: { [key: string]: ICategorySeed[] } = {
|
||
"موبایل و تبلت": [
|
||
{
|
||
title_fa: "گوشی موبایل",
|
||
icon: "phone",
|
||
description: "انواع گوشی های موبایل",
|
||
title_en: "mobile-phones",
|
||
leaf: true,
|
||
imageUrl: faker.image.imageUrl(),
|
||
theme: CategoryThemeEnum.Colored,
|
||
},
|
||
{
|
||
title_fa: "تبلت",
|
||
icon: "tablet",
|
||
description: "انواع تبلت ها",
|
||
title_en: "tablets",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Colored,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "ساعت هوشمند",
|
||
icon: "watch",
|
||
description: "انواع ساعت هوشمند",
|
||
title_en: "smart-watch",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Colored,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "پاور بانک",
|
||
icon: "watch",
|
||
description: "انواع پاور بانک",
|
||
title_en: "power-banks",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"لوازم تحریر و اداری": [
|
||
{
|
||
title_fa: "خودکار و خودنویس",
|
||
icon: "pen",
|
||
description: "انواع خودکار و خودنویس",
|
||
title_en: "pens",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Colored,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "دفتر و کاغذ",
|
||
icon: "paper",
|
||
description: "انواع دفتر و کاغذ",
|
||
title_en: "paper-notebooks",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Colored,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"برق و الکتریکی": [
|
||
{
|
||
title_fa: "لامپ",
|
||
icon: "bulb",
|
||
description: "انواع لامپ ها",
|
||
title_en: "bulbs",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "کابل و سیم",
|
||
icon: "cable",
|
||
description: "انواع کابل و سیم",
|
||
title_en: "cables-wires",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"لوازم و ابزارآلات": [
|
||
{
|
||
title_fa: "آچار و پیچ گوشتی",
|
||
icon: "wrench",
|
||
description: "انواع آچار و پیچ گوشتی",
|
||
title_en: "wrenches-screwdrivers",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "دریل",
|
||
icon: "drill",
|
||
description: "انواع دریل ها",
|
||
title_en: "drills",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"صوت و تصویر": [
|
||
{
|
||
title_fa: "تلویزیون",
|
||
icon: "tv",
|
||
description: "انواع تلویزیون",
|
||
title_en: "televisions",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "اسپیکر",
|
||
icon: "speaker",
|
||
description: "انواع اسپیکر",
|
||
title_en: "speakers",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "هدفون",
|
||
icon: "headphone",
|
||
description: "انواع هدفون",
|
||
title_en: "headphones",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Colored,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "دوربین عکاسی",
|
||
icon: "camera",
|
||
description: "انواع دوربین عکاسی",
|
||
title_en: "cameras",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
کامپیوتر: [
|
||
{
|
||
title_fa: "لپ تاپ",
|
||
icon: "laptop",
|
||
description: "انواع لپ تاپ",
|
||
title_en: "laptops",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "موس و کیبورد",
|
||
icon: "mouse-keyboard",
|
||
description: "انواع موس و کیبورد",
|
||
title_en: "mouse-keyboards",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"کنسول بازی": [
|
||
{
|
||
title_fa: "پلی استیشن",
|
||
icon: "playstation",
|
||
description: "انواع پلی استیشن",
|
||
title_en: "playstations",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "ایکس باکس",
|
||
icon: "xbox",
|
||
description: "انواع ایکس باکس",
|
||
title_en: "xbox",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"ورزش و سفر": [
|
||
{
|
||
title_fa: "تجهیزات ورزشی",
|
||
icon: "sports-equipment",
|
||
description: "انواع تجهیزات ورزشی",
|
||
title_en: "sports-equipment",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "لوازم سفر",
|
||
icon: "travel",
|
||
description: "انواع لوازم سفر",
|
||
title_en: "travel-equipment",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"پوشاک و مد": [
|
||
{
|
||
title_fa: "لباس زنانه",
|
||
icon: "women-clothing",
|
||
description: "انواع لباس زنانه",
|
||
title_en: "women-clothing",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "لباس مردانه",
|
||
icon: "men-clothing",
|
||
description: "انواع لباس مردانه",
|
||
title_en: "men-clothing",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.Sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
"لوازم خانگی": [
|
||
{
|
||
title_fa: "لوازم آشپزخانه",
|
||
icon: "kitchen-appliances",
|
||
description: "انواع لوازم آشپزخانه",
|
||
title_en: "kitchen-appliances",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
{
|
||
title_fa: "لوازم نظافت",
|
||
icon: "cleaning-appliances",
|
||
description: "انواع لوازم نظافت",
|
||
title_en: "cleaning-appliances",
|
||
leaf: true,
|
||
theme: CategoryThemeEnum.No_color_No_sized,
|
||
imageUrl: faker.image.imageUrl(),
|
||
},
|
||
],
|
||
};
|
||
|
||
const categoryAttributesMap: { [key: string]: ICategoryAttributeSeed[] } = {
|
||
"گوشی موبایل": [
|
||
{ title: "باتری", hint: "ظرفیت باتری", type: "select", multiple: false, required: true },
|
||
{ title: "دوربین", hint: "کیفیت دوربین", type: "select", multiple: false, required: true },
|
||
{ title: "سیستم عامل", hint: "نوع سیستم عامل", type: "select", multiple: false, required: true },
|
||
{ title: "حافظه داخلی موبایل", hint: "ظرفیت حافظه", type: "select", multiple: false, required: true },
|
||
{ title: "پشتیبانی از 5G", hint: "آیا پشتیبانی میکند؟", type: "checkbox", multiple: false, required: false },
|
||
],
|
||
تبلت: [
|
||
{ title: "اندازه صفحه تبلت", hint: "اینچ", type: "select", multiple: false, required: true },
|
||
{ title: "پردازنده تبلت", hint: "نوع پردازنده", type: "select", multiple: false, required: true },
|
||
{ title: "دوربین جلو", hint: "کیفیت دوربین جلو", type: "select", multiple: false, required: false },
|
||
{ title: "ظرفیت باتری", hint: "میلیآمپر ساعت", type: "select", multiple: false, required: true },
|
||
{ title: "اتصال به شبکه", hint: "نوع شبکه", type: "select", multiple: false, required: false },
|
||
],
|
||
"خودکار و خودنویس": [
|
||
{ title: "نوع جوهر", hint: "جوهر مورد استفاده", type: "select", multiple: false, required: true },
|
||
{ title: "ضخامت نوشتاری", hint: "ضخامت نوک", type: "select", multiple: false, required: true },
|
||
{ title: "قابلیت شارژ مجدد", hint: "آیا قابل شارژ است؟", type: "checkbox", multiple: false, required: false },
|
||
{ title: "جنس بدنه خودکار", hint: "جنس بدنه خودکار", type: "select", multiple: false, required: true },
|
||
{ title: "رنگ جوهر", hint: "رنگ جوهر خودکار", type: "select", multiple: false, required: true },
|
||
],
|
||
لامپ: [
|
||
{ title: "نوع لامپ", hint: "نوع لامپ (LED، هالوژن و غیره)", type: "select", multiple: false, required: true },
|
||
{ title: "توان مصرفی لامپ", hint: "وات", type: "select", multiple: false, required: true },
|
||
{ title: "رنگ نور", hint: "رنگ نور", type: "select", multiple: false, required: true },
|
||
{ title: "طول عمر", hint: "ساعت", type: "select", multiple: false, required: true },
|
||
{ title: "قابلیت تنظیم شدت نور", hint: "آیا قابل تنظیم است؟", type: "checkbox", multiple: false, required: false },
|
||
],
|
||
تلویزیون: [
|
||
{ title: "اندازه صفحه تلویزیون", hint: "اینچ", type: "select", multiple: false, required: true },
|
||
{ title: "رزولوشن", hint: "کیفیت تصویر", type: "select", multiple: false, required: true },
|
||
{ title: "نوع صفحه", hint: "LED, OLED, QLED", type: "select", multiple: false, required: true },
|
||
{ title: "هوشمند", hint: "آیا هوشمند است؟", type: "checkbox", multiple: false, required: false },
|
||
{ title: "درگاههای ارتباطی", hint: "نوع و تعداد درگاهها", type: "select", multiple: true, required: true },
|
||
],
|
||
"لپ تاپ": [
|
||
{ title: "پردازنده لپ تاپ", hint: "نوع پردازنده", type: "select", multiple: false, required: true },
|
||
{ title: "حافظه رم", hint: "ظرفیت حافظه رم", type: "select", multiple: false, required: true },
|
||
{ title: "حافظه داخلی", hint: "ظرفیت حافظه", type: "select", multiple: false, required: true },
|
||
{ title: "اندازه صفحه", hint: "اینچ", type: "select", multiple: false, required: true },
|
||
{ title: "کارت گرافیک", hint: "نوع کارت گرافیک", type: "select", multiple: false, required: true },
|
||
],
|
||
"لباس زنانه": [
|
||
{ title: "جنس پارچه", hint: "نوع پارچه", type: "select", multiple: false, required: true },
|
||
{ title: "نوع یقه", hint: "یقه لباس", type: "select", multiple: false, required: true },
|
||
{ title: "نوع آستین", hint: "آستین لباس", type: "select", multiple: false, required: true },
|
||
{ title: "مدل لباس", hint: "نوع و مدل لباس", type: "select", multiple: false, required: true },
|
||
{ title: "نوع شستشو", hint: "نحوه شستشو", type: "select", multiple: false, required: false },
|
||
],
|
||
"لوازم آشپزخانه": [
|
||
{ title: "توان مصرفی", hint: "توان لوازم برقی", type: "select", multiple: false, required: true },
|
||
{ title: "جنس بدنه", hint: "جنس بدنه دستگاه", type: "select", multiple: false, required: true },
|
||
{ title: "ظرفیت", hint: "ظرفیت دستگاه", type: "select", multiple: false, required: true },
|
||
{ title: "قابلیت تنظیم", hint: "آیا قابلیت تنظیم دارد؟", type: "checkbox", multiple: false, required: false },
|
||
{ title: "نوع کاربری", hint: "کاربری دستگاه", type: "select", multiple: false, required: true },
|
||
],
|
||
// Add more categories as needed
|
||
};
|
||
|
||
const attributeValuesMap: { [key: string]: string[] } = {
|
||
باتری: ["3000mAh", "4000mAh", "5000mAh", "6000mAh", "7000mAh"],
|
||
دوربین: ["12MP", "16MP", "20MP", "48MP", "108MP"],
|
||
"سیستم عامل": ["اندروید", "iOS", "ویندوز", "لینوکس", "سایر"],
|
||
"حافظه داخلی موبایل": ["32GB", "64GB", "128GB", "256GB", "512GB"],
|
||
"پشتیبانی از 5G": ["بله", "خیر"],
|
||
"اندازه صفحه تبلت": ["7 اینچ", "10 اینچ", "13 اینچ", "15 اینچ", "17 اینچ"],
|
||
"پردازنده تبلت": ["Intel", "AMD", "Apple M1", "Qualcomm", "MediaTek"],
|
||
"دوربین جلو": ["5MP", "8MP", "12MP", "16MP", "20MP"],
|
||
"ظرفیت باتری": ["2000mAh", "3000mAh", "4000mAh", "5000mAh", "6000mAh"],
|
||
"اتصال به شبکه": ["WiFi", "4G", "5G", "Ethernet", "بلوتوث"],
|
||
"نوع جوهر": ["ژل", "روغنی", "آبی", "خودکار", "پلاستیکی"],
|
||
"ضخامت نوشتاری": ["0.5mm", "0.7mm", "1.0mm", "1.2mm", "1.5mm"],
|
||
"قابلیت شارژ مجدد": ["بله", "خیر"],
|
||
"جنس بدنه خودکار": ["فلز", "پلاستیک", "چوب", "سرامیک", "کربن"],
|
||
"رنگ جوهر": ["مشکی", "آبی", "قرمز", "سبز", "بنفش"],
|
||
"نوع لامپ": ["LED", "هالوژن", "فلورسنت", "رشتهای", "پلاسما"],
|
||
"توان مصرفی لامپ": ["5W", "10W", "15W", "20W", "25W"],
|
||
"رنگ نور": ["سفید", "زرد", "آبی", "سبز", "قرمز"],
|
||
"طول عمر": ["1000 ساعت", "5000 ساعت", "10000 ساعت", "20000 ساعت", "50000 ساعت"],
|
||
"قابلیت تنظیم شدت نور": ["بله", "خیر"],
|
||
"اندازه صفحه تلویزیون": ["20 اینچ", "32 اینچ", "40 اینچ", "60 اینچ", "70 اینچ"],
|
||
رزولوشن: ["720p", "1080p", "4K", "8K", "HDR"],
|
||
"نوع صفحه": ["LED", "OLED", "QLED", "Plasma", "LCD"],
|
||
هوشمند: ["بله", "خیر"],
|
||
"درگاههای ارتباطی": ["HDMI", "USB", "Bluetooth", "WiFi", "Ethernet"],
|
||
"پردازنده لپ تاپ": ["Intel", "AMD", "Apple M1", "Qualcomm", "Apple M2"],
|
||
"حافظه رم": ["4GB", "8GB", "16GB", "32GB", "64GB"],
|
||
"حافظه داخلی": ["128GB", "256GB", "512GB", "1TB"],
|
||
"اندازه صفحه": ["14 اینچ", "12 اینچ", "16 اینچ"],
|
||
"کارت گرافیک": ["NVIDIA", "AMD", "Intel", "Apple M1", "ARM Mali"],
|
||
"جنس پارچه": ["پنبه", "پلیاستر", "نایلون", "ریون", "کتان"],
|
||
"نوع یقه": ["گرد", "هفت", "ایستاده", "دکمهای", "یقه اسکی"],
|
||
"نوع آستین": ["کوتاه", "بلند", "سهربع", "بیآستین", "کشباف"],
|
||
"مدل لباس": ["تیشرت", "پیراهن", "ژاکت", "هودی", "پلیور"],
|
||
"نوع شستشو": ["ماشینی", "دستی", "خشکشویی", "آب سرد", "آب گرم"],
|
||
"توان مصرفی": ["150W", "200W", "400W"],
|
||
"جنس بدنه": ["فلز", "پلاستیک", "چوب", "سرامیک", "کربن"],
|
||
ظرفیت: ["1 لیتر", "2 لیتر", "3 لیتر", "4 لیتر", "5 لیتر"],
|
||
"قابلیت تنظیم": ["بله", "خیر"],
|
||
"نوع کاربری": ["آبمیوهگیری", "مخلوطکن", "آسیاب", "کبابپز", "زودپز"],
|
||
// Add more attributes and their values as needed
|
||
};
|
||
|
||
export const seedCategories = async (logger: Logger) => {
|
||
try {
|
||
logger.info("Categories seeding started");
|
||
|
||
const colors = (await ColorModel.find()).map((color) => color._id);
|
||
const sizes = (await SizeModel.find()).map((size) => size._id);
|
||
const meterages = (await MeterageModel.find()).map((meterage) => meterage._id);
|
||
|
||
const createdCategories: { [key: string]: Types.ObjectId } = {};
|
||
const createdSubCategories: { [key: string]: Types.ObjectId } = {};
|
||
|
||
// Create root categories
|
||
for (const category of rootCategories) {
|
||
const { title_fa, icon, description, title_en, leaf, imageUrl } = category;
|
||
|
||
const rootCategory = new CategoryModel({ title_fa, icon, title_en, description, leaf, imageUrl });
|
||
await rootCategory.save();
|
||
|
||
createdCategories[title_fa] = rootCategory._id;
|
||
}
|
||
|
||
// Create subcategories
|
||
for (const [rootName, subs] of Object.entries(subcategories)) {
|
||
const parentId = createdCategories[rootName];
|
||
if (parentId) {
|
||
for (const subcategory of subs) {
|
||
const { title_fa, icon, description, title_en, leaf, theme, imageUrl } = subcategory;
|
||
|
||
const catVariants =
|
||
theme === CategoryThemeEnum.Colored
|
||
? [...colors]
|
||
: theme === CategoryThemeEnum.Meterage
|
||
? [...meterages]
|
||
: theme === CategoryThemeEnum.Sized
|
||
? [...sizes]
|
||
: [];
|
||
|
||
const subCategoryDoc = new CategoryModel({
|
||
title_fa,
|
||
icon,
|
||
imageUrl,
|
||
title_en,
|
||
description,
|
||
leaf,
|
||
theme,
|
||
variants: catVariants,
|
||
parent: parentId,
|
||
});
|
||
await subCategoryDoc.save();
|
||
|
||
// Save the subcategory ID for later use
|
||
createdSubCategories[title_fa] = subCategoryDoc._id;
|
||
}
|
||
}
|
||
}
|
||
|
||
const createdAttributes: { [key: string]: number } = {};
|
||
|
||
// Generate attributes for each subcategory
|
||
for (const [subcategoryTitle, attributes] of Object.entries(categoryAttributesMap)) {
|
||
const subcategoryId = createdSubCategories[subcategoryTitle];
|
||
if (subcategoryId) {
|
||
for (const attr of attributes) {
|
||
const attributeDoc = new CategoryAttributeModel({
|
||
category: subcategoryId,
|
||
title: attr.title,
|
||
hint: attr.hint,
|
||
type: attr.type,
|
||
multiple: attr.multiple,
|
||
required: attr.required,
|
||
});
|
||
await attributeDoc.save();
|
||
createdAttributes[attr.title] = attributeDoc._id;
|
||
}
|
||
} else {
|
||
logger.warn(`Subcategory '${subcategoryTitle}' not found.`);
|
||
}
|
||
}
|
||
// Generate values for each attribute
|
||
for (const [attributeTitle, attributeId] of Object.entries(createdAttributes)) {
|
||
const values = attributeValuesMap[attributeTitle] || [];
|
||
|
||
for (const valueText of values) {
|
||
await AttributeValueModel.create({
|
||
attribute: attributeId,
|
||
text: valueText,
|
||
});
|
||
|
||
// await valueDoc.save();
|
||
}
|
||
}
|
||
|
||
logger.info("Categories, subcategories, attributes, and values seeded successfully");
|
||
} catch (error) {
|
||
logger.error("Error seeding categories:", error);
|
||
}
|
||
};
|