import { DeviceService } from '../services/device.service'; import { Body, Controller, Get, Post, Query, Param, UseGuards, Put, Delete, Req, } from '@nestjs/common'; import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger'; import { AddDeviceDto, AddSceneToFourSceneDeviceDto, AssignDeviceToSpaceDto, UpdateDeviceDto, } from '../dtos/add.device.dto'; import { GetDeviceLogsDto } from '../dtos/get.device.dto'; import { ControlDeviceDto, BatchControlDevicesDto, BatchStatusDevicesDto, GetSceneFourSceneDeviceDto, } from '../dtos/control.device.dto'; import { CheckRoomGuard } from 'src/guards/room.guard'; import { CheckDeviceGuard } from 'src/guards/device.guard'; import { EnableDisableStatusEnum } from '@app/common/constants/days.enum'; import { CheckFourAndSixSceneDeviceTypeGuard } from 'src/guards/scene.device.type.guard'; import { ControllerRoute } from '@app/common/constants/controller-route'; import { BaseResponseDto } from '@app/common/dto/base.response.dto'; import { DeviceSceneParamDto } from '../dtos/device.param.dto'; import { DeleteSceneFromSceneDeviceDto } from '../dtos/delete.device.dto'; import { PermissionsGuard } from 'src/guards/permissions.guard'; import { Permissions } from 'src/decorators/permissions.decorator'; @ApiTags('Device Module') @Controller({ version: EnableDisableStatusEnum.ENABLED, path: ControllerRoute.DEVICE.ROUTE, }) export class DeviceController { constructor(private readonly deviceService: DeviceService) {} @ApiBearerAuth() @UseGuards(PermissionsGuard, CheckDeviceGuard) @Permissions('SPACE_DEVICE_ASSIGN_DEVICE_TO_SPACE') @Post() @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.ADD_DEVICE_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.ADD_DEVICE_DESCRIPTION, }) async addNewDevice( @Body() addDeviceDto: AddDeviceDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.addNewDevice(addDeviceDto, projectUuid); } @ApiBearerAuth() @UseGuards(PermissionsGuard, CheckRoomGuard) @Permissions('SUBSPACE_DEVICE_UPDATE_DEVICE_IN_SUBSPACE') @Post(':deviceUuid/space/:spaceUuid') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.UPDATE_DEVICE_IN_ROOM_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.UPDATE_DEVICE_IN_ROOM_DESCRIPTION, }) async transferDeviceInSpaces( @Param() updateDeviceInSpaceDto: AssignDeviceToSpaceDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.transferDeviceInSpaces( updateDeviceInSpaceDto, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_VIEW') @Get(':deviceUuid') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_DETAILS_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_DETAILS_DESCRIPTION, }) async getDeviceDetailsByDeviceId( @Param('deviceUuid') deviceUuid: string, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.getDeviceDetailsByDeviceId( deviceUuid, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_UPDATE') @Put(':deviceUuid') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.UPDATE_DEVICE_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.UPDATE_DEVICE_DESCRIPTION, }) async updateDevice( @Param('deviceUuid') deviceUuid: string, @Body() updateDeviceDto: UpdateDeviceDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.updateDevice( deviceUuid, updateDeviceDto, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_VIEW') @Get(':deviceUuid/functions') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_INSTRUCTION_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_INSTRUCTION_DESCRIPTION, }) async getDeviceInstructionByDeviceId( @Param('deviceUuid') deviceUuid: string, @Req() req: any, ) { const projectUuid = req.user.project.uuid; return await this.deviceService.getDeviceInstructionByDeviceId( deviceUuid, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_VIEW') @Get(':deviceUuid/functions/status') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_STATUS_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_STATUS_DESCRIPTION, }) async getDevicesInstructionStatus( @Param('deviceUuid') deviceUuid: string, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.getDevicesStatus(deviceUuid, projectUuid); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_SINGLE_CONTROL') @Post(':deviceUuid/command') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.CONTROL_DEVICE_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.CONTROL_DEVICE_DESCRIPTION, }) async controlDevice( @Body() controlDeviceDto: ControlDeviceDto, @Param('deviceUuid') deviceUuid: string, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.controlDevice( controlDeviceDto, deviceUuid, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('FIRMWARE_CONTROL') @Post(':deviceUuid/firmware/:firmwareVersion') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.UPDATE_DEVICE_FIRMWARE_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.UPDATE_DEVICE_FIRMWARE_DESCRIPTION, }) async updateDeviceFirmware( @Param('deviceUuid') deviceUuid: string, @Param('firmwareVersion') firmwareVersion: number, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.updateDeviceFirmware( deviceUuid, firmwareVersion, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_VIEW') @Get('gateway/:gatewayUuid/devices') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.GET_DEVICES_IN_GATEWAY_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.GET_DEVICES_IN_GATEWAY_DESCRIPTION, }) async getDevicesInGateway( @Param('gatewayUuid') gatewayUuid: string, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.getDevicesInGateway( gatewayUuid, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_VIEW') @Get(':deviceUuid/report-logs') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_LOGS_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.GET_DEVICE_LOGS_DESCRIPTION, }) async getBuildingChildByUuid( @Param('deviceUuid') deviceUuid: string, @Query() query: GetDeviceLogsDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.getDeviceLogs( deviceUuid, query, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_BATCH_CONTROL') @Post('batch') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.BATCH_CONTROL_DEVICES_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.BATCH_CONTROL_DEVICES_DESCRIPTION, }) async batchControlDevices( @Body() batchControlDevicesDto: BatchControlDevicesDto, @Req() req: any, ) { const projectUuid = req.user.project.uuid; return await this.deviceService.batchControlDevices( batchControlDevicesDto, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_BATCH_CONTROL') @Get('batch') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.BATCH_STATUS_DEVICES_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.BATCH_STATUS_DEVICES_DESCRIPTION, }) async batchStatusDevices( @Query() batchStatusDevicesDto: BatchStatusDevicesDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.batchStatusDevices( batchStatusDevicesDto, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard, CheckFourAndSixSceneDeviceTypeGuard) @Permissions('DEVICE_SINGLE_CONTROL') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.ADD_SCENE_TO_DEVICE_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.ADD_SCENE_TO_DEVICE_DESCRIPTION, }) @Post(':deviceUuid/scenes') async addSceneToSceneDevice( @Param('deviceUuid') deviceUuid: string, @Body() addSceneToFourSceneDeviceDto: AddSceneToFourSceneDeviceDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.addSceneToSceneDevice( deviceUuid, addSceneToFourSceneDeviceDto, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard, CheckFourAndSixSceneDeviceTypeGuard) @Permissions('DEVICE_VIEW') @Get(':deviceUuid/scenes') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.GET_SCENES_BY_DEVICE_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.GET_SCENES_BY_DEVICE_DESCRIPTION, }) async getScenesBySceneDevice( @Param('deviceUuid') deviceUuid: string, @Query() getSceneFourSceneDeviceDto: GetSceneFourSceneDeviceDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.getScenesBySceneDevice( deviceUuid, getSceneFourSceneDeviceDto, projectUuid, ); } @ApiBearerAuth() @UseGuards(PermissionsGuard) @Permissions('DEVICE_DELETE') @Delete(':deviceUuid/scenes') @ApiOperation({ summary: ControllerRoute.DEVICE.ACTIONS.DELETE_SCENES_BY_SWITCH_NAME_SUMMARY, description: ControllerRoute.DEVICE.ACTIONS.DELETE_SCENES_BY_SWITCH_NAME_DESCRIPTION, }) async deleteSceneFromSceneDevice( @Param() param: DeviceSceneParamDto, @Query() query: DeleteSceneFromSceneDeviceDto, @Req() req: any, ): Promise { const projectUuid = req.user.project.uuid; return await this.deviceService.deleteSceneFromSceneDevice( param, query, projectUuid, ); } }