diff --git a/src/automation/interface/automation.interface.ts b/src/automation/interface/automation.interface.ts index 6ddec4d..298d58c 100644 --- a/src/automation/interface/automation.interface.ts +++ b/src/automation/interface/automation.interface.ts @@ -43,3 +43,8 @@ export interface AutomationResponseData { conditions: Condition[]; [key: string]: any; // Allow additional properties } +export interface AutomationDetailsResult { + id: string; + name: string; + type: string; +} diff --git a/src/automation/services/automation.service.ts b/src/automation/services/automation.service.ts index ce9bfa5..bbb7651 100644 --- a/src/automation/services/automation.service.ts +++ b/src/automation/services/automation.service.ts @@ -17,6 +17,7 @@ import { convertKeysToSnakeCase } from '@app/common/helper/snakeCaseConverter'; import { DeviceService } from 'src/device/services'; import { AddAutomationInterface, + AutomationDetailsResult, AutomationResponseData, DeleteAutomationInterface, GetAutomationByUnitInterface, @@ -186,6 +187,38 @@ export class AutomationService { } } } + async getTapToRunSceneDetailsTuya( + sceneId: string, + ): Promise { + try { + const path = `/v2.0/cloud/scene/rule/${sceneId}`; + const response = await this.tuya.request({ + method: 'GET', + path, + }); + + if (!response.success) { + throw new HttpException(response.msg, HttpStatus.BAD_REQUEST); + } + const camelCaseResponse = convertKeysToCamelCase(response); + const { id, name, type } = camelCaseResponse.result; + + return { + id, + name, + type, + } as AutomationDetailsResult; + } catch (err) { + if (err instanceof BadRequestException) { + throw err; // Re-throw BadRequestException + } else { + throw new HttpException( + 'Scene not found for Tuya', + HttpStatus.NOT_FOUND, + ); + } + } + } async getAutomationDetails(automationId: string, withSpaceId = false) { try { const path = `/v2.0/cloud/scene/rule/${automationId}`; @@ -215,6 +248,18 @@ export class AutomationService { if (device) { action.entityId = device.uuid; } + } else if ( + action.actionExecutor !== 'device_issue' && + action.actionExecutor !== 'delay' + ) { + const sceneDetails = await this.getTapToRunSceneDetailsTuya( + action.entityId, + ); + + if (sceneDetails.id) { + action.name = sceneDetails.name; + action.type = sceneDetails.type; + } } } diff --git a/src/scene/interface/scene.interface.ts b/src/scene/interface/scene.interface.ts index 00ebcae..e6508d9 100644 --- a/src/scene/interface/scene.interface.ts +++ b/src/scene/interface/scene.interface.ts @@ -21,3 +21,8 @@ export interface DeleteTapToRunSceneInterface { msg?: string; result: boolean; } +export interface SceneDetailsResult { + id: string; + name: string; + type: string; +} diff --git a/src/scene/services/scene.service.ts b/src/scene/services/scene.service.ts index b45caf8..66bb769 100644 --- a/src/scene/services/scene.service.ts +++ b/src/scene/services/scene.service.ts @@ -15,6 +15,7 @@ import { AddTapToRunSceneInterface, DeleteTapToRunSceneInterface, GetTapToRunSceneByUnitInterface, + SceneDetailsResult, } from '../interface/scene.interface'; import { convertKeysToCamelCase } from '@app/common/helper/camelCaseConverter'; @@ -256,6 +257,18 @@ export class SceneService { if (device) { action.entityId = device.uuid; } + } else if ( + action.actionExecutor !== 'device_issue' && + action.actionExecutor !== 'delay' + ) { + const sceneDetails = await this.getTapToRunSceneDetailsTuya( + action.entityId, + ); + + if (sceneDetails.id) { + action.name = sceneDetails.name; + action.type = sceneDetails.type; + } } } @@ -275,6 +288,38 @@ export class SceneService { } } } + async getTapToRunSceneDetailsTuya( + sceneId: string, + ): Promise { + try { + const path = `/v2.0/cloud/scene/rule/${sceneId}`; + const response = await this.tuya.request({ + method: 'GET', + path, + }); + + if (!response.success) { + throw new HttpException(response.msg, HttpStatus.BAD_REQUEST); + } + const camelCaseResponse = convertKeysToCamelCase(response); + const { id, name, type } = camelCaseResponse.result; + + return { + id, + name, + type, + } as SceneDetailsResult; + } catch (err) { + if (err instanceof BadRequestException) { + throw err; // Re-throw BadRequestException + } else { + throw new HttpException( + 'Scene not found for Tuya', + HttpStatus.NOT_FOUND, + ); + } + } + } async updateTapToRunScene( updateSceneTapToRunDto: UpdateSceneTapToRunDto, sceneId: string,