diff --git a/src/device/controllers/device.controller.ts b/src/device/controllers/device.controller.ts index acf1632..a54b5a9 100644 --- a/src/device/controllers/device.controller.ts +++ b/src/device/controllers/device.controller.ts @@ -83,7 +83,19 @@ export class DeviceController { ); } } - + @ApiBearerAuth() + @UseGuards(JwtAuthGuard) + @Get('unit/:unitUuid') + async getDevicesByUnitId(@Param('unitUuid') unitUuid: string) { + try { + return await this.deviceService.getDevicesByUnitId(unitUuid); + } catch (error) { + throw new HttpException( + error.message || 'Internal server error', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } @ApiBearerAuth() @UseGuards(JwtAuthGuard, CheckRoomGuard) @Put('room') diff --git a/src/device/services/device.service.ts b/src/device/services/device.service.ts index 868874d..8cbe772 100644 --- a/src/device/services/device.service.ts +++ b/src/device/services/device.service.ts @@ -24,6 +24,7 @@ import { DeviceRepository } from '@app/common/modules/device/repositories'; import { PermissionType } from '@app/common/constants/permission-type.enum'; import { In } from 'typeorm'; import { ProductType } from '@app/common/constants/product-type.enum'; +import { SpaceRepository } from '@app/common/modules/space/repositories'; @Injectable() export class DeviceService { @@ -32,6 +33,7 @@ export class DeviceService { private readonly configService: ConfigService, private readonly deviceRepository: DeviceRepository, private readonly productRepository: ProductRepository, + private readonly spaceRepository: SpaceRepository, ) { const accessKey = this.configService.get('auth-config.ACCESS_KEY'); const secretKey = this.configService.get('auth-config.SECRET_KEY'); @@ -538,4 +540,42 @@ export class DeviceService { ); } } + async getDevicesByUnitId(unitUuid: string) { + try { + const spaces = await this.spaceRepository.find({ + where: { + parent: { + uuid: unitUuid, + }, + }, + relations: ['devicesSpaceEntity', 'devicesSpaceEntity.productDevice'], + }); + + const devices = spaces.flatMap((space) => { + return space.devicesSpaceEntity.map((device) => device); + }); + + const devicesData = await Promise.all( + devices.map(async (device) => { + return { + haveRoom: true, + productUuid: device.productDevice.uuid, + productType: device.productDevice.prodType, + permissionType: PermissionType.CONTROLLABLE, + ...(await this.getDeviceDetailsByDeviceIdTuya( + device.deviceTuyaUuid, + )), + uuid: device.uuid, + } as GetDeviceDetailsInterface; + }), + ); + + return devicesData; + } catch (error) { + throw new HttpException( + 'This unit does not have any devices', + HttpStatus.NOT_FOUND, + ); + } + } }