From 76f8f6ba70040518acb57b5a56e48fc99cc645c8 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:08:17 +0300 Subject: [PATCH 1/4] Add Visitor Password Management Module --- .../modules/visitor-password/dtos/index.ts | 1 + .../dtos/visitor-password.dto.ts | 15 +++++++++++ .../visitor-password/entities/index.ts | 1 + .../entities/visitor-password.entity.ts | 25 +++++++++++++++++++ .../visitor-password/repositories/index.ts | 1 + .../visitor-password.repository.ts | 10 ++++++++ .../visitor-password.repository.module.ts | 11 ++++++++ 7 files changed, 64 insertions(+) create mode 100644 libs/common/src/modules/visitor-password/dtos/index.ts create mode 100644 libs/common/src/modules/visitor-password/dtos/visitor-password.dto.ts create mode 100644 libs/common/src/modules/visitor-password/entities/index.ts create mode 100644 libs/common/src/modules/visitor-password/entities/visitor-password.entity.ts create mode 100644 libs/common/src/modules/visitor-password/repositories/index.ts create mode 100644 libs/common/src/modules/visitor-password/repositories/visitor-password.repository.ts create mode 100644 libs/common/src/modules/visitor-password/visitor-password.repository.module.ts diff --git a/libs/common/src/modules/visitor-password/dtos/index.ts b/libs/common/src/modules/visitor-password/dtos/index.ts new file mode 100644 index 0000000..daeb5d8 --- /dev/null +++ b/libs/common/src/modules/visitor-password/dtos/index.ts @@ -0,0 +1 @@ +export * from './visitor-password.dto'; diff --git a/libs/common/src/modules/visitor-password/dtos/visitor-password.dto.ts b/libs/common/src/modules/visitor-password/dtos/visitor-password.dto.ts new file mode 100644 index 0000000..10ed539 --- /dev/null +++ b/libs/common/src/modules/visitor-password/dtos/visitor-password.dto.ts @@ -0,0 +1,15 @@ +import { IsNotEmpty, IsString } from 'class-validator'; + +export class VisitorPasswordDto { + @IsString() + @IsNotEmpty() + public uuid: string; + + @IsString() + @IsNotEmpty() + public authorizerUuid: string; + + @IsString() + @IsNotEmpty() + public passwordTuyaUuid: string; +} diff --git a/libs/common/src/modules/visitor-password/entities/index.ts b/libs/common/src/modules/visitor-password/entities/index.ts new file mode 100644 index 0000000..8b13691 --- /dev/null +++ b/libs/common/src/modules/visitor-password/entities/index.ts @@ -0,0 +1 @@ +export * from './visitor-password.entity'; diff --git a/libs/common/src/modules/visitor-password/entities/visitor-password.entity.ts b/libs/common/src/modules/visitor-password/entities/visitor-password.entity.ts new file mode 100644 index 0000000..f1c0ed6 --- /dev/null +++ b/libs/common/src/modules/visitor-password/entities/visitor-password.entity.ts @@ -0,0 +1,25 @@ +import { Column, Entity, ManyToOne, JoinColumn, Index } from 'typeorm'; +import { VisitorPasswordDto } from '../dtos'; +import { AbstractEntity } from '../../abstract/entities/abstract.entity'; +import { UserEntity } from '../../user/entities/user.entity'; + +@Entity({ name: 'visitor-password' }) +@Index('IDX_PASSWORD_TUYA_UUID', ['passwordTuyaUuid']) +export class VisitorPasswordEntity extends AbstractEntity { + @Column({ + nullable: false, + unique: true, + }) + public passwordTuyaUuid: string; + + @ManyToOne(() => UserEntity, (user) => user.visitorPasswords, { + nullable: false, + }) + @JoinColumn({ name: 'authorizer_uuid' }) + public user: UserEntity; + + constructor(partial: Partial) { + super(); + Object.assign(this, partial); + } +} diff --git a/libs/common/src/modules/visitor-password/repositories/index.ts b/libs/common/src/modules/visitor-password/repositories/index.ts new file mode 100644 index 0000000..2b62574 --- /dev/null +++ b/libs/common/src/modules/visitor-password/repositories/index.ts @@ -0,0 +1 @@ +export * from './visitor-password.repository'; diff --git a/libs/common/src/modules/visitor-password/repositories/visitor-password.repository.ts b/libs/common/src/modules/visitor-password/repositories/visitor-password.repository.ts new file mode 100644 index 0000000..4414a5b --- /dev/null +++ b/libs/common/src/modules/visitor-password/repositories/visitor-password.repository.ts @@ -0,0 +1,10 @@ +import { DataSource, Repository } from 'typeorm'; +import { Injectable } from '@nestjs/common'; +import { VisitorPasswordEntity } from '../entities/visitor-password.entity'; + +@Injectable() +export class VisitorPasswordRepository extends Repository { + constructor(private dataSource: DataSource) { + super(VisitorPasswordEntity, dataSource.createEntityManager()); + } +} diff --git a/libs/common/src/modules/visitor-password/visitor-password.repository.module.ts b/libs/common/src/modules/visitor-password/visitor-password.repository.module.ts new file mode 100644 index 0000000..b6a2182 --- /dev/null +++ b/libs/common/src/modules/visitor-password/visitor-password.repository.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { VisitorPasswordEntity } from './entities/visitor-password.entity'; + +@Module({ + providers: [], + exports: [], + controllers: [], + imports: [TypeOrmModule.forFeature([VisitorPasswordEntity])], +}) +export class VisitorPasswordRepositoryModule {} From ef4541a371249617b42887f69acf0258b0c6151d Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:08:31 +0300 Subject: [PATCH 2/4] Add Visitor Password Entity and Relationships --- libs/common/src/database/database.module.ts | 2 ++ libs/common/src/modules/user/entities/user.entity.ts | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/libs/common/src/database/database.module.ts b/libs/common/src/database/database.module.ts index 1934a18..ae01e55 100644 --- a/libs/common/src/database/database.module.ts +++ b/libs/common/src/database/database.module.ts @@ -18,6 +18,7 @@ import { UserNotificationEntity } from '../modules/user/entities'; import { DeviceNotificationEntity } from '../modules/device/entities'; import { RegionEntity } from '../modules/region/entities'; import { TimeZoneEntity } from '../modules/timezone/entities'; +import { VisitorPasswordEntity } from '../modules/visitor-password/entities'; @Module({ imports: [ @@ -50,6 +51,7 @@ import { TimeZoneEntity } from '../modules/timezone/entities'; DeviceNotificationEntity, RegionEntity, TimeZoneEntity, + VisitorPasswordEntity, ], namingStrategy: new SnakeNamingStrategy(), synchronize: Boolean(JSON.parse(configService.get('DB_SYNC'))), diff --git a/libs/common/src/modules/user/entities/user.entity.ts b/libs/common/src/modules/user/entities/user.entity.ts index acc9ad7..141f5de 100644 --- a/libs/common/src/modules/user/entities/user.entity.ts +++ b/libs/common/src/modules/user/entities/user.entity.ts @@ -25,6 +25,7 @@ import { TimeZoneEntity } from '../../timezone/entities'; import { OtpType } from '../../../../src/constants/otp-type.enum'; import { RoleTypeEntity } from '../../role-type/entities'; import { SpaceEntity } from '../../space/entities'; +import { VisitorPasswordEntity } from '../../visitor-password/entities'; @Entity({ name: 'user' }) export class UserEntity extends AbstractEntity { @@ -109,6 +110,11 @@ export class UserEntity extends AbstractEntity { nullable: true, }) timezone: TimeZoneEntity; + @OneToMany( + () => VisitorPasswordEntity, + (visitorPassword) => visitorPassword.user, + ) + public visitorPasswords: VisitorPasswordEntity[]; constructor(partial: Partial) { super(); Object.assign(this, partial); From 2a596d3b33b464e047f77cc6e2b58227baecee42 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:09:33 +0300 Subject: [PATCH 3/4] Add Comprehensive Door Lock Module Enhancements --- src/door-lock/door.lock.module.ts | 16 +- src/door-lock/services/door.lock.service.ts | 236 ++++++++++++++------ 2 files changed, 182 insertions(+), 70 deletions(-) diff --git a/src/door-lock/door.lock.module.ts b/src/door-lock/door.lock.module.ts index 3b1920e..b72fad9 100644 --- a/src/door-lock/door.lock.module.ts +++ b/src/door-lock/door.lock.module.ts @@ -5,10 +5,24 @@ import { ConfigModule } from '@nestjs/config'; import { DeviceRepositoryModule } from '@app/common/modules/device'; import { DeviceRepository } from '@app/common/modules/device/repositories'; import { PasswordEncryptionService } from './services/encryption.services'; +import { VisitorPasswordRepository } from '@app/common/modules/visitor-password/repositories'; +import { DeviceService } from 'src/device/services'; +import { ProductRepository } from '@app/common/modules/product/repositories'; +import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service'; +import { SpaceRepository } from '@app/common/modules/space/repositories'; @Module({ imports: [ConfigModule, DeviceRepositoryModule], controllers: [DoorLockController], - providers: [DoorLockService, PasswordEncryptionService, DeviceRepository], + providers: [ + DoorLockService, + PasswordEncryptionService, + DeviceRepository, + VisitorPasswordRepository, + DeviceService, + ProductRepository, + DeviceStatusFirebaseService, + SpaceRepository, + ], exports: [DoorLockService], }) export class DoorLockModule {} diff --git a/src/door-lock/services/door.lock.service.ts b/src/door-lock/services/door.lock.service.ts index e875f67..8f81c16 100644 --- a/src/door-lock/services/door.lock.service.ts +++ b/src/door-lock/services/door.lock.service.ts @@ -22,6 +22,8 @@ import { AddDoorLockOfflineTempMultipleTimeDto } from '../dtos/add.offline-temp. import { convertKeysToCamelCase } from '@app/common/helper/camelCaseConverter'; import { UpdateDoorLockOfflineTempDto } from '../dtos/update.offline-temp.dto'; import { defaultDoorLockPass } from '@app/common/constants/default.door-lock-pass'; +import { VisitorPasswordRepository } from '@app/common/modules/visitor-password/repositories'; +import { DeviceService } from 'src/device/services'; @Injectable() export class DoorLockService { @@ -29,7 +31,9 @@ export class DoorLockService { constructor( private readonly configService: ConfigService, private readonly deviceRepository: DeviceRepository, + private readonly deviceService: DeviceService, private readonly passwordEncryptionService: PasswordEncryptionService, + private readonly visitorPasswordRepository: VisitorPasswordRepository, ) { const accessKey = this.configService.get('auth-config.ACCESS_KEY'); const secretKey = this.configService.get('auth-config.SECRET_KEY'); @@ -105,6 +109,10 @@ export class DoorLockService { HttpStatus.BAD_REQUEST, ); } + const deviceTuyaDetails = + await this.deviceService.getDeviceDetailsByDeviceIdTuya( + deviceDetails.deviceTuyaUuid, + ); const passwords = await this.getTemporaryOfflinePasswordsTuya( deviceDetails.deviceTuyaUuid, 'multiple', @@ -115,23 +123,37 @@ export class DoorLockService { } if (passwords.result.records.length > 0) { return fromVisitor - ? convertKeysToCamelCase(passwords.result.records).map((password) => { - const timestampInSeconds = Math.floor(Date.now() / 1000); - return { - passwordId: `${password.pwdId}`, - invalidTime: `${password.gmtExpired}`, - effectiveTime: `${password.gmtStart}`, - passwordCreated: `${password.gmtCreate}`, - createdTime: password.pwdName, - passwordType: 'OFFLINE_MULTIPLE', - deviceUuid: doorLockUuid, - passwordStatus: isExpired - ? 'EXPIRED' - : timestampInSeconds > password.effectiveTime - ? 'EFFECTIVE' - : 'TO_BE_EFFECTIVE', - }; - }) + ? Promise.all( + convertKeysToCamelCase(passwords.result.records).map( + async (password) => { + const passwordFromDB = await this.getVisitorPasswordFromDB( + password.pwdId, + ); + const timestampInSeconds = Math.floor(Date.now() / 1000); + return { + passwordId: `${password.pwdId}`, + invalidTime: `${password.gmtExpired}`, + effectiveTime: `${password.gmtStart}`, + passwordCreated: `${password.gmtCreate}`, + createdTime: password.pwdName, + passwordType: 'OFFLINE_MULTIPLE', + deviceUuid: doorLockUuid, + deviceName: deviceTuyaDetails.name, + passwordStatus: isExpired + ? 'EXPIRED' + : timestampInSeconds > password.effectiveTime + ? 'EFFECTIVE' + : 'TO_BE_EFFECTIVE', + authorizerEmail: passwordFromDB + ? passwordFromDB.user.email + : 'OTHER', + authorizerDate: passwordFromDB + ? `${Math.floor(new Date(passwordFromDB.createdAt).getTime() / 1000)}` + : '', + }; + }, + ), + ) : convertKeysToCamelCase(passwords.result.records); } return passwords; @@ -158,6 +180,10 @@ export class DoorLockService { HttpStatus.BAD_REQUEST, ); } + const deviceTuyaDetails = + await this.deviceService.getDeviceDetailsByDeviceIdTuya( + deviceDetails.deviceTuyaUuid, + ); const passwords = await this.getTemporaryOfflinePasswordsTuya( deviceDetails.deviceTuyaUuid, 'once', @@ -168,23 +194,38 @@ export class DoorLockService { } if (passwords.result.records.length > 0) { return fromVisitor - ? convertKeysToCamelCase(passwords.result.records).map((password) => { - const timestampInSeconds = Math.floor(Date.now() / 1000); - return { - passwordId: `${password.pwdId}`, - invalidTime: `${password.gmtExpired}`, - effectiveTime: `${password.gmtStart}`, - createdTime: `${password.gmtCreate}`, - passwordName: password.pwdName, - passwordType: 'OFFLINE_ONETIME', - deviceUuid: doorLockUuid, - passwordStatus: isExpired - ? 'EXPIRED' - : timestampInSeconds > password.gmtStart - ? 'EFFECTIVE' - : 'TO_BE_EFFECTIVE', - }; - }) + ? Promise.all( + convertKeysToCamelCase(passwords.result.records).map( + async (password) => { + const passwordFromDB = await this.getVisitorPasswordFromDB( + password.pwdId, + ); + + const timestampInSeconds = Math.floor(Date.now() / 1000); + return { + passwordId: `${password.pwdId}`, + invalidTime: `${password.gmtExpired}`, + effectiveTime: `${password.gmtStart}`, + createdTime: `${password.gmtCreate}`, + passwordName: password.pwdName, + passwordType: 'OFFLINE_ONETIME', + deviceUuid: doorLockUuid, + deviceName: deviceTuyaDetails.name, + passwordStatus: isExpired + ? 'EXPIRED' + : timestampInSeconds > password.gmtStart + ? 'EFFECTIVE' + : 'TO_BE_EFFECTIVE', + authorizerEmail: passwordFromDB + ? passwordFromDB.user.email + : 'OTHER', + authorizerDate: passwordFromDB + ? `${Math.floor(new Date(passwordFromDB.createdAt).getTime() / 1000)}` + : '', + }; + }, + ), + ) : convertKeysToCamelCase(passwords.result.records); } @@ -212,6 +253,10 @@ export class DoorLockService { HttpStatus.BAD_REQUEST, ); } + const deviceTuyaDetails = + await this.deviceService.getDeviceDetailsByDeviceIdTuya( + deviceDetails.deviceTuyaUuid, + ); const passwords = await this.getOnlineTemporaryPasswordsMultipleTuya( deviceDetails.deviceTuyaUuid, isExpired, @@ -240,24 +285,36 @@ export class DoorLockService { }); return fromVisitor - ? convertKeysToCamelCase(passwordFiltered).map((password) => { - const timestampInSeconds = Math.floor(Date.now() / 1000); - return { - passwordId: `${password.id}`, - invalidTime: `${password.invalidTime}`, - effectiveTime: `${password.effectiveTime}`, - createdTime: '', - scheduleList: password?.scheduleList, - passwordName: password.name, - passwordType: 'ONLINE_MULTIPLE', - deviceUuid: doorLockUuid, - passwordStatus: isExpired - ? 'EXPIRED' - : timestampInSeconds > password.effectiveTime - ? 'EFFECTIVE' - : 'TO_BE_EFFECTIVE', - }; - }) + ? Promise.all( + convertKeysToCamelCase(passwordFiltered).map(async (password) => { + const passwordFromDB = await this.getVisitorPasswordFromDB( + password.id, + ); + const timestampInSeconds = Math.floor(Date.now() / 1000); + return { + passwordId: `${password.id}`, + invalidTime: `${password.invalidTime}`, + effectiveTime: `${password.effectiveTime}`, + createdTime: '', + scheduleList: password?.scheduleList, + passwordName: password.name, + passwordType: 'ONLINE_MULTIPLE', + deviceUuid: doorLockUuid, + deviceName: deviceTuyaDetails.name, + passwordStatus: isExpired + ? 'EXPIRED' + : timestampInSeconds > password.effectiveTime + ? 'EFFECTIVE' + : 'TO_BE_EFFECTIVE', + authorizerEmail: passwordFromDB + ? passwordFromDB.user.email + : 'OTHER', + authorizerDate: passwordFromDB + ? `${Math.floor(new Date(passwordFromDB.createdAt).getTime() / 1000)}` + : '', + }; + }), + ) : convertKeysToCamelCase(passwordFiltered); } if (fromVisitor) { @@ -271,12 +328,34 @@ export class DoorLockService { ); } } + async getVisitorPasswordFromDB(passwordId: string) { + try { + return await this.visitorPasswordRepository.findOne({ + where: { + passwordTuyaUuid: passwordId, + }, + relations: ['user'], + select: { + user: { + email: true, + }, + }, + }); + } catch (error) { + throw new HttpException( + error.message || 'Error retrieving visitor password from database', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } + async getOnlineTemporaryPasswordsOneTime( doorLockUuid: string, fromVisitor?: boolean, isExpired?: boolean, ) { try { + // Retrieve device details const deviceDetails = await this.getDeviceByDeviceUuid(doorLockUuid); if (!deviceDetails || !deviceDetails.deviceTuyaUuid) { @@ -287,11 +366,17 @@ export class DoorLockService { HttpStatus.BAD_REQUEST, ); } + const deviceTuyaDetails = + await this.deviceService.getDeviceDetailsByDeviceIdTuya( + deviceDetails.deviceTuyaUuid, + ); + // Get online temporary passwords const passwords = await this.getOnlineTemporaryPasswordsMultipleTuya( deviceDetails.deviceTuyaUuid, isExpired, ); if (passwords.result?.length > 0) { + // Filter and map the passwords const passwordFiltered = passwords.result .filter((item) => item.type === 1) .map((password: any) => { @@ -314,24 +399,37 @@ export class DoorLockService { return password; }); + // Process passwords with optimized query handling return fromVisitor - ? convertKeysToCamelCase(passwordFiltered).map((password) => { - const timestampInSeconds = Math.floor(Date.now() / 1000); - return { - passwordId: `${password.id}`, - invalidTime: `${password.invalidTime}`, - effectiveTime: `${password.effectiveTime}`, - createdTime: '', - passwordName: password.name, - passwordType: 'ONLINE_ONETIME', - deviceUuid: doorLockUuid, - passwordStatus: isExpired - ? 'EXPIRED' - : timestampInSeconds > password.effectiveTime - ? 'EFFECTIVE' - : 'TO_BE_EFFECTIVE', - }; - }) + ? Promise.all( + convertKeysToCamelCase(passwordFiltered).map(async (password) => { + const passwordFromDB = await this.getVisitorPasswordFromDB( + password.id, + ); + const timestampInSeconds = Math.floor(Date.now() / 1000); + return { + passwordId: `${password.id}`, + invalidTime: `${password.invalidTime}`, + effectiveTime: `${password.effectiveTime}`, + createdTime: '', + passwordName: password.name, + passwordType: 'ONLINE_ONETIME', + deviceUuid: doorLockUuid, + deviceName: deviceTuyaDetails.name, + passwordStatus: isExpired + ? 'EXPIRED' + : timestampInSeconds > password.effectiveTime + ? 'EFFECTIVE' + : 'TO_BE_EFFECTIVE', + authorizerEmail: passwordFromDB + ? passwordFromDB.user.email + : 'OTHER', + authorizerDate: passwordFromDB + ? `${Math.floor(new Date(passwordFromDB.createdAt).getTime() / 1000)}` + : '', + }; + }), + ) : convertKeysToCamelCase(passwordFiltered); } if (fromVisitor) { From e8e68f7dfc56402028b8d6bef4043a39ae058661 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:10:20 +0300 Subject: [PATCH 4/4] Add User UUID to Temporary Passwords and Save to Repository --- .../visitor-password.controller.ts | 13 +++++ .../services/visitor-password.service.ts | 50 ++++++++++++++++--- .../visitor-password.module.ts | 2 + 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/vistor-password/controllers/visitor-password.controller.ts b/src/vistor-password/controllers/visitor-password.controller.ts index f1a84bb..bdd4324 100644 --- a/src/vistor-password/controllers/visitor-password.controller.ts +++ b/src/vistor-password/controllers/visitor-password.controller.ts @@ -7,6 +7,7 @@ import { HttpStatus, UseGuards, Get, + Req, } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { @@ -31,11 +32,14 @@ export class VisitorPasswordController { @Post('temporary-password/online/multiple-time') async addOnlineTemporaryPasswordMultipleTime( @Body() addDoorLockOnlineMultipleDto: AddDoorLockOnlineMultipleDto, + @Req() req: any, ) { try { + const userUuid = req.user.uuid; const temporaryPasswords = await this.visitorPasswordService.addOnlineTemporaryPasswordMultipleTime( addDoorLockOnlineMultipleDto, + userUuid, ); return { @@ -54,11 +58,14 @@ export class VisitorPasswordController { @Post('temporary-password/online/one-time') async addOnlineTemporaryPassword( @Body() addDoorLockOnlineOneTimeDto: AddDoorLockOnlineOneTimeDto, + @Req() req: any, ) { try { + const userUuid = req.user.uuid; const temporaryPasswords = await this.visitorPasswordService.addOnlineTemporaryPasswordOneTime( addDoorLockOnlineOneTimeDto, + userUuid, ); return { @@ -77,11 +84,14 @@ export class VisitorPasswordController { @Post('temporary-password/offline/one-time') async addOfflineOneTimeTemporaryPassword( @Body() addDoorLockOfflineOneTimeDto: AddDoorLockOfflineOneTimeDto, + @Req() req: any, ) { try { + const userUuid = req.user.uuid; const temporaryPassword = await this.visitorPasswordService.addOfflineOneTimeTemporaryPassword( addDoorLockOfflineOneTimeDto, + userUuid, ); return { @@ -101,11 +111,14 @@ export class VisitorPasswordController { async addOfflineMultipleTimeTemporaryPassword( @Body() addDoorLockOfflineMultipleDto: AddDoorLockOfflineMultipleDto, + @Req() req: any, ) { try { + const userUuid = req.user.uuid; const temporaryPassword = await this.visitorPasswordService.addOfflineMultipleTimeTemporaryPassword( addDoorLockOfflineMultipleDto, + userUuid, ); return { diff --git a/src/vistor-password/services/visitor-password.service.ts b/src/vistor-password/services/visitor-password.service.ts index c18ee84..f15b8e4 100644 --- a/src/vistor-password/services/visitor-password.service.ts +++ b/src/vistor-password/services/visitor-password.service.ts @@ -1,3 +1,4 @@ +import { VisitorPasswordRepository } from './../../../libs/common/src/modules/visitor-password/repositories/visitor-password.repository'; import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; import { TuyaContext } from '@tuya/tuya-connector-nodejs'; import { ConfigService } from '@nestjs/config'; @@ -26,6 +27,7 @@ export class VisitorPasswordService { constructor( private readonly configService: ConfigService, private readonly deviceRepository: DeviceRepository, + private readonly visitorPasswordRepository: VisitorPasswordRepository, private readonly emailService: EmailService, private readonly doorLockService: DoorLockService, private readonly deviceService: DeviceService, @@ -43,6 +45,7 @@ export class VisitorPasswordService { async addOfflineMultipleTimeTemporaryPassword( addDoorLockOfflineMultipleDto: AddDoorLockOfflineMultipleDto, + userUuid: string, ) { try { const deviceResults = await Promise.allSettled( @@ -87,7 +90,14 @@ export class VisitorPasswordService { emailBody, ); } - + if (createMultipleOfflinePass.result.offline_temp_password_id) { + await this.visitorPasswordRepository.save({ + passwordTuyaUuid: `${createMultipleOfflinePass.result.offline_temp_password_id}`, + user: { + uuid: userUuid, + }, + }); + } return { success: true, result: createMultipleOfflinePass.result, @@ -156,6 +166,7 @@ export class VisitorPasswordService { async addOfflineOneTimeTemporaryPassword( addDoorLockOfflineOneTimeDto: AddDoorLockOfflineOneTimeDto, + userUuid: string, ) { try { const deviceResults = await Promise.allSettled( @@ -200,7 +211,14 @@ export class VisitorPasswordService { emailBody, ); } - + if (createOnceOfflinePass.result.offline_temp_password_id) { + await this.visitorPasswordRepository.save({ + passwordTuyaUuid: `${createOnceOfflinePass.result.offline_temp_password_id}`, + user: { + uuid: userUuid, + }, + }); + } return { success: true, result: createOnceOfflinePass.result, @@ -299,6 +317,7 @@ export class VisitorPasswordService { } async addOnlineTemporaryPasswordMultipleTime( addDoorLockOnlineMultipleDto: AddDoorLockOnlineMultipleDto, + userUuid: string, ) { try { const deviceResults = await Promise.allSettled( @@ -343,7 +362,14 @@ export class VisitorPasswordService { emailBody, ); } - + if (createPass.result.id) { + await this.visitorPasswordRepository.save({ + passwordTuyaUuid: `${createPass.result.id}`, + user: { + uuid: userUuid, + }, + }); + } return { success: true, id: createPass.result.id, @@ -431,18 +457,18 @@ export class VisitorPasswordService { this.doorLockService .getOnlineTemporaryPasswordsMultiple(deviceId.uuid, true, true) .catch(() => {}), - this.doorLockService - .getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, true) - .catch(() => {}), this.doorLockService .getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, false) .catch(() => {}), this.doorLockService - .getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, true) + .getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, true) .catch(() => {}), this.doorLockService .getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, false) .catch(() => {}), + this.doorLockService + .getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, true) + .catch(() => {}), ); }); return (await Promise.all(data)).flat().filter((datum) => { @@ -476,6 +502,7 @@ export class VisitorPasswordService { async addOnlineTemporaryPasswordOneTime( addDoorLockOnlineOneTimeDto: AddDoorLockOnlineOneTimeDto, + userUuid: string, ) { try { const deviceResults = await Promise.allSettled( @@ -519,7 +546,14 @@ export class VisitorPasswordService { emailBody, ); } - + if (createPass.result.id) { + await this.visitorPasswordRepository.save({ + passwordTuyaUuid: `${createPass.result.id}`, + user: { + uuid: userUuid, + }, + }); + } return { success: true, id: createPass.result.id, diff --git a/src/vistor-password/visitor-password.module.ts b/src/vistor-password/visitor-password.module.ts index 33454a3..19e61ea 100644 --- a/src/vistor-password/visitor-password.module.ts +++ b/src/vistor-password/visitor-password.module.ts @@ -11,6 +11,7 @@ import { DeviceService } from 'src/device/services'; import { ProductRepository } from '@app/common/modules/product/repositories'; import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service'; import { SpaceRepository } from '@app/common/modules/space/repositories'; +import { VisitorPasswordRepository } from '@app/common/modules/visitor-password/repositories'; @Module({ imports: [ConfigModule, DeviceRepositoryModule, DoorLockModule], controllers: [VisitorPasswordController], @@ -23,6 +24,7 @@ import { SpaceRepository } from '@app/common/modules/space/repositories'; DeviceStatusFirebaseService, SpaceRepository, DeviceRepository, + VisitorPasswordRepository, ], exports: [VisitorPasswordService], })