From 38c64c4caa9a0e5287a042641de6d9003a749dfb Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 5 Feb 2026 11:02:28 +0330 Subject: [PATCH] update seeder --- .../admin/controllers/admin.controller.ts | 2 +- src/modules/admin/providers/admin.service.ts | 20 ++++-- src/seeders/DatabaseSeeder.ts | 23 ++++--- src/seeders/attribute-value.seeder.ts | 28 --------- src/seeders/attribute.seeder.ts | 28 --------- ....data.ts => product-field-options.data.ts} | 0 ...ttribute.data.ts => product-field.data.ts} | 2 +- src/seeders/data/roles.data.ts | 21 +++++++ src/seeders/data/user-addresses.data.ts | 63 ------------------- src/seeders/field-options.seeder.ts | 31 +++++++++ src/seeders/product-fields.seeder.ts | 33 ++++++++++ 11 files changed, 114 insertions(+), 137 deletions(-) delete mode 100644 src/seeders/attribute-value.seeder.ts delete mode 100644 src/seeders/attribute.seeder.ts rename src/seeders/data/{attribute-value.data.ts => product-field-options.data.ts} (100%) rename src/seeders/data/{attribute.data.ts => product-field.data.ts} (89%) delete mode 100644 src/seeders/data/user-addresses.data.ts create mode 100644 src/seeders/field-options.seeder.ts create mode 100644 src/seeders/product-fields.seeder.ts diff --git a/src/modules/admin/controllers/admin.controller.ts b/src/modules/admin/controllers/admin.controller.ts index 7f6ebbf..f933811 100644 --- a/src/modules/admin/controllers/admin.controller.ts +++ b/src/modules/admin/controllers/admin.controller.ts @@ -59,7 +59,7 @@ export class AdminController { @ApiOperation({ summary: 'Delete an admin by ID' }) @ApiParam({ name: 'id', description: 'Admin ID' }) deleteById(@Param('adminId') adminId: string,): Promise { - return this.adminService.remove(adminId,); + return this.adminService.softDelete(adminId,); } } diff --git a/src/modules/admin/providers/admin.service.ts b/src/modules/admin/providers/admin.service.ts index 4156fce..685cf1a 100644 --- a/src/modules/admin/providers/admin.service.ts +++ b/src/modules/admin/providers/admin.service.ts @@ -23,13 +23,22 @@ export class AdminService { const normalizedPhone = normalizePhone(phone); - const exist = await this.adminRepository.findOne({ + const currentAdmin = await this.adminRepository.findOne({ phone: normalizedPhone, }); - if (exist) { + + if (currentAdmin && !currentAdmin.deletedAt) { throw new BadRequestException('This phone number is already used'); } + //TODO : test admins that were delted + // re-register deleted admin + if (currentAdmin && currentAdmin.deletedAt) { + currentAdmin.deletedAt = undefined + await this.em.flush() + return currentAdmin + } + const role = await this.roleRepository.findOne({ id: roleId }) if (!role) { throw new BadRequestException('Role not found'); @@ -127,14 +136,13 @@ export class AdminService { return admin; } - async remove(adminId: string): Promise { + async softDelete(adminId: string): Promise { const admin = await this.adminRepository.findOne({ id: adminId }); if (!admin) { throw new NotFoundException('Admin role not found'); } - // admin.deletedAt=new Date() - // TODO :L is this correct to soft delete - return this.em.removeAndFlush(admin); + admin.deletedAt = new Date() + return this.em.flush(); } async findOrFail(adminId: string) { diff --git a/src/seeders/DatabaseSeeder.ts b/src/seeders/DatabaseSeeder.ts index 2b2154e..0473f25 100644 --- a/src/seeders/DatabaseSeeder.ts +++ b/src/seeders/DatabaseSeeder.ts @@ -6,6 +6,9 @@ import { ProductsSeeder } from './product.seeder'; import { AdminsSeeder } from './admins.seeder'; import { UsersSeeder } from './users.seeder'; import { CategoriesSeeder } from './categories.seeder'; +import { ProductsFieldsSeeder } from './product-fields.seeder'; +import { FieldOption } from 'src/modules/form-builder/entities/field-option.entity'; +import { FieldOptionSeeder } from './field-options.seeder'; // import { AttributesSeeder } from './attribute.seeder'; // import { AttributeValueSeeder } from './attribute-value.seeder'; @@ -42,17 +45,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`); + // 10. Create product Fields + console.info(`[Seeder] Step 9/${TOTAL_STEPS}: Creating product fields`); + const productFieldsSeeder = new ProductsFieldsSeeder(); + await productFieldsSeeder.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`); + // 11. Create product Field Options + console.info(`[Seeder] Step 10/${TOTAL_STEPS}: Creating fields options`); + const fieldOptionsSeeder = new FieldOptionSeeder(); + await fieldOptionsSeeder.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 deleted file mode 100644 index bb0749c..0000000 --- a/src/seeders/attribute-value.seeder.ts +++ /dev/null @@ -1,28 +0,0 @@ -// import type { EntityManager } from '@mikro-orm/core'; -// import { attributeValueData } from './data/attribute-value.data'; - -// 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 deleted file mode 100644 index 97b9673..0000000 --- a/src/seeders/attribute.seeder.ts +++ /dev/null @@ -1,28 +0,0 @@ -// 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/product-field-options.data.ts similarity index 100% rename from src/seeders/data/attribute-value.data.ts rename to src/seeders/data/product-field-options.data.ts diff --git a/src/seeders/data/attribute.data.ts b/src/seeders/data/product-field.data.ts similarity index 89% rename from src/seeders/data/attribute.data.ts rename to src/seeders/data/product-field.data.ts index ff0cd29..27a0b5b 100644 --- a/src/seeders/data/attribute.data.ts +++ b/src/seeders/data/product-field.data.ts @@ -8,7 +8,7 @@ export interface AttributeData { type: FieldType, } -export const attributeData: AttributeData[] = [ +export const fieldsDataData: AttributeData[] = [ { diff --git a/src/seeders/data/roles.data.ts b/src/seeders/data/roles.data.ts index 4e43711..968e626 100644 --- a/src/seeders/data/roles.data.ts +++ b/src/seeders/data/roles.data.ts @@ -15,4 +15,25 @@ export const rolesData: RoleConfig[] = [ permissionFilter: (name: PermissionEnum) => true }, + { + name: 'admin', + title: 'مدیر داخلی', + isSystem: true, + permissionFilter: (name: PermissionEnum) => name !==PermissionEnum.MANAGE_ROLES + }, + + { + name: 'accountant', + title: 'حسابدار', + isSystem: true, + permissionFilter: (name: PermissionEnum) => name==PermissionEnum.MANAGE_PAYMENTS + }, + + { + name: 'designer', + title: 'طراح', + isSystem: true, + permissionFilter: (name: PermissionEnum) => [PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS].includes(name) + }, + ]; diff --git a/src/seeders/data/user-addresses.data.ts b/src/seeders/data/user-addresses.data.ts deleted file mode 100644 index c5404da..0000000 --- a/src/seeders/data/user-addresses.data.ts +++ /dev/null @@ -1,63 +0,0 @@ -export interface UserAddressData { - userPhone: string; - title: string; - address: string; - city: string; - province?: string; - postalCode?: string; - latitude: number; - longitude: number; - phone?: string; - isDefault: boolean; -} - -export const userAddressesData: UserAddressData[] = [ - { - userPhone: '09362532122', - title: 'خانه', - address: 'خیابان ولیعصر، پلاک 123', - city: 'تهران', - province: 'تهران', - postalCode: '1234567890', - latitude: 35.6892, - longitude: 51.389, - phone: '09362532122', - isDefault: true, - }, - { - userPhone: '09185290775', - title: 'خانه', - address: 'خیابان انقلاب، پلاک 456', - city: 'تهران', - province: 'تهران', - postalCode: '1234567891', - latitude: 35.69, - longitude: 51.39, - phone: '09185290775', - isDefault: true, - }, - { - userPhone: '09129283395', - title: 'خانه', - address: 'خیابان آزادی، پلاک 789', - city: 'تهران', - province: 'تهران', - postalCode: '1234567892', - latitude: 35.691, - longitude: 51.391, - phone: '09129283395', - isDefault: true, - }, - { - userPhone: '09184317567', - title: 'خانه', - address: 'خیابان جمهوری، پلاک 321', - city: 'تهران', - province: 'تهران', - postalCode: '1234567893', - latitude: 35.692, - longitude: 51.392, - phone: '09184317567', - isDefault: true, - }, -]; diff --git a/src/seeders/field-options.seeder.ts b/src/seeders/field-options.seeder.ts new file mode 100644 index 0000000..22d7a86 --- /dev/null +++ b/src/seeders/field-options.seeder.ts @@ -0,0 +1,31 @@ +import type { EntityManager } from '@mikro-orm/core'; + import { attributeValueData } from './data/product-field-options.data'; +import { Field } from 'src/modules/form-builder/entities/field.entity'; +import { FieldOption } from 'src/modules/form-builder/entities/field-option.entity'; + +export class FieldOptionSeeder { + async run( + em: EntityManager, + + ): Promise { + const fields = await em.findAll(Field) + + for (const field of fields) { + + const fieldOptions = attributeValueData.filter(a => a.attributeName === field.name) + + for (const option of fieldOptions) { + + const a= em.create(FieldOption, { + value: option.value, + field + }); + + em.persist(a) + } + + } + + await em.flush(); + } +} diff --git a/src/seeders/product-fields.seeder.ts b/src/seeders/product-fields.seeder.ts new file mode 100644 index 0000000..66b6bb3 --- /dev/null +++ b/src/seeders/product-fields.seeder.ts @@ -0,0 +1,33 @@ +import type { EntityManager } from '@mikro-orm/core'; +import { Product } from '../modules/product/entities/product.entity'; +import { fieldsDataData } from './data/product-field.data'; +import { Field } from 'src/modules/form-builder/entities/field.entity'; +import { EntityType } from 'src/modules/form-builder/interface/print'; +// import { Attribute } from 'src/modules/product/entities/attribute.entity'; + +export class ProductsFieldsSeeder { + async run( + em: EntityManager, + + ): Promise { + const products = await em.findAll(Product) + for (const product of products) { + for (const fieldData of fieldsDataData) { + + const field = em.create(Field, { + name: fieldData.name, + type: fieldData.type, + isRequired: fieldData.isRequired, + order: 1, + entityType: EntityType.product, + entityId: product.id, + multiple: false + }); + + em.persist(field); + } + } + + await em.flush(); + } +}