diff --git a/libs/common/src/integrations/tuya/services/tuya.service.ts b/libs/common/src/integrations/tuya/services/tuya.service.ts index ff69aa9..76c6582 100644 --- a/libs/common/src/integrations/tuya/services/tuya.service.ts +++ b/libs/common/src/integrations/tuya/services/tuya.service.ts @@ -120,6 +120,36 @@ export class TuyaService { ); } } + async updateTapToRunScene( + sceneTuyaUuid: string, + spaceId: string, + sceneName: string, + actions: ConvertedAction[], + decisionExpr: string, + ) { + const path = `/v2.0/cloud/scene/rule/${sceneTuyaUuid}`; + const response = await this.tuya.request({ + method: 'PUT', + path, + body: { + space_id: spaceId, + name: sceneName, + type: 'scene', + decision_expr: decisionExpr, + conditions: [], + actions: actions, + }, + }); + + if (response.success) { + return response; + } else { + throw new HttpException( + `Error fetching scene rule: ${response.msg}`, + HttpStatus.BAD_REQUEST, + ); + } + } async triggerScene(sceneId: string): Promise { const path = `/v2.0/cloud/scene/rule/${sceneId}/actions/trigger`; diff --git a/src/scene/services/scene.service.ts b/src/scene/services/scene.service.ts index cd37b18..15f1b23 100644 --- a/src/scene/services/scene.service.ts +++ b/src/scene/services/scene.service.ts @@ -128,6 +128,47 @@ export class SceneService { } } } + async updateSceneExternalService( + spaceTuyaUuid: string, + sceneTuyaUuid: string, + updateSceneTapToRunDto: UpdateSceneTapToRunDto, + ) { + const { sceneName, decisionExpr, actions } = updateSceneTapToRunDto; + try { + const formattedActions = await this.prepareActions(actions); + + const response = (await this.tuyaService.updateTapToRunScene( + sceneTuyaUuid, + spaceTuyaUuid, + sceneName, + formattedActions, + decisionExpr, + )) as AddTapToRunSceneInterface; + + if (!response.success) { + throw new HttpException( + 'Failed to update scene in Tuya', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + return response; + } catch (err) { + if (err instanceof HttpException) { + throw err; + } else if (err.message?.includes('tuya')) { + throw new HttpException( + 'API error: Failed to update scene', + HttpStatus.BAD_GATEWAY, + ); + } else { + throw new HttpException( + `An Internal error has been occured ${err}`, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } + } async createSceneExternalService( spaceTuyaUuid: string, @@ -285,25 +326,22 @@ export class SceneService { showInHomePage: updateSceneTapToRunDto.showInHomePage, }; - const createdTuyaSceneResponse = await this.createSceneExternalService( + const updateTuyaSceneResponse = await this.updateSceneExternalService( space.spaceTuyaUuid, + scene.sceneTuyaUuid, addSceneTapToRunDto, ); - const newSceneTuyaUuid = createdTuyaSceneResponse.result?.id; - if (!newSceneTuyaUuid) { + if (!updateTuyaSceneResponse.success) { throw new HttpException( - `Failed to create a external new scene`, + `Failed to update a external scene`, HttpStatus.BAD_GATEWAY, ); } - await this.delete(scene.sceneTuyaUuid, space.spaceTuyaUuid); - const updatedScene = await this.sceneRepository.update( { uuid: sceneUuid }, { - sceneTuyaUuid: newSceneTuyaUuid, showInHomePage: addSceneTapToRunDto.showInHomePage, sceneIcon: { uuid: addSceneTapToRunDto.iconUuid,