import { SpaceRepository } from '@app/common/modules/space/repositories'; import { Injectable, CanActivate, HttpStatus, BadRequestException, ExecutionContext, } from '@nestjs/common'; @Injectable() export class CheckUnitTypeGuard implements CanActivate { constructor(private readonly spaceRepository: SpaceRepository) {} async canActivate(context: ExecutionContext): Promise { const req = context.switchToHttp().getRequest(); try { const { roomName, unitUuid } = req.body; if (!roomName) { throw new BadRequestException('roomName is required'); } if (!unitUuid) { throw new BadRequestException('unitUuid is required'); } await this.checkFloorIsFloorType(unitUuid); return true; } catch (error) { this.handleGuardError(error, context); return false; } } async checkFloorIsFloorType(unitUuid: string) { const unitData = await this.spaceRepository.findOne({ where: { uuid: unitUuid }, relations: ['spaceType'], }); if ( !unitData || !unitData.spaceType || unitData.spaceType.type !== 'unit' ) { throw new BadRequestException('Invalid unit UUID'); } } private handleGuardError(error: Error, context: ExecutionContext) { const response = context.switchToHttp().getResponse(); console.error(error); if (error instanceof BadRequestException) { response .status(HttpStatus.BAD_REQUEST) .json({ statusCode: HttpStatus.BAD_REQUEST, message: error.message }); } else { response.status(HttpStatus.NOT_FOUND).json({ statusCode: HttpStatus.NOT_FOUND, message: 'Unit not found', }); } } }