diff --git a/libs/common/src/firebase/devices-status/services/devices-status.service.ts b/libs/common/src/firebase/devices-status/services/devices-status.service.ts index 4b0b0f7..695022b 100644 --- a/libs/common/src/firebase/devices-status/services/devices-status.service.ts +++ b/libs/common/src/firebase/devices-status/services/devices-status.service.ts @@ -76,6 +76,28 @@ export class DeviceStatusFirebaseService { ); } } + async addDeviceStatusToOurDb( + addDeviceStatusDto: AddDeviceStatusDto, + ): Promise { + try { + const device = await this.getDeviceByDeviceTuyaUuid( + addDeviceStatusDto.deviceTuyaUuid, + ); + + if (device?.uuid) { + return await this.createDeviceStatusInOurDb({ + deviceUuid: device.uuid, + ...addDeviceStatusDto, + productType: device.productDevice.prodType, + }); + } + // Return null if device not found or no UUID + return null; + } catch (error) { + // Handle the error silently, perhaps log it internally or ignore it + return null; + } + } async addDeviceStatusToFirebase( addDeviceStatusDto: AddDeviceStatusDto, ): Promise { @@ -211,6 +233,13 @@ export class DeviceStatusFirebaseService { return existingData; }); + // Return the updated data + const snapshot: DataSnapshot = await get(dataRef); + return snapshot.val(); + } + async createDeviceStatusInOurDb( + addDeviceStatusDto: AddDeviceStatusDto, + ): Promise { // Save logs to your repository const newLogs = addDeviceStatusDto.log.properties.map((property) => { return this.deviceStatusLogRepository.create({ @@ -269,8 +298,5 @@ export class DeviceStatusFirebaseService { addDeviceStatusDto.deviceUuid, ); } - // Return the updated data - const snapshot: DataSnapshot = await get(dataRef); - return snapshot.val(); } } diff --git a/libs/common/src/helper/services/sos.handler.service.ts b/libs/common/src/helper/services/sos.handler.service.ts index 4e957dc..e5f9df9 100644 --- a/libs/common/src/helper/services/sos.handler.service.ts +++ b/libs/common/src/helper/services/sos.handler.service.ts @@ -16,7 +16,7 @@ export class SosHandlerService { ); } - async handleSosEvent(devId: string, logData: any): Promise { + async handleSosEventFirebase(devId: string, logData: any): Promise { try { await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ deviceTuyaUuid: devId, @@ -39,4 +39,28 @@ export class SosHandlerService { this.logger.error('Failed to send SOS true value', err); } } + + async handleSosEventOurDb(devId: string, logData: any): Promise { + try { + await this.deviceStatusFirebaseService.addDeviceStatusToOurDb({ + deviceTuyaUuid: devId, + status: [{ code: 'sos', value: true }], + log: logData, + }); + + setTimeout(async () => { + try { + await this.deviceStatusFirebaseService.addDeviceStatusToOurDb({ + 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 dcf07b9..0c32c04 100644 --- a/libs/common/src/helper/services/tuya.web.socket.service.ts +++ b/libs/common/src/helper/services/tuya.web.socket.service.ts @@ -51,6 +51,16 @@ export class TuyaWebSocketService { this.client.message(async (ws: WebSocket, message: any) => { try { const { devId, status, logData } = this.extractMessageData(message); + if (this.sosHandlerService.isSosTriggered(status)) { + await this.sosHandlerService.handleSosEventFirebase(devId, logData); + } else { + // Firebase real-time update + await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ + deviceTuyaUuid: devId, + status: status, + log: logData, + }); + } // Push to internal queue this.messageQueue.push({ devId, status, logData }); @@ -93,9 +103,12 @@ export class TuyaWebSocketService { try { for (const item of batch) { if (this.sosHandlerService.isSosTriggered(item.status)) { - await this.sosHandlerService.handleSosEvent(item.devId, item.logData); + await this.sosHandlerService.handleSosEventOurDb( + item.devId, + item.logData, + ); } else { - await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ + await this.deviceStatusFirebaseService.addDeviceStatusToOurDb({ deviceTuyaUuid: item.devId, status: item.status, log: item.logData,