mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-14 09:57:28 +00:00
67 lines
1.7 KiB
TypeScript
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',
|
|
});
|
|
}
|
|
}
|
|
}
|