Compare commits

...

1 Commits

Author SHA1 Message Date
7ea53feddc add deviceName to handle password API 2025-06-30 08:54:25 +03:00

View File

@ -1,39 +1,39 @@
import { VisitorPasswordRepository } from './../../../libs/common/src/modules/visitor-password/repositories/visitor-password.repository'; import { ProductType } from '@app/common/constants/product-type.enum';
import { DeviceRepository } from '@app/common/modules/device/repositories';
import { import {
Injectable, BadRequestException,
HttpException, HttpException,
HttpStatus, HttpStatus,
BadRequestException, Injectable,
} from '@nestjs/common'; } from '@nestjs/common';
import { TuyaContext } from '@tuya/tuya-connector-nodejs';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { TuyaContext } from '@tuya/tuya-connector-nodejs';
import { import {
addDeviceObjectInterface, addDeviceObjectInterface,
createTickInterface, createTickInterface,
} from '../interfaces/visitor-password.interface'; } from '../interfaces/visitor-password.interface';
import { DeviceRepository } from '@app/common/modules/device/repositories'; import { VisitorPasswordRepository } from './../../../libs/common/src/modules/visitor-password/repositories/visitor-password.repository';
import { ProductType } from '@app/common/constants/product-type.enum';
import { AddDoorLockTemporaryPasswordDto } from '../dtos';
import { EmailService } from '@app/common/util/email.service';
import { PasswordEncryptionService } from 'src/door-lock/services/encryption.services';
import { DoorLockService } from 'src/door-lock/services';
import { DeviceService } from 'src/device/services';
import { DeviceStatuses } from '@app/common/constants/device-status.enum';
import { import {
DaysEnum, DaysEnum,
EnableDisableStatusEnum, EnableDisableStatusEnum,
} from '@app/common/constants/days.enum'; } from '@app/common/constants/days.enum';
import { PasswordType } from '@app/common/constants/password-type.enum'; import { DeviceStatuses } from '@app/common/constants/device-status.enum';
import { import {
CommonHourMinutes, CommonHourMinutes,
CommonHours, CommonHours,
} from '@app/common/constants/hours-minutes.enum'; } from '@app/common/constants/hours-minutes.enum';
import { ProjectRepository } from '@app/common/modules/project/repositiories'; import { ORPHAN_SPACE_NAME } from '@app/common/constants/orphan-constant';
import { PasswordType } from '@app/common/constants/password-type.enum';
import { VisitorPasswordEnum } from '@app/common/constants/visitor-password.enum'; import { VisitorPasswordEnum } from '@app/common/constants/visitor-password.enum';
import { SuccessResponseDto } from '@app/common/dto/success.response.dto'; import { SuccessResponseDto } from '@app/common/dto/success.response.dto';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { EmailService } from '@app/common/util/email.service';
import { DeviceService } from 'src/device/services';
import { DoorLockService } from 'src/door-lock/services';
import { PasswordEncryptionService } from 'src/door-lock/services/encryption.services';
import { Not } from 'typeorm'; import { Not } from 'typeorm';
import { ORPHAN_SPACE_NAME } from '@app/common/constants/orphan-constant'; import { AddDoorLockTemporaryPasswordDto } from '../dtos';
@Injectable() @Injectable()
export class VisitorPasswordService { export class VisitorPasswordService {
@ -57,6 +57,67 @@ export class VisitorPasswordService {
secretKey, secretKey,
}); });
} }
async getPasswords(projectUuid: string) {
await this.validateProject(projectUuid);
const deviceIds = await this.deviceRepository.find({
where: {
productDevice: {
prodType: ProductType.DL,
},
spaceDevice: {
spaceName: Not(ORPHAN_SPACE_NAME),
community: {
project: {
uuid: projectUuid,
},
},
},
isActive: true,
},
});
const data = [];
deviceIds.forEach((deviceId) => {
data.push(
this.doorLockService
.getOnlineTemporaryPasswordsOneTime(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOnlineTemporaryPasswordsOneTime(deviceId.uuid, true, true)
.catch(() => {}),
this.doorLockService
.getOnlineTemporaryPasswordsMultiple(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOnlineTemporaryPasswordsMultiple(deviceId.uuid, true, true)
.catch(() => {}),
this.doorLockService
.getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, true)
.catch(() => {}),
this.doorLockService
.getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, true)
.catch(() => {}),
);
});
const result = (await Promise.all(data)).flat().filter((datum) => {
return datum != null;
});
return new SuccessResponseDto({
message: 'Successfully retrieved temporary passwords',
data: result,
statusCode: HttpStatus.OK,
});
}
async handleTemporaryPassword( async handleTemporaryPassword(
addDoorLockTemporaryPasswordDto: AddDoorLockTemporaryPasswordDto, addDoorLockTemporaryPasswordDto: AddDoorLockTemporaryPasswordDto,
userUuid: string, userUuid: string,
@ -105,7 +166,7 @@ export class VisitorPasswordService {
statusCode: HttpStatus.CREATED, statusCode: HttpStatus.CREATED,
}); });
} }
async addOfflineMultipleTimeTemporaryPassword( private async addOfflineMultipleTimeTemporaryPassword(
addDoorLockOfflineMultipleDto: AddDoorLockTemporaryPasswordDto, addDoorLockOfflineMultipleDto: AddDoorLockTemporaryPasswordDto,
userUuid: string, userUuid: string,
projectUuid: string, projectUuid: string,
@ -169,6 +230,7 @@ export class VisitorPasswordService {
success: true, success: true,
result: createMultipleOfflinePass.result, result: createMultipleOfflinePass.result,
deviceUuid, deviceUuid,
deviceName: deviceDetails.name,
}; };
} catch (error) { } catch (error) {
return { return {
@ -231,7 +293,7 @@ export class VisitorPasswordService {
} }
} }
async addOfflineOneTimeTemporaryPassword( private async addOfflineOneTimeTemporaryPassword(
addDoorLockOfflineOneTimeDto: AddDoorLockTemporaryPasswordDto, addDoorLockOfflineOneTimeDto: AddDoorLockTemporaryPasswordDto,
userUuid: string, userUuid: string,
projectUuid: string, projectUuid: string,
@ -295,6 +357,7 @@ export class VisitorPasswordService {
success: true, success: true,
result: createOnceOfflinePass.result, result: createOnceOfflinePass.result,
deviceUuid, deviceUuid,
deviceName: deviceDetails.name,
}; };
} catch (error) { } catch (error) {
return { return {
@ -357,7 +420,7 @@ export class VisitorPasswordService {
} }
} }
async addOfflineTemporaryPasswordTuya( private async addOfflineTemporaryPasswordTuya(
doorLockUuid: string, doorLockUuid: string,
type: string, type: string,
addDoorLockOfflineMultipleDto: AddDoorLockTemporaryPasswordDto, addDoorLockOfflineMultipleDto: AddDoorLockTemporaryPasswordDto,
@ -387,7 +450,7 @@ export class VisitorPasswordService {
); );
} }
} }
async addOnlineTemporaryPasswordMultipleTime( private async addOnlineTemporaryPasswordMultipleTime(
addDoorLockOnlineMultipleDto: AddDoorLockTemporaryPasswordDto, addDoorLockOnlineMultipleDto: AddDoorLockTemporaryPasswordDto,
userUuid: string, userUuid: string,
projectUuid: string, projectUuid: string,
@ -448,6 +511,7 @@ export class VisitorPasswordService {
success: true, success: true,
id: createPass.result.id, id: createPass.result.id,
deviceUuid, deviceUuid,
deviceName: passwordData.deviceName,
}; };
} catch (error) { } catch (error) {
return { return {
@ -508,67 +572,8 @@ export class VisitorPasswordService {
); );
} }
} }
async getPasswords(projectUuid: string) {
await this.validateProject(projectUuid);
const deviceIds = await this.deviceRepository.find({ private async addOnlineTemporaryPasswordOneTime(
where: {
productDevice: {
prodType: ProductType.DL,
},
spaceDevice: {
spaceName: Not(ORPHAN_SPACE_NAME),
community: {
project: {
uuid: projectUuid,
},
},
},
isActive: true,
},
});
const data = [];
deviceIds.forEach((deviceId) => {
data.push(
this.doorLockService
.getOnlineTemporaryPasswordsOneTime(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOnlineTemporaryPasswordsOneTime(deviceId.uuid, true, true)
.catch(() => {}),
this.doorLockService
.getOnlineTemporaryPasswordsMultiple(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOnlineTemporaryPasswordsMultiple(deviceId.uuid, true, true)
.catch(() => {}),
this.doorLockService
.getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOfflineOneTimeTemporaryPasswords(deviceId.uuid, true, true)
.catch(() => {}),
this.doorLockService
.getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, false)
.catch(() => {}),
this.doorLockService
.getOfflineMultipleTimeTemporaryPasswords(deviceId.uuid, true, true)
.catch(() => {}),
);
});
const result = (await Promise.all(data)).flat().filter((datum) => {
return datum != null;
});
return new SuccessResponseDto({
message: 'Successfully retrieved temporary passwords',
data: result,
statusCode: HttpStatus.OK,
});
}
async addOnlineTemporaryPasswordOneTime(
addDoorLockOnlineOneTimeDto: AddDoorLockTemporaryPasswordDto, addDoorLockOnlineOneTimeDto: AddDoorLockTemporaryPasswordDto,
userUuid: string, userUuid: string,
projectUuid: string, projectUuid: string,
@ -627,6 +632,7 @@ export class VisitorPasswordService {
return { return {
success: true, success: true,
id: createPass.result.id, id: createPass.result.id,
deviceName: passwordData.deviceName,
deviceUuid, deviceUuid,
}; };
} catch (error) { } catch (error) {
@ -688,7 +694,7 @@ export class VisitorPasswordService {
); );
} }
} }
async getTicketAndEncryptedPassword( private async getTicketAndEncryptedPassword(
doorLockUuid: string, doorLockUuid: string,
passwordPlan: string, passwordPlan: string,
projectUuid: string, projectUuid: string,
@ -725,6 +731,7 @@ export class VisitorPasswordService {
ticketKey: ticketDetails.result.ticket_key, ticketKey: ticketDetails.result.ticket_key,
encryptedPassword: decrypted, encryptedPassword: decrypted,
deviceTuyaUuid: deviceDetails.deviceTuyaUuid, deviceTuyaUuid: deviceDetails.deviceTuyaUuid,
deviceName: deviceDetails.name,
}; };
} catch (error) { } catch (error) {
throw new HttpException( throw new HttpException(
@ -734,7 +741,7 @@ export class VisitorPasswordService {
} }
} }
async createDoorLockTicketTuya( private async createDoorLockTicketTuya(
deviceUuid: string, deviceUuid: string,
): Promise<createTickInterface> { ): Promise<createTickInterface> {
try { try {
@ -753,7 +760,7 @@ export class VisitorPasswordService {
} }
} }
async addOnlineTemporaryPasswordMultipleTuya( private async addOnlineTemporaryPasswordMultipleTuya(
addDeviceObj: addDeviceObjectInterface, addDeviceObj: addDeviceObjectInterface,
doorLockUuid: string, doorLockUuid: string,
): Promise<createTickInterface> { ): Promise<createTickInterface> {
@ -795,7 +802,7 @@ export class VisitorPasswordService {
} }
} }
getWorkingDayValue(days) { private getWorkingDayValue(days) {
// Array representing the days of the week // Array representing the days of the week
const weekDays = [ const weekDays = [
DaysEnum.SAT, DaysEnum.SAT,
@ -827,36 +834,7 @@ export class VisitorPasswordService {
return workingDayValue; return workingDayValue;
} }
getDaysFromWorkingDayValue(workingDayValue) { private timeToMinutes(timeStr) {
// Array representing the days of the week
const weekDays = [
DaysEnum.SAT,
DaysEnum.FRI,
DaysEnum.THU,
DaysEnum.WED,
DaysEnum.TUE,
DaysEnum.MON,
DaysEnum.SUN,
];
// Convert the integer to a binary string and pad with leading zeros to ensure 7 bits
const binaryString = workingDayValue
.toString(2)
.padStart(7, EnableDisableStatusEnum.DISABLED);
// Initialize an array to hold the days of the week
const days = [];
// Iterate through the binary string and weekDays array
for (let i = 0; i < binaryString.length; i++) {
if (binaryString[i] === EnableDisableStatusEnum.ENABLED) {
days.push(weekDays[i]);
}
}
return days;
}
timeToMinutes(timeStr) {
try { try {
// Special case for "24:00" // Special case for "24:00"
if (timeStr === CommonHours.TWENTY_FOUR) { if (timeStr === CommonHours.TWENTY_FOUR) {
@ -883,38 +861,7 @@ export class VisitorPasswordService {
throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR); throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
} }
} }
minutesToTime(totalMinutes) { private async getDeviceByDeviceUuid(
try {
if (
typeof totalMinutes !== 'number' ||
totalMinutes < 0 ||
totalMinutes > CommonHourMinutes.TWENTY_FOUR
) {
throw new Error('Invalid minutes value');
}
if (totalMinutes === CommonHourMinutes.TWENTY_FOUR) {
return CommonHours.TWENTY_FOUR;
}
const hours = Math.floor(totalMinutes / 60);
const minutes = totalMinutes % 60;
const formattedHours = String(hours).padStart(
2,
EnableDisableStatusEnum.DISABLED,
);
const formattedMinutes = String(minutes).padStart(
2,
EnableDisableStatusEnum.DISABLED,
);
return `${formattedHours}:${formattedMinutes}`;
} catch (error) {
throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
async getDeviceByDeviceUuid(
deviceUuid: string, deviceUuid: string,
withProductDevice: boolean = true, withProductDevice: boolean = true,
projectUuid: string, projectUuid: string,
@ -939,7 +886,7 @@ export class VisitorPasswordService {
throw new HttpException('Device Not Found', HttpStatus.NOT_FOUND); throw new HttpException('Device Not Found', HttpStatus.NOT_FOUND);
} }
} }
async addOnlineTemporaryPasswordOneTimeTuya( private async addOnlineTemporaryPasswordOneTimeTuya(
addDeviceObj: addDeviceObjectInterface, addDeviceObj: addDeviceObjectInterface,
doorLockUuid: string, doorLockUuid: string,
): Promise<createTickInterface> { ): Promise<createTickInterface> {