seed users
This commit is contained in:
@@ -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 { BaseEntity } from '../../../common/entities/base.entity';
|
||||||
import { Restaurant } from '../../restaurants/entities/restaurant.entity';
|
|
||||||
import { UserAddress } from './user-address.entity';
|
import { UserAddress } from './user-address.entity';
|
||||||
|
|
||||||
@Entity({ tableName: 'users' })
|
@Entity({ tableName: 'users' })
|
||||||
export class User extends BaseEntity {
|
export class User extends BaseEntity {
|
||||||
@OneToOne(() => Restaurant, { owner: true })
|
|
||||||
restaurant!: Restaurant;
|
|
||||||
|
|
||||||
@Property()
|
@Property()
|
||||||
firstName!: string;
|
firstName!: string;
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ export class UserService {
|
|||||||
const offset = (page - 1) * limit;
|
const offset = (page - 1) * limit;
|
||||||
|
|
||||||
// 2. Build the 'where' filter query
|
// 2. Build the 'where' filter query
|
||||||
const where: FilterQuery<User> = { restaurant: { id: restId } };
|
const where: FilterQuery<User> = {};
|
||||||
|
|
||||||
// 4. Add 'search' logic (case-insensitive)
|
// 4. Add 'search' logic (case-insensitive)
|
||||||
if (search) {
|
if (search) {
|
||||||
|
|||||||
@@ -53,6 +53,6 @@ export class DatabaseSeeder extends Seeder {
|
|||||||
|
|
||||||
// 10. Create Users
|
// 10. Create Users
|
||||||
const usersSeeder = new UsersSeeder();
|
const usersSeeder = new UsersSeeder();
|
||||||
await usersSeeder.run(em, restaurantsMap);
|
await usersSeeder.run(em);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ export const usersData: UserData[] = [
|
|||||||
{
|
{
|
||||||
phone: '09185290775',
|
phone: '09185290775',
|
||||||
firstName: 'حمید',
|
firstName: 'حمید',
|
||||||
lastName: 'زرگامی',
|
lastName: 'ضرغامی',
|
||||||
restaurantSlug: 'boote',
|
restaurantSlug: 'boote',
|
||||||
birthDate: '1992-01-01',
|
birthDate: '1992-01-01',
|
||||||
marriageDate: '2017-01-01',
|
marriageDate: '2017-01-01',
|
||||||
@@ -36,5 +36,28 @@ export const usersData: UserData[] = [
|
|||||||
wallet: 0,
|
wallet: 0,
|
||||||
points: 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
@@ -1,33 +1,77 @@
|
|||||||
import type { EntityManager } from '@mikro-orm/core';
|
import type { EntityManager } from '@mikro-orm/core';
|
||||||
import { User } from '../modules/users/entities/user.entity';
|
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 { usersData } from './data/users.data';
|
||||||
|
import { userAddressesData } from './data/user-addresses.data';
|
||||||
|
|
||||||
export class UsersSeeder {
|
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) {
|
for (const userData of usersData) {
|
||||||
const existingUser = await em.findOne(User, { phone: userData.phone });
|
let user = await em.findOne(User, { phone: userData.phone });
|
||||||
if (existingUser) continue;
|
if (!user) {
|
||||||
|
user = em.create(User, {
|
||||||
const restaurant = restaurantsMap.get(userData.restaurantSlug);
|
phone: userData.phone,
|
||||||
if (!restaurant) continue;
|
firstName: userData.firstName,
|
||||||
|
lastName: userData.lastName,
|
||||||
const user = em.create(User, {
|
birthDate: new Date(userData.birthDate),
|
||||||
phone: userData.phone,
|
marriageDate: new Date(userData.marriageDate),
|
||||||
firstName: userData.firstName,
|
isActive: userData.isActive,
|
||||||
lastName: userData.lastName,
|
gender: userData.gender,
|
||||||
restaurant,
|
wallet: userData.wallet,
|
||||||
birthDate: new Date(userData.birthDate),
|
points: userData.points,
|
||||||
marriageDate: new Date(userData.marriageDate),
|
});
|
||||||
isActive: userData.isActive,
|
em.persist(user);
|
||||||
gender: userData.gender,
|
}
|
||||||
wallet: userData.wallet,
|
usersMap.set(userData.phone, user);
|
||||||
points: userData.points,
|
|
||||||
});
|
|
||||||
em.persist(user);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await em.flush();
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user