seed users

This commit is contained in:
2025-12-04 00:00:52 +03:30
parent 87e935acfd
commit 1ba66c7946
6 changed files with 158 additions and 31 deletions
+1 -5
View File
@@ -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;
+1 -1
View File
@@ -106,7 +106,7 @@ export class UserService {
const offset = (page - 1) * limit;
// 2. Build the 'where' filter query
const where: FilterQuery<User> = { restaurant: { id: restId } };
const where: FilterQuery<User> = {};
// 4. Add 'search' logic (case-insensitive)
if (search) {
+1 -1
View File
@@ -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);
}
}
+64
View File
@@ -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,
},
];
+25 -2
View File
@@ -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,
},
];
+66 -22
View File
@@ -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<string, Restaurant>): Promise<void> {
async run(em: EntityManager): Promise<Map<string, User>> {
const usersMap = new Map<string, User>();
// 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;
}
}