refactor visitor passwords apis

This commit is contained in:
faris Aljohari
2025-03-20 09:42:54 +03:00
parent b5469cb316
commit 9bc763bad3
9 changed files with 153 additions and 179 deletions

View File

@ -231,8 +231,6 @@ export class SceneService {
const safeFetch = async (scene: any) => {
try {
console.log('scene', scene);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { actions, ...sceneDetails } = await this.getScene(
scene,

View File

@ -1,2 +1 @@
export * from './visitor-password.controller';
export * from './project-visitor-password.controller';

View File

@ -1,48 +0,0 @@
import { VisitorPasswordService } from '../services/visitor-password.service';
import { Controller, UseGuards, Get, Param } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { Permissions } from 'src/decorators/permissions.decorator';
import { EnableDisableStatusEnum } from '@app/common/constants/days.enum';
import { ControllerRoute } from '@app/common/constants/controller-route';
import { ProjectParam } from 'src/community/dtos';
import { PermissionsGuard } from 'src/guards/permissions.guard';
@ApiTags('Visitor Password Module')
@Controller({
version: EnableDisableStatusEnum.ENABLED,
path: ControllerRoute.VISITOR_PASSWORD.PROJECT_ROUTE,
})
export class VisitorPasswordProjectController {
constructor(
private readonly visitorPasswordService: VisitorPasswordService,
) {}
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_ADD')
@Get()
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_PASSWORD_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_PASSWORD_DESCRIPTION,
})
async GetVisitorPassword(@Param() param: ProjectParam) {
return await this.visitorPasswordService.getPasswords(param);
}
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_VIEW')
@Get('/devices')
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_DEVICES_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_DEVICES_DESCRIPTION,
})
async GetVisitorDevices(@Param() param: ProjectParam) {
return await this.visitorPasswordService.getAllPassDevices(param);
}
}

View File

@ -6,14 +6,10 @@ import {
HttpStatus,
UseGuards,
Req,
Get,
} from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import {
AddDoorLockOfflineMultipleDto,
AddDoorLockOfflineOneTimeDto,
AddDoorLockOnlineMultipleDto,
AddDoorLockOnlineOneTimeDto,
} from '../dtos/temp-pass.dto';
import { AddDoorLockTemporaryPasswordDto } from '../dtos/temp-pass.dto';
import { EnableDisableStatusEnum } from '@app/common/constants/days.enum';
import { ControllerRoute } from '@app/common/constants/controller-route';
import { PermissionsGuard } from 'src/guards/permissions.guard';
@ -32,23 +28,21 @@ export class VisitorPasswordController {
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_ADD')
@Post('temporary-password/online/multiple-time')
@Post()
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_ONLINE_TEMP_PASSWORD_MULTIPLE_TIME_SUMMARY,
ControllerRoute.VISITOR_PASSWORD.ACTIONS.ADD_VISITOR_PASSWORD_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_ONLINE_TEMP_PASSWORD_MULTIPLE_TIME_DESCRIPTION,
ControllerRoute.VISITOR_PASSWORD.ACTIONS.ADD_VISITOR_PASSWORD_DESCRIPTION,
})
async addOnlineTemporaryPasswordMultipleTime(
@Body() addDoorLockOnlineMultipleDto: AddDoorLockOnlineMultipleDto,
async addTemporaryPassword(
@Body() addDoorLockTemporaryPasswordDto: AddDoorLockTemporaryPasswordDto,
@Req() req: any,
) {
const userUuid = req.user.uuid;
const temporaryPasswords =
await this.visitorPasswordService.addOnlineTemporaryPasswordMultipleTime(
addDoorLockOnlineMultipleDto,
await this.visitorPasswordService.handleTemporaryPassword(
addDoorLockTemporaryPasswordDto,
userUuid,
);
@ -57,92 +51,33 @@ export class VisitorPasswordController {
data: temporaryPasswords,
};
}
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_ADD')
@Post('temporary-password/online/one-time')
@Get()
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_ONLINE_TEMP_PASSWORD_ONE_TIME_SUMMARY,
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_PASSWORD_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_ONLINE_TEMP_PASSWORD_ONE_TIME_DESCRIPTION,
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_PASSWORD_DESCRIPTION,
})
async addOnlineTemporaryPassword(
@Body() addDoorLockOnlineOneTimeDto: AddDoorLockOnlineOneTimeDto,
@Req() req: any,
) {
const userUuid = req.user.uuid;
const temporaryPasswords =
await this.visitorPasswordService.addOnlineTemporaryPasswordOneTime(
addDoorLockOnlineOneTimeDto,
userUuid,
);
return {
statusCode: HttpStatus.CREATED,
data: temporaryPasswords,
};
async GetVisitorPassword(@Req() req: any) {
const projectUuid = req.user.project.uuid;
return await this.visitorPasswordService.getPasswords(projectUuid);
}
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_ADD')
@Post('temporary-password/offline/one-time')
@Permissions('VISITOR_PASSWORD_VIEW')
@Get('/devices')
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_OFFLINE_TEMP_PASSWORD_ONE_TIME_SUMMARY,
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_DEVICES_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_OFFLINE_TEMP_PASSWORD_ONE_TIME_DESCRIPTION,
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_DEVICES_DESCRIPTION,
})
async addOfflineOneTimeTemporaryPassword(
@Body() addDoorLockOfflineOneTimeDto: AddDoorLockOfflineOneTimeDto,
@Req() req: any,
) {
const userUuid = req.user.uuid;
const temporaryPassword =
await this.visitorPasswordService.addOfflineOneTimeTemporaryPassword(
addDoorLockOfflineOneTimeDto,
userUuid,
);
return {
statusCode: HttpStatus.CREATED,
data: temporaryPassword,
};
}
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_ADD')
@Post('temporary-password/offline/multiple-time')
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_OFFLINE_TEMP_PASSWORD_MULTIPLE_TIME_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS
.ADD_OFFLINE_TEMP_PASSWORD_MULTIPLE_TIME_DESCRIPTION,
})
async addOfflineMultipleTimeTemporaryPassword(
@Body()
addDoorLockOfflineMultipleDto: AddDoorLockOfflineMultipleDto,
@Req() req: any,
) {
const userUuid = req.user.uuid;
const temporaryPassword =
await this.visitorPasswordService.addOfflineMultipleTimeTemporaryPassword(
addDoorLockOfflineMultipleDto,
userUuid,
);
return {
statusCode: HttpStatus.CREATED,
data: temporaryPassword,
};
async GetVisitorDevices(@Req() req: any) {
const projectUuid = req.user.project.uuid;
return await this.visitorPasswordService.getAllPassDevices(projectUuid);
}
}

