From 355d4afaa2095dfb4e0f43360a828a6ec33b2971 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Tue, 27 Jan 2026 15:38:48 +0330 Subject: [PATCH] attribute seeder --- src/modules/order/providers/order.service.ts | 4 +-- src/seeders/DatabaseSeeder.ts | 15 ++++++++-- src/seeders/attribute-value.seeder.ts | 30 ++++++++++++++++++++ src/seeders/attribute.seeder.ts | 28 ++++++++++++++++++ src/seeders/data/attribute-value.data.ts | 27 ++++++++++++++++++ src/seeders/data/attribute.data.ts | 29 +++++++++++++++++++ src/seeders/product.seeder.ts | 3 -- 7 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 src/seeders/attribute-value.seeder.ts create mode 100644 src/seeders/attribute.seeder.ts create mode 100644 src/seeders/data/attribute-value.data.ts create mode 100644 src/seeders/data/attribute.data.ts diff --git a/src/modules/order/providers/order.service.ts b/src/modules/order/providers/order.service.ts index aa0fa53..d56a396 100644 --- a/src/modules/order/providers/order.service.ts +++ b/src/modules/order/providers/order.service.ts @@ -279,7 +279,7 @@ export class OrderService { } async updateStatus(orderId: string, newStatus: OrderStatusEnum) { - + const order = await this.findOrderOrFail(orderId) order.status = newStatus @@ -344,7 +344,7 @@ export class OrderService { em.persist(order) for (const item of items) { - const product = products.find(p => Number(p.id) === item.productId) + const product = products.find(p => Number(p.id) === Number(item.productId)) if (!product) { throw new BadRequestException("Product not found!") diff --git a/src/seeders/DatabaseSeeder.ts b/src/seeders/DatabaseSeeder.ts index 38a80b5..d499d7e 100644 --- a/src/seeders/DatabaseSeeder.ts +++ b/src/seeders/DatabaseSeeder.ts @@ -6,6 +6,8 @@ import { ProductsSeeder } from './product.seeder'; import { AdminsSeeder } from './admins.seeder'; import { UsersSeeder } from './users.seeder'; import { CategoriesSeeder } from './categories.seeder'; +import { AttributesSeeder } from './attribute.seeder'; +import { AttributeValueSeeder } from './attribute-value.seeder'; // import { NotificationsSeeder } from './notifications.seeder'; @@ -32,7 +34,7 @@ export class DatabaseSeeder extends Seeder { const categoriesSeeder = new CategoriesSeeder(); const categoriesMap = await categoriesSeeder.run(em); console.info(`[Seeder] Step 8/${TOTAL_STEPS}: Done`); - + // 9. Create products console.info(`[Seeder] Step 9/${TOTAL_STEPS}: Creating products`); @@ -40,8 +42,17 @@ export class DatabaseSeeder extends Seeder { await productsSeeder.run(em, categoriesMap); console.info(`[Seeder] Step 9/${TOTAL_STEPS}: Done`); + // 10. Create products + console.info(`[Seeder] Step 9/${TOTAL_STEPS}: Creating attributes`); + const attributesSeeder = new AttributesSeeder(); + await attributesSeeder.run(em); + console.info(`[Seeder] Step 9/${TOTAL_STEPS}: Done`); - + // 11. Create products + console.info(`[Seeder] Step 10/${TOTAL_STEPS}: Creating attributes`); + const attributesValueSeeder = new AttributeValueSeeder(); + await attributesValueSeeder.run(em); + console.info(`[Seeder] Step 11/${TOTAL_STEPS}: Done`); // 12. Create Admins console.info(`[Seeder] Step 12/${TOTAL_STEPS}: Creating admins`); diff --git a/src/seeders/attribute-value.seeder.ts b/src/seeders/attribute-value.seeder.ts new file mode 100644 index 0000000..f16338a --- /dev/null +++ b/src/seeders/attribute-value.seeder.ts @@ -0,0 +1,30 @@ +import type { EntityManager } from '@mikro-orm/core'; +import { Attribute } from 'src/modules/product/entities/attribute.entity'; +import { attributeValueData } from './data/attribute-value.data'; +import { AttributeValue } from 'src/modules/product/entities/attribute-value.entity'; + +export class AttributeValueSeeder { + async run( + em: EntityManager, + + ): Promise { + const attributes = await em.findAll(Attribute) + for (const attr of attributes) { + + const attrValues = attributeValueData.filter(a => a.attributeName === attr.name) + + for (const av of attrValues) { + + const a= em.create(AttributeValue, { + value: av.value, + attribute: attr + }); + + em.persist(a) + } + + } + + await em.flush(); + } +} diff --git a/src/seeders/attribute.seeder.ts b/src/seeders/attribute.seeder.ts new file mode 100644 index 0000000..846653c --- /dev/null +++ b/src/seeders/attribute.seeder.ts @@ -0,0 +1,28 @@ +import type { EntityManager } from '@mikro-orm/core'; +import { Product } from '../modules/product/entities/product.entity'; +import { attributeData } from './data/attribute.data'; +import { Attribute } from 'src/modules/product/entities/attribute.entity'; + +export class AttributesSeeder { + async run( + em: EntityManager, + + ): Promise { + const products = await em.findAll(Product) + for (const product of products) { + for (const attrData of attributeData) { + const attr = em.create(Attribute, { + name: attrData.name, + type: attrData.type, + isRequired: attrData.isRequired, + order: 1, + product + }); + + em.persist(attr); + } + } + + await em.flush(); + } +} diff --git a/src/seeders/data/attribute-value.data.ts b/src/seeders/data/attribute-value.data.ts new file mode 100644 index 0000000..eb27b0f --- /dev/null +++ b/src/seeders/data/attribute-value.data.ts @@ -0,0 +1,27 @@ +import { FieldType } from "src/modules/print/interface/print"; + +export interface AttributeValueData { + value: string; + attributeName: string +} + +export const attributeValueData: AttributeValueData[] = [ + { + attributeName: 'گراماژ کاغذ', + value: '70', + + }, + { + attributeName: 'گراماژ کاغذ', + value: '80', + + }, + { + attributeName: 'رنگ', + value: 'آبی', + }, + { + attributeName: 'رنگ', + value: 'قرمز', + }, +] diff --git a/src/seeders/data/attribute.data.ts b/src/seeders/data/attribute.data.ts new file mode 100644 index 0000000..85f1d48 --- /dev/null +++ b/src/seeders/data/attribute.data.ts @@ -0,0 +1,29 @@ +import { FieldType } from "src/modules/print/interface/print"; + +export interface AttributeData { + + + name: string; + isRequired: boolean; + type: FieldType, +} + +export const attributeData: AttributeData[] = [ + + + { + name: 'گراماژ کاغذ', + type: FieldType.radio, + isRequired: true, + }, + { + name: 'رنگ', + type: FieldType.select, + isRequired: true, + }, + { + name: 'ویژگی نوشتنی', + type: FieldType.text, + isRequired: true, + }, +] diff --git a/src/seeders/product.seeder.ts b/src/seeders/product.seeder.ts index d0eba8e..7d67cd3 100644 --- a/src/seeders/product.seeder.ts +++ b/src/seeders/product.seeder.ts @@ -12,15 +12,12 @@ export class ProductsSeeder { const key = `${productData.categoryTitle}`; - const normalize = (s: string) => (s || '').replace(/\s+/g, ' ').trim(); - let category = categoriesMap.get(key); if (!category) { return } - const product = em.create(Product, { title: productData.title, desc: productData.desc,