From a7c18a9bff5f155f5ab677ca148042461d24a543 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sat, 27 Dec 2025 12:00:31 +0330 Subject: [PATCH] fix:bug --> get admin permission --- .../admin/repositories/admin.repository.ts | 2 +- .../providers/restaurants.service.ts | 18 ++++---- .../roles/providers/permissions.service.ts | 44 +++++++------------ 3 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/modules/admin/repositories/admin.repository.ts b/src/modules/admin/repositories/admin.repository.ts index e6cb6ea..04868a5 100644 --- a/src/modules/admin/repositories/admin.repository.ts +++ b/src/modules/admin/repositories/admin.repository.ts @@ -40,7 +40,7 @@ export class AdminRepository extends EntityRepository { // Ensure all roles are populated await adminRole.admin.roles.loadItems(); for (const role of adminRole.admin.roles.getItems()) { - if (role.role && !role.role.permissions.isInitialized()) { + if (role.role && role.role.permissions && !role.role.permissions.isInitialized()) { await role.role.permissions.loadItems(); } } diff --git a/src/modules/restaurants/providers/restaurants.service.ts b/src/modules/restaurants/providers/restaurants.service.ts index 1c36308..98d0693 100644 --- a/src/modules/restaurants/providers/restaurants.service.ts +++ b/src/modules/restaurants/providers/restaurants.service.ts @@ -11,6 +11,7 @@ import { PlanEnum } from '../interface/plan.interface'; import { Admin } from '../../admin/entities/admin.entity'; import { AdminRole } from '../../admin/entities/adminRole.entity'; import { Role } from '../../roles/entities/role.entity'; +import { normalizePhone } from 'src/modules/utils/phone.util'; @Injectable() export class RestaurantsService { @@ -52,22 +53,21 @@ export class RestaurantsService { throw new BadRequestException(`Role not found for plan: ${dto.plan}`); } - // Create admin (using a default phone number for now - this could be made configurable) - const adminPhone = `admin_${dto.slug}@system.local`; // Temporary phone format for system-generated admins - let admin = await em.findOne(Admin, { phone: adminPhone }); +const normalizedPhone = normalizePhone(dto.phone); + let admin = await em.findOne(Admin, { phone: normalizedPhone }); if (!admin) { admin = em.create(Admin, { - phone: adminPhone, - firstName: 'مدیر', - lastName: dto.name, + phone: normalizedPhone, + firstName: 'نام مدیر', + lastName: 'نام خانوادگی مدیر', }); } // Create admin role relationship const adminRole = em.create(AdminRole, { - admin: admin, - role: role, - restaurant: restaurant, + admin, + role, + restaurant, }); // Persist all entities diff --git a/src/modules/roles/providers/permissions.service.ts b/src/modules/roles/providers/permissions.service.ts index f4fc79d..8e96fa4 100644 --- a/src/modules/roles/providers/permissions.service.ts +++ b/src/modules/roles/providers/permissions.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@mikro-orm/nestjs'; -import { EntityRepository } from '@mikro-orm/core'; +import { EntityManager, EntityRepository } from '@mikro-orm/core'; import { Permission } from '../entities/permission.entity'; import { CacheService } from 'src/modules/utils/cache.service'; import { AdminRepository } from 'src/modules/admin/repositories/admin.repository'; +import { AdminRole } from 'src/modules/admin/entities/adminRole.entity'; @Injectable() export class PermissionsService { @@ -14,7 +15,8 @@ export class PermissionsService { private readonly permissionRepository: EntityRepository, private readonly cacheService: CacheService, private readonly adminRepository: AdminRepository, - ) {} + private readonly em: EntityManager, + ) { } async findAll() { const permissions = await this.permissionRepository.findAll(); @@ -76,33 +78,19 @@ export class PermissionsService { } async getAdminFullPermissions(adminId: string, restId: string): Promise { - const admin = await this.adminRepository.findOne( - { id: adminId, roles: { restaurant: { id: restId } } }, - { populate: ['roles', 'roles.role', 'roles.role.permissions'] }, - ); - - if (!admin || !admin.roles) { - return []; + const listOfPermissions = [] + const adminRoles = await this.em.findOne(AdminRole, { + admin: { + id: adminId, + }, + restaurant: { + id: restId, + }, + }, { populate: ['role', 'role.permissions'] }); + if (adminRoles) { + listOfPermissions.push(...adminRoles.role.permissions.getItems()); } - - // Ensure roles collection is loaded - await admin.roles.loadItems(); - - // Extract permission names as array of strings - const permissions = await Promise.all( - admin.roles - .getItems() - .filter(r => r.role) // Filter out any null/undefined roles - .map(async r => { - // Ensure permissions collection is initialized - if (!r.role.permissions.isInitialized()) { - await r.role.permissions.loadItems(); - } - return r.role.permissions.getItems(); - }), - ); - - return permissions.flat(); + return listOfPermissions.map(permission => permission); } /**