import { BadRequestException, Injectable } from '@nestjs/common'; import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { Role } from '../entity/role.entity'; @Injectable() export class RoleRepository { constructor( @InjectRepository(Role) private readonly roleRepo: Repository, ) {} async findByCode(code: string): Promise { return this.roleRepo.findOne({ where: { code } }); } public async isRoleNameExists( name: string, options?: { excludeRoleId?: number; organization_id?: number }, ): Promise { const query = this.roleRepo .createQueryBuilder('role') .where('role.name = :name', { name }); if (options?.excludeRoleId) { query.andWhere('role.id != :excludeRoleId', { excludeRoleId: options.excludeRoleId, }); } if (options?.organization_id !== undefined) { query.andWhere('role.organization_id = :organization_id', { organization_id: options.organization_id, }); } const existingRole = await query.getOne(); return !!existingRole; } async find(data): Promise { return this.roleRepo.find({ where: { ...(data.is_factory !== undefined && { is_factory: data.is_factory }), ...(data.level_id !== undefined && { level_id: data.level_id }), ...(data.level_type !== undefined && { level_type: data.level_type }), }, }); } /* Ensure role_code is unique within the same level_type and level_id. * Confirm level_type and level_id correspond to existing org/school. */ public async isRoleNameWithLevelExists( name: string, options?: { excludeRoleId?: number; organization_id?: number; level_type?: string; level_id?: number; }, ): Promise { const query = this.roleRepo .createQueryBuilder('role') .where('role.name = :name', { name }); if (options?.excludeRoleId) { query.andWhere('role.id != :excludeRoleId', { excludeRoleId: options.excludeRoleId, }); } if (options?.organization_id !== undefined) { query.andWhere('role.organization_id = :organization_id', { organization_id: options.organization_id, }); } if (options?.level_type) { query.andWhere('role.level_type = :level_type', { level_type: options.level_type, }); } if (options?.level_id !== undefined) { query.andWhere('role.level_id = :level_id', { level_id: options.level_id, }); } const existingRole = await query.getOne(); return !!existingRole; } }