View File

@ -11,6 +11,7 @@ import {
} from 'class-validator';
import { Type } from 'class-transformer';
import { WorkingDays } from '@app/common/constants/working-days';
import { VisitorPasswordEnum } from '@app/common/constants/visitor-password.enum';
class ScheduleDto {
@ApiProperty({
@ -211,3 +212,73 @@ export class AddDoorLockOfflineMultipleDto {
@IsNotEmpty()
public invalidTime: string;
}
export class AddDoorLockTemporaryPasswordDto {
@ApiProperty({
description: 'Operation type',
enum: VisitorPasswordEnum,
required: true,
})
@IsEnum(VisitorPasswordEnum)
@IsNotEmpty()
public operationType: VisitorPasswordEnum;
@ApiProperty({
description: 'email',
required: true,
})
@IsEmail()
@IsNotEmpty()
public email: string;
@ApiProperty({
description: 'devicesUuid',
required: true,
})
@IsArray()
@IsNotEmpty()
public devicesUuid: string[];
@ApiProperty({
description: 'password name',
required: true,
})
@IsString()
@IsNotEmpty()
public passwordName: string;
@ApiProperty({
description: 'password',
required: true,
})
@IsString()
@IsNotEmpty()
@Length(7, 7)
public password: string;
@ApiProperty({
description: 'effectiveTime',
required: false,
})
@IsString()
@IsOptional()
public effectiveTime: string;
@ApiProperty({
description: 'invalidTime',
required: false,
})
@IsString()
@IsOptional()
public invalidTime: string;
@ApiProperty({
description: 'scheduleList',
type: [ScheduleDto],
required: false,
})
@IsArray()
@ValidateNested({ each: true })
@IsOptional()
@Type(() => ScheduleDto)
public scheduleList: ScheduleDto[];
}

View File

@ -1,5 +1,10 @@
import { VisitorPasswordRepository } from './../../../libs/common/src/modules/visitor-password/repositories/visitor-password.repository';
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import {
Injectable,
HttpException,
HttpStatus,
BadRequestException,
} from '@nestjs/common';
import { TuyaContext } from '@tuya/tuya-connector-nodejs';
import { ConfigService } from '@nestjs/config';
import {
@ -9,13 +14,7 @@ import {
import { DeviceRepository } from '@app/common/modules/device/repositories';
import { ProductType } from '@app/common/constants/product-type.enum';
import {
AddDoorLockOfflineMultipleDto,
AddDoorLockOfflineOneTimeDto,
AddDoorLockOnlineMultipleDto,
AddDoorLockOnlineOneTimeDto,
ProjectParam,
} from '../dtos';
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';
@ -32,6 +31,7 @@ import {
CommonHours,
} from '@app/common/constants/hours-minutes.enum';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { VisitorPasswordEnum } from '@app/common/constants/visitor-password.enum';
@Injectable()
export class VisitorPasswordService {
@ -55,9 +55,39 @@ export class VisitorPasswordService {
secretKey,
});
}
async handleTemporaryPassword(
addDoorLockTemporaryPasswordDto: AddDoorLockTemporaryPasswordDto,
userUuid: string,
) {
const { operationType } = addDoorLockTemporaryPasswordDto;
switch (operationType) {
case VisitorPasswordEnum.ONLINE_ONE_TIME:
return this.addOnlineTemporaryPasswordOneTime(
addDoorLockTemporaryPasswordDto,
userUuid,
);
case VisitorPasswordEnum.ONLINE_MULTIPLE_TIME:
return this.addOnlineTemporaryPasswordMultipleTime(
addDoorLockTemporaryPasswordDto,
userUuid,
);
case VisitorPasswordEnum.OFFLINE_ONE_TIME:
return this.addOfflineOneTimeTemporaryPassword(
addDoorLockTemporaryPasswordDto,
userUuid,
);
case VisitorPasswordEnum.OFFLINE_MULTIPLE_TIME:
return this.addOfflineMultipleTimeTemporaryPassword(
addDoorLockTemporaryPasswordDto,
userUuid,
);
default:
throw new BadRequestException('Invalid operation type');
}
}
async addOfflineMultipleTimeTemporaryPassword(
addDoorLockOfflineMultipleDto: AddDoorLockOfflineMultipleDto,
addDoorLockOfflineMultipleDto: AddDoorLockTemporaryPasswordDto,
userUuid: string,
) {
try {
@ -178,7 +208,7 @@ export class VisitorPasswordService {
}
async addOfflineOneTimeTemporaryPassword(
addDoorLockOfflineOneTimeDto: AddDoorLockOfflineOneTimeDto,
addDoorLockOfflineOneTimeDto: AddDoorLockTemporaryPasswordDto,
userUuid: string,
) {
try {
@ -301,7 +331,7 @@ export class VisitorPasswordService {
async addOfflineTemporaryPasswordTuya(
doorLockUuid: string,
type: string,
addDoorLockOfflineMultipleDto: AddDoorLockOfflineMultipleDto,
addDoorLockOfflineMultipleDto: AddDoorLockTemporaryPasswordDto,
passwordName: string,
): Promise<createTickInterface> {
try {
@ -329,7 +359,7 @@ export class VisitorPasswordService {
}
}
async addOnlineTemporaryPasswordMultipleTime(
addDoorLockOnlineMultipleDto: AddDoorLockOnlineMultipleDto,
addDoorLockOnlineMultipleDto: AddDoorLockTemporaryPasswordDto,
userUuid: string,
) {
try {
@ -447,8 +477,8 @@ export class VisitorPasswordService {
);
}
}
async getPasswords(param: ProjectParam) {
await this.validateProject(param.projectUuid);
async getPasswords(projectUuid: string) {
await this.validateProject(projectUuid);
const deviceIds = await this.deviceRepository.find({
where: {
@ -458,7 +488,7 @@ export class VisitorPasswordService {
spaceDevice: {
community: {
project: {
uuid: param.projectUuid,
uuid: projectUuid,
},
},
},
@ -499,8 +529,8 @@ export class VisitorPasswordService {
});
}
async getAllPassDevices(param: ProjectParam) {
await this.validateProject(param.projectUuid);
async getAllPassDevices(projectUuid: string) {
await this.validateProject(projectUuid);
const devices = await this.deviceRepository.find({
where: {
@ -510,7 +540,7 @@ export class VisitorPasswordService {
spaceDevice: {
community: {
project: {
uuid: param.projectUuid,
uuid: projectUuid,
},
},
},
@ -548,7 +578,7 @@ export class VisitorPasswordService {
}
async addOnlineTemporaryPasswordOneTime(
addDoorLockOnlineOneTimeDto: AddDoorLockOnlineOneTimeDto,
addDoorLockOnlineOneTimeDto: AddDoorLockTemporaryPasswordDto,
userUuid: string,
) {
try {

View File

@ -22,10 +22,9 @@ import {
import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories';
import { AutomationRepository } from '@app/common/modules/automation/repositories';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { VisitorPasswordProjectController } from './controllers';
@Module({
imports: [ConfigModule, DeviceRepositoryModule, DoorLockModule],
controllers: [VisitorPasswordController, VisitorPasswordProjectController],
controllers: [VisitorPasswordController],
providers: [
VisitorPasswordService,
EmailService,