Files
backend/src/guards/unit.type.guard.ts
2024-04-14 13:13:56 +03:00

67 lines
1.7 KiB
TypeScript

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<boolean> {
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',
});
}
}
}