homemanager-be/src/shared/guards/room.guard.ts

53 lines
1.4 KiB
TypeScript

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Request } from 'express';
import { BuildingService } from 'src/objects/building/building.service';
import { Room } from 'src/objects/building/entities/room.entity';
import { User } from 'src/objects/user/user.entity';
@Injectable()
export class RoomGuard implements CanActivate {
constructor(private readonly buildingService: BuildingService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const http = context.switchToHttp();
const request = http.getRequest() as Request;
const response = http.getResponse();
const user = response.locals.user as User;
if (!user) return false;
if (
request.params.roomId == null &&
request.body?.roomId == null &&
request.query?.roomId == null
) {
return true;
}
const roomId = parseInt(
request.params.roomId || request.body?.roomId || request.query?.roomId,
10,
);
if (!roomId || isNaN(roomId)) return false;
let roomAccess: Room;
if (response.locals.building) {
roomAccess = await this.buildingService.getRoomByBuilding(
roomId,
response.locals.building.id,
);
} else {
roomAccess = await this.buildingService.getRoomByIdAndUserSub(
roomId,
user.sub,
);
}
if (!roomAccess) return false;
response.locals.room = roomAccess;
return true;
}
}