From 1ba66c7946cf018624114b53ee5b788d981fb2bf Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 4 Dec 2025 00:00:52 +0330 Subject: [PATCH] seed users --- src/modules/users/entities/user.entity.ts | 6 +- src/modules/users/user.service.ts | 2 +- src/seeders/DatabaseSeeder.ts | 2 +- src/seeders/data/user-addresses.data.ts | 64 +++++++++++++++++ src/seeders/data/users.data.ts | 27 ++++++- src/seeders/users.seeder.ts | 88 +++++++++++++++++------ 6 files changed, 158 insertions(+), 31 deletions(-) create mode 100644 src/seeders/data/user-addresses.data.ts diff --git a/src/modules/users/entities/user.entity.ts b/src/modules/users/entities/user.entity.ts index 4c92726..329fa20 100644 --- a/src/modules/users/entities/user.entity.ts +++ b/src/modules/users/entities/user.entity.ts @@ -1,13 +1,9 @@ -import { Entity, Property, OneToOne, OneToMany, Collection, Cascade } from '@mikro-orm/core'; +import { Entity, Property, OneToMany, Collection, Cascade } from '@mikro-orm/core'; import { BaseEntity } from '../../../common/entities/base.entity'; -import { Restaurant } from '../../restaurants/entities/restaurant.entity'; import { UserAddress } from './user-address.entity'; @Entity({ tableName: 'users' }) export class User extends BaseEntity { - @OneToOne(() => Restaurant, { owner: true }) - restaurant!: Restaurant; - @Property() firstName!: string; diff --git a/src/modules/users/user.service.ts b/src/modules/users/user.service.ts index 71ffd3b..6d6bbbd 100644 --- a/src/modules/users/user.service.ts +++ b/src/modules/users/user.service.ts @@ -106,7 +106,7 @@ export class UserService { const offset = (page - 1) * limit; // 2. Build the 'where' filter query - const where: FilterQuery = { restaurant: { id: restId } }; + const where: FilterQuery = {}; // 4. Add 'search' logic (case-insensitive) if (search) { diff --git a/src/seeders/DatabaseSeeder.ts b/src/seeders/DatabaseSeeder.ts index da1302b..b6ba43f 100644 --- a/src/seeders/DatabaseSeeder.ts +++ b/src/seeders/DatabaseSeeder.ts @@ -53,6 +53,6 @@ export class DatabaseSeeder extends Seeder { // 10. Create Users const usersSeeder = new UsersSeeder(); - await usersSeeder.run(em, restaurantsMap); + await usersSeeder.run(em); } } diff --git a/src/seeders/data/user-addresses.data.ts b/src/seeders/data/user-addresses.data.ts new file mode 100644 index 0000000..bbbe8fd --- /dev/null +++ b/src/seeders/data/user-addresses.data.ts @@ -0,0 +1,64 @@ +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.3890, + phone: '09362532122', + isDefault: true, + }, + { + userPhone: '09185290775', + title: 'خانه', + address: 'خیابان انقلاب، پلاک 456', + city: 'تهران', + province: 'تهران', + postalCode: '1234567891', + latitude: 35.6900, + longitude: 51.3900, + phone: '09185290775', + isDefault: true, + }, + { + userPhone: '09129283395', + title: 'خانه', + address: 'خیابان آزادی، پلاک 789', + city: 'تهران', + province: 'تهران', + postalCode: '1234567892', + latitude: 35.6910, + longitude: 51.3910, + phone: '09129283395', + isDefault: true, + }, + { + userPhone: '09184317567', + title: 'خانه', + address: 'خیابان جمهوری، پلاک 321', + city: 'تهران', + province: 'تهران', + postalCode: '1234567893', + latitude: 35.6920, + longitude: 51.3920, + phone: '09184317567', + isDefault: true, + }, +]; + diff --git a/src/seeders/data/users.data.ts b/src/seeders/data/users.data.ts index e24394a..3205146 100644 --- a/src/seeders/data/users.data.ts +++ b/src/seeders/data/users.data.ts @@ -27,7 +27,7 @@ export const usersData: UserData[] = [ { phone: '09185290775', firstName: 'حمید', - lastName: 'زرگامی', + lastName: 'ضرغامی', restaurantSlug: 'boote', birthDate: '1992-01-01', marriageDate: '2017-01-01', @@ -36,5 +36,28 @@ export const usersData: UserData[] = [ wallet: 0, points: 0, }, + { + phone: '09129283395', + firstName: 'مهرداد', + lastName: 'مظفری', + restaurantSlug: 'zhivan', + birthDate: '1988-01-01', + marriageDate: '2014-01-01', + isActive: true, + gender: true, + wallet: 0, + points: 0, + }, + { + phone: '09184317567', + firstName: 'مارال', + lastName: 'صادقی', + restaurantSlug: 'boote', + birthDate: '1995-01-01', + marriageDate: '2020-01-01', + isActive: true, + gender: false, + wallet: 0, + points: 0, + }, ]; - diff --git a/src/seeders/users.seeder.ts b/src/seeders/users.seeder.ts index 1e6c4b8..2a8508b 100644 --- a/src/seeders/users.seeder.ts +++ b/src/seeders/users.seeder.ts @@ -1,33 +1,77 @@ import type { EntityManager } from '@mikro-orm/core'; import { User } from '../modules/users/entities/user.entity'; -import { Restaurant } from '../modules/restaurants/entities/restaurant.entity'; +import { UserAddress } from '../modules/users/entities/user-address.entity'; import { usersData } from './data/users.data'; +import { userAddressesData } from './data/user-addresses.data'; export class UsersSeeder { - async run(em: EntityManager, restaurantsMap: Map): Promise { + async run(em: EntityManager): Promise> { + const usersMap = new Map(); + + // Create users for (const userData of usersData) { - const existingUser = await em.findOne(User, { phone: userData.phone }); - if (existingUser) continue; - - const restaurant = restaurantsMap.get(userData.restaurantSlug); - if (!restaurant) continue; - - const user = em.create(User, { - phone: userData.phone, - firstName: userData.firstName, - lastName: userData.lastName, - restaurant, - birthDate: new Date(userData.birthDate), - marriageDate: new Date(userData.marriageDate), - isActive: userData.isActive, - gender: userData.gender, - wallet: userData.wallet, - points: userData.points, - }); - em.persist(user); + let user = await em.findOne(User, { phone: userData.phone }); + if (!user) { + user = em.create(User, { + phone: userData.phone, + firstName: userData.firstName, + lastName: userData.lastName, + birthDate: new Date(userData.birthDate), + marriageDate: new Date(userData.marriageDate), + isActive: userData.isActive, + gender: userData.gender, + wallet: userData.wallet, + points: userData.points, + }); + em.persist(user); + } + usersMap.set(userData.phone, user); } await em.flush(); + + // Create addresses for users + for (const addressData of userAddressesData) { + const user = usersMap.get(addressData.userPhone); + if (!user) continue; + + // Check if address already exists for this user + const existingAddress = await em.findOne(UserAddress, { + user: { id: user.id }, + title: addressData.title, + address: addressData.address, + }); + + if (!existingAddress) { + // If setting as default, unset other default addresses for this user + if (addressData.isDefault) { + const existingDefaultAddresses = await em.find(UserAddress, { + user: { id: user.id }, + isDefault: true, + }); + for (const defaultAddress of existingDefaultAddresses) { + defaultAddress.isDefault = false; + em.persist(defaultAddress); + } + } + + const address = em.create(UserAddress, { + user, + title: addressData.title, + address: addressData.address, + city: addressData.city, + province: addressData.province, + postalCode: addressData.postalCode, + latitude: addressData.latitude, + longitude: addressData.longitude, + phone: addressData.phone, + isDefault: addressData.isDefault, + }); + em.persist(address); + } + } + + await em.flush(); + return usersMap; } } -