From d341c47286a7ee084c94d522080e06614a0890f1 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Thu, 17 Apr 2025 16:58:34 +0300 Subject: [PATCH] add SosHandlerService and integrate SOS handling in TuyaWebSocketService --- libs/common/src/helper/helper.module.ts | 2 + .../helper/services/sos.handler.service.ts | 42 +++++++++++++++++++ .../services/tuya.web.socket.service.ts | 16 ++++--- 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 libs/common/src/helper/services/sos.handler.service.ts diff --git a/libs/common/src/helper/helper.module.ts b/libs/common/src/helper/helper.module.ts index b4cf2fd..df152e2 100644 --- a/libs/common/src/helper/helper.module.ts +++ b/libs/common/src/helper/helper.module.ts @@ -12,6 +12,7 @@ import { DeviceNotificationRepository } from '../modules/device/repositories'; import { DeviceStatusFirebaseModule } from '../firebase/devices-status/devices-status.module'; import { CommunityPermissionService } from './services/community.permission.service'; import { CommunityRepository } from '../modules/community/repositories'; +import { SosHandlerService } from './services/sos.handler.service'; @Global() @Module({ @@ -25,6 +26,7 @@ import { CommunityRepository } from '../modules/community/repositories'; DeviceMessagesService, DeviceNotificationRepository, CommunityRepository, + SosHandlerService, ], exports: [ HelperHashService, diff --git a/libs/common/src/helper/services/sos.handler.service.ts b/libs/common/src/helper/services/sos.handler.service.ts new file mode 100644 index 0000000..4e957dc --- /dev/null +++ b/libs/common/src/helper/services/sos.handler.service.ts @@ -0,0 +1,42 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service'; + +@Injectable() +export class SosHandlerService { + private readonly logger = new Logger(SosHandlerService.name); + + constructor( + private readonly deviceStatusFirebaseService: DeviceStatusFirebaseService, + ) {} + + isSosTriggered(status: any): boolean { + return ( + Array.isArray(status) && + status.some((item) => item.code === 'sos' && item.value === 'sos') + ); + } + + async handleSosEvent(devId: string, logData: any): Promise { + try { + await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ + deviceTuyaUuid: devId, + status: [{ code: 'sos', value: true }], + log: logData, + }); + + setTimeout(async () => { + try { + await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ + deviceTuyaUuid: devId, + status: [{ code: 'sos', value: false }], + log: logData, + }); + } catch (err) { + this.logger.error('Failed to send SOS false value', err); + } + }, 2000); + } catch (err) { + this.logger.error('Failed to send SOS true value', err); + } + } +} diff --git a/libs/common/src/helper/services/tuya.web.socket.service.ts b/libs/common/src/helper/services/tuya.web.socket.service.ts index 4bf3787..5a810ab 100644 --- a/libs/common/src/helper/services/tuya.web.socket.service.ts +++ b/libs/common/src/helper/services/tuya.web.socket.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import TuyaWebsocket from '../../config/tuya-web-socket-config'; import { ConfigService } from '@nestjs/config'; import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service'; +import { SosHandlerService } from './sos.handler.service'; @Injectable() export class TuyaWebSocketService { @@ -11,6 +12,7 @@ export class TuyaWebSocketService { constructor( private readonly configService: ConfigService, private readonly deviceStatusFirebaseService: DeviceStatusFirebaseService, + private readonly sosHandlerService: SosHandlerService, ) { this.isDevEnv = this.configService.get('NODE_ENV') === 'development'; @@ -42,11 +44,15 @@ export class TuyaWebSocketService { try { const { devId, status, logData } = this.extractMessageData(message); - await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ - deviceTuyaUuid: devId, - status: status, - log: logData, - }); + if (this.sosHandlerService.isSosTriggered(status)) { + await this.sosHandlerService.handleSosEvent(devId, logData); + } else { + await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ + deviceTuyaUuid: devId, + status: status, + log: logData, + }); + } this.client.ackMessage(message.messageId); } catch (error) {