From 16444c625a620d0df451064a7cf60f47d1ead716 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:34:12 -0600 Subject: [PATCH] remove duplication code --- src/device/controllers/device.controller.ts | 12 +-- src/device/dtos/control.device.dto.ts | 8 +- src/device/services/device.service.ts | 82 ++++++++++----------- 3 files changed, 44 insertions(+), 58 deletions(-) diff --git a/src/device/controllers/device.controller.ts b/src/device/controllers/device.controller.ts index 8da3b03..28392aa 100644 --- a/src/device/controllers/device.controller.ts +++ b/src/device/controllers/device.controller.ts @@ -232,20 +232,14 @@ export class DeviceController { } @ApiBearerAuth() @UseGuards(JwtAuthGuard, CheckFourAndSixSceneDeviceTypeGuard) - @Get(':deviceUuid/scenes/switch') - async getSceneBySceneDevice( + @Get(':deviceUuid/scenes') + async getScenesBySceneDevice( @Param('deviceUuid') deviceUuid: string, @Query() getSceneFourSceneDeviceDto: GetSceneFourSceneDeviceDto, ) { - return await this.deviceService.getSceneBySceneDevice( + return await this.deviceService.getScenesBySceneDevice( deviceUuid, getSceneFourSceneDeviceDto, ); } - @ApiBearerAuth() - @UseGuards(JwtAuthGuard, CheckFourAndSixSceneDeviceTypeGuard) - @Get(':deviceUuid/scenes') - async getScenesBySceneDevice(@Param('deviceUuid') deviceUuid: string) { - return await this.deviceService.getScenesBySceneDevice(deviceUuid); - } } diff --git a/src/device/dtos/control.device.dto.ts b/src/device/dtos/control.device.dto.ts index 7a1e900..1303640 100644 --- a/src/device/dtos/control.device.dto.ts +++ b/src/device/dtos/control.device.dto.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsArray, IsNotEmpty, IsString } from 'class-validator'; +import { IsArray, IsNotEmpty, IsOptional, IsString } from 'class-validator'; export class ControlDeviceDto { @ApiProperty({ @@ -57,9 +57,9 @@ export class BatchFactoryResetDevicesDto { export class GetSceneFourSceneDeviceDto { @ApiProperty({ description: 'switchName', - required: true, + required: false, }) @IsString() - @IsNotEmpty() - public switchName: string; + @IsOptional() + public switchName?: string; } diff --git a/src/device/services/device.service.ts b/src/device/services/device.service.ts index 4d45264..eeca08c 100644 --- a/src/device/services/device.service.ts +++ b/src/device/services/device.service.ts @@ -1319,42 +1319,43 @@ export class DeviceService { } } - async getSceneBySceneDevice( + async getScenesBySceneDevice( deviceUuid: string, getSceneFourSceneDeviceDto: GetSceneFourSceneDeviceDto, - ) { + ): Promise { try { - const sceneDevice = await this.sceneDeviceRepository.findOne({ - where: { - device: { uuid: deviceUuid }, - switchName: - getSceneFourSceneDeviceDto.switchName as SceneSwitchesTypeEnum, - }, - relations: ['device', 'scene'], - }); - if (sceneDevice.uuid) { - const SceneDetails = await this.sceneService.getSceneByUuid( + if (getSceneFourSceneDeviceDto.switchName) { + // Query for a single record directly when switchName is provided + const sceneDevice = await this.sceneDeviceRepository.findOne({ + where: { + device: { uuid: deviceUuid }, + switchName: + getSceneFourSceneDeviceDto.switchName as SceneSwitchesTypeEnum, + }, + relations: ['device', 'scene'], + }); + + if (!sceneDevice) { + throw new HttpException( + `No scene found for device with UUID ${deviceUuid} and switch name ${getSceneFourSceneDeviceDto.switchName}`, + HttpStatus.NOT_FOUND, + ); + } + + const sceneDetails = await this.sceneService.getSceneByUuid( sceneDevice.scene.uuid, ); + return { switchName: sceneDevice.switchName, createdAt: sceneDevice.createdAt, updatedAt: sceneDevice.updatedAt, deviceUuid: sceneDevice.device.uuid, - scene: { - ...SceneDetails.data, - }, + scene: sceneDetails.data, }; } - } catch (error) { - throw new HttpException( - error.message || 'Scene device not found', - error.status || HttpStatus.NOT_FOUND, - ); - } - } - async getScenesBySceneDevice(deviceUuid: string): Promise { - try { + + // Query for multiple records if switchName is not provided const sceneDevices = await this.sceneDeviceRepository.find({ where: { device: { uuid: deviceUuid } }, relations: ['device', 'scene'], @@ -1362,37 +1363,28 @@ export class DeviceService { if (!sceneDevices.length) { throw new HttpException( - 'No scenes found for the device', + `No scenes found for device with UUID ${deviceUuid}`, HttpStatus.NOT_FOUND, ); } const results = await Promise.all( sceneDevices.map(async (sceneDevice) => { - if (!sceneDevice.scene?.uuid) return null; + const sceneDetails = await this.sceneService.getSceneByUuid( + sceneDevice.scene.uuid, + ); - try { - const sceneDetails = await this.sceneService.getSceneByUuid( - sceneDevice.scene.uuid, - ); - - return { - switchName: sceneDevice.switchName, - createdAt: sceneDevice.createdAt, - updatedAt: sceneDevice.updatedAt, - deviceUuid: sceneDevice.device.uuid, - scene: sceneDetails.data, - }; - } catch (error) { - throw new HttpException( - 'Failed to fetch scene details', - HttpStatus.INTERNAL_SERVER_ERROR, - ); - } + return { + switchName: sceneDevice.switchName, + createdAt: sceneDevice.createdAt, + updatedAt: sceneDevice.updatedAt, + deviceUuid: sceneDevice.device.uuid, + scene: sceneDetails.data, + }; }), ); - return results.filter(Boolean); + return results; } catch (error) { throw new HttpException( error.message || 'Failed to fetch scenes for device',