Merge pull request #337 from SyncrowIOT/SP-1346-be-sos-button-real-time-sync-issue

This commit is contained in:
faris Aljohari
2025-04-18 09:21:24 +03:00
committed by GitHub
3 changed files with 55 additions and 5 deletions

View File

@ -12,6 +12,7 @@ import { DeviceNotificationRepository } from '../modules/device/repositories';
import { DeviceStatusFirebaseModule } from '../firebase/devices-status/devices-status.module'; import { DeviceStatusFirebaseModule } from '../firebase/devices-status/devices-status.module';
import { CommunityPermissionService } from './services/community.permission.service'; import { CommunityPermissionService } from './services/community.permission.service';
import { CommunityRepository } from '../modules/community/repositories'; import { CommunityRepository } from '../modules/community/repositories';
import { SosHandlerService } from './services/sos.handler.service';
@Global() @Global()
@Module({ @Module({
@ -25,6 +26,7 @@ import { CommunityRepository } from '../modules/community/repositories';
DeviceMessagesService, DeviceMessagesService,
DeviceNotificationRepository, DeviceNotificationRepository,
CommunityRepository, CommunityRepository,
SosHandlerService,
], ],
exports: [ exports: [
HelperHashService, HelperHashService,

View File

@ -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<void> {
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);
}
}
}

View File

@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import TuyaWebsocket from '../../config/tuya-web-socket-config'; import TuyaWebsocket from '../../config/tuya-web-socket-config';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service'; import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service';
import { SosHandlerService } from './sos.handler.service';
@Injectable() @Injectable()
export class TuyaWebSocketService { export class TuyaWebSocketService {
@ -11,6 +12,7 @@ export class TuyaWebSocketService {
constructor( constructor(
private readonly configService: ConfigService, private readonly configService: ConfigService,
private readonly deviceStatusFirebaseService: DeviceStatusFirebaseService, private readonly deviceStatusFirebaseService: DeviceStatusFirebaseService,
private readonly sosHandlerService: SosHandlerService,
) { ) {
this.isDevEnv = this.isDevEnv =
this.configService.get<string>('NODE_ENV') === 'development'; this.configService.get<string>('NODE_ENV') === 'development';
@ -42,11 +44,15 @@ export class TuyaWebSocketService {
try { try {
const { devId, status, logData } = this.extractMessageData(message); const { devId, status, logData } = this.extractMessageData(message);
await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({ if (this.sosHandlerService.isSosTriggered(status)) {
deviceTuyaUuid: devId, await this.sosHandlerService.handleSosEvent(devId, logData);
status: status, } else {
log: logData, await this.deviceStatusFirebaseService.addDeviceStatusToFirebase({
}); deviceTuyaUuid: devId,
status: status,
log: logData,
});
}
this.client.ackMessage(message.messageId); this.client.ackMessage(message.messageId);
} catch (error) { } catch (error) {