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 fd40f8b..027526b 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 @@ -1,15 +1,13 @@ +import { DeviceStatusLogRepository } from '@app/common/modules/device-status-log/repositories'; +import { DeviceRepository } from '@app/common/modules/device/repositories'; import { HttpException, HttpStatus, Injectable, NotFoundException, } from '@nestjs/common'; -import { AddDeviceStatusDto } from '../dtos/add.devices-status.dto'; -import { DeviceRepository } from '@app/common/modules/device/repositories'; -import { GetDeviceDetailsFunctionsStatusInterface } from 'src/device/interfaces/get.device.interface'; -import { TuyaContext } from '@tuya/tuya-connector-nodejs'; import { ConfigService } from '@nestjs/config'; -import { firebaseDataBase } from '../../firebase.config'; +import { TuyaContext } from '@tuya/tuya-connector-nodejs'; import { Database, DataSnapshot, @@ -17,7 +15,9 @@ import { ref, runTransaction, } from 'firebase/database'; -import { DeviceStatusLogRepository } from '@app/common/modules/device-status-log/repositories'; +import { GetDeviceDetailsFunctionsStatusInterface } from 'src/device/interfaces/get.device.interface'; +import { firebaseDataBase } from '../../firebase.config'; +import { AddDeviceStatusDto } from '../dtos/add.devices-status.dto'; @Injectable() export class DeviceStatusFirebaseService { private tuya: TuyaContext; @@ -79,64 +79,77 @@ export class DeviceStatusFirebaseService { device: any; }[], ): Promise { - const allLogs = []; - console.log(`🔁 Preparing logs from batch of ${batch.length} items...`); + const allLogs = []; + for (const item of batch) { const device = item.device; + if (!device?.uuid) { console.log(`⛔ Skipped unknown device: ${item.deviceTuyaUuid}`); continue; } - const logs = item.log.properties.map((property) => + // Determine properties based on environment + const properties = + this.isDevEnv && Array.isArray(item.log?.properties) + ? item.log.properties + : Array.isArray(item.status) + ? item.status + : null; + + if (!properties) { + console.log( + `⛔ Skipped invalid status/properties for device: ${item.deviceTuyaUuid}`, + ); + continue; + } + + const logs = properties.map((property) => this.deviceStatusLogRepository.create({ deviceId: device.uuid, deviceTuyaId: item.deviceTuyaUuid, - productId: item.log.productId, + productId: device.productDevice?.uuid, log: item.log, code: property.code, value: property.value, - eventId: item.log.dataId, - eventTime: new Date(property.time).toISOString(), + eventId: item.log?.dataId, + eventTime: new Date( + this.isDevEnv ? property.time : property.t, + ).toISOString(), }), ); + allLogs.push(...logs); } console.log(`📝 Total logs to insert: ${allLogs.length}`); - const insertLogsPromise = (async () => { - const chunkSize = 300; - let insertedCount = 0; + const chunkSize = 300; + let insertedCount = 0; - for (let i = 0; i < allLogs.length; i += chunkSize) { - const chunk = allLogs.slice(i, i + chunkSize); - try { - const result = await this.deviceStatusLogRepository - .createQueryBuilder() - .insert() - .into('device-status-log') // or use DeviceStatusLogEntity - .values(chunk) - .orIgnore() // skip duplicates - .execute(); + for (let i = 0; i < allLogs.length; i += chunkSize) { + const chunk = allLogs.slice(i, i + chunkSize); + try { + const result = await this.deviceStatusLogRepository + .createQueryBuilder() + .insert() + .into('device-status-log') + .values(chunk) + .orIgnore() + .execute(); - insertedCount += result.identifiers.length; - console.log( - `✅ Inserted ${result.identifiers.length} / ${chunk.length} logs (chunk)`, - ); - } catch (error) { - console.error('❌ Insert error (skipped chunk):', error.message); - } + insertedCount += result.identifiers.length; + console.log( + `✅ Inserted ${result.identifiers.length} / ${chunk.length} logs (chunk)`, + ); + } catch (error) { + console.error('❌ Insert error (skipped chunk):', error.message); } + } - console.log( - `✅ Total logs inserted: ${insertedCount} / ${allLogs.length}`, - ); - })(); - - await insertLogsPromise; + console.log(`✅ Total logs inserted: ${insertedCount} / ${allLogs.length}`); } async addDeviceStatusToFirebase( 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 d30200f..1376343 100644 --- a/libs/common/src/helper/services/tuya.web.socket.service.ts +++ b/libs/common/src/helper/services/tuya.web.socket.service.ts @@ -1,9 +1,9 @@ -import { Injectable, OnModuleInit } 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'; +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import * as NodeCache from 'node-cache'; +import TuyaWebsocket from '../../config/tuya-web-socket-config'; +import { SosHandlerService } from './sos.handler.service'; @Injectable() export class TuyaWebSocketService implements OnModuleInit { @@ -74,7 +74,12 @@ export class TuyaWebSocketService implements OnModuleInit { this.client.message(async (ws: WebSocket, message: any) => { try { const { devId, status, logData } = this.extractMessageData(message); - if (!Array.isArray(logData?.properties)) { + // console.log( + // `📬 Received message for device: ${devId}, status:`, + // status, + // logData, + // ); + if (!Array.isArray(status)) { this.client.ackMessage(message.messageId); return; } @@ -162,6 +167,8 @@ export class TuyaWebSocketService implements OnModuleInit { status: any; logData: any; } { + // console.log('Received message:', message); + const payloadData = message.payload.data; if (this.isDevEnv) {