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 6560276..3972b2a 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 @@ -102,30 +102,28 @@ export class DeviceStatusFirebaseService { } console.log(`📝 Total logs to insert: ${allLogs.length}`); - // Step 3: Insert logs in chunks with ON CONFLICT DO NOTHING - 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') // or use DeviceStatusLogEntity + .values(chunk) + .orIgnore() // skip duplicates + .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}`, @@ -155,7 +153,7 @@ export class DeviceStatusFirebaseService { // Return null if device not found or no UUID return null; } catch (error) { - // Handle the error silently, perhaps log it internally or ignore it + console.error('❌ Error in addDeviceStatusToFirebase:', error); return null; } } diff --git a/libs/common/src/helper/helper.module.ts b/libs/common/src/helper/helper.module.ts index df152e2..41992d3 100644 --- a/libs/common/src/helper/helper.module.ts +++ b/libs/common/src/helper/helper.module.ts @@ -8,7 +8,10 @@ import { TuyaWebSocketService } from './services/tuya.web.socket.service'; import { OneSignalService } from './services/onesignal.service'; import { DeviceMessagesService } from './services/device.messages.service'; import { DeviceRepositoryModule } from '../modules/device/device.repository.module'; -import { DeviceNotificationRepository } from '../modules/device/repositories'; +import { + DeviceNotificationRepository, + DeviceRepository, +} 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'; @@ -27,6 +30,7 @@ import { SosHandlerService } from './services/sos.handler.service'; DeviceNotificationRepository, CommunityRepository, SosHandlerService, + DeviceRepository, ], exports: [ HelperHashService, 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 be32b1d..63de80b 100644 --- a/libs/common/src/helper/services/tuya.web.socket.service.ts +++ b/libs/common/src/helper/services/tuya.web.socket.service.ts @@ -19,11 +19,13 @@ export class TuyaWebSocketService implements OnModuleInit { }[] = []; private isProcessing = false; + private deviceCache: Map = new Map(); constructor( private readonly configService: ConfigService, private readonly deviceStatusFirebaseService: DeviceStatusFirebaseService, private readonly sosHandlerService: SosHandlerService, + private readonly deviceRepository: DeviceRepository, ) { this.isDevEnv = this.configService.get('NODE_ENV') === 'development'; @@ -36,6 +38,11 @@ export class TuyaWebSocketService implements OnModuleInit { maxRetryTimes: 100, }); + this.loadAllActiveDevices(); + + // Reload device cache every 1 hour + setInterval(() => this.loadAllActiveDevices(), 60 * 60 * 1000); + if (this.configService.get('tuya-config.TRUN_ON_TUYA_SOCKET')) { this.setupEventHandlers(); this.client.start(); @@ -86,8 +93,13 @@ export class TuyaWebSocketService implements OnModuleInit { this.client.ackMessage(message.messageId); return; } + if (this.sosHandlerService.isSosTriggered(status)) { - await this.sosHandlerService.handleSosEventFirebase(devId, logData); + await this.sosHandlerService.handleSosEventFirebase( + devId, + logData, + this.deviceCache, + ); } else { // Firebase real-time update await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ @@ -144,12 +156,14 @@ export class TuyaWebSocketService implements OnModuleInit { try { await this.deviceStatusFirebaseService.addBatchDeviceStatusToOurDb( + batch.map((item) => ({ batch.map((item) => ({ deviceTuyaUuid: item.devId, status: item.status, log: item.logData, device: item.device, })), + this.deviceCache, ); } catch (error) { console.error('❌ Error processing batch:', error);