diff --git a/libs/common/src/constants/controller-route.ts b/libs/common/src/constants/controller-route.ts index 07ba97b..221d445 100644 --- a/libs/common/src/constants/controller-route.ts +++ b/libs/common/src/constants/controller-route.ts @@ -726,26 +726,10 @@ export class ControllerRoute { '/projects/:projectUuid/visitor-password'; static ACTIONS = class { - public static readonly ADD_ONLINE_TEMP_PASSWORD_MULTIPLE_TIME_SUMMARY = - 'Add online temporary passwords (multiple-time)'; - public static readonly ADD_ONLINE_TEMP_PASSWORD_MULTIPLE_TIME_DESCRIPTION = - 'This endpoint adds multiple online temporary passwords for door locks.'; - - public static readonly ADD_ONLINE_TEMP_PASSWORD_ONE_TIME_SUMMARY = - 'Add online temporary password (one-time)'; - public static readonly ADD_ONLINE_TEMP_PASSWORD_ONE_TIME_DESCRIPTION = - 'This endpoint adds a one-time online temporary password for a door lock.'; - - public static readonly ADD_OFFLINE_TEMP_PASSWORD_ONE_TIME_SUMMARY = - 'Add offline temporary password (one-time)'; - public static readonly ADD_OFFLINE_TEMP_PASSWORD_ONE_TIME_DESCRIPTION = - 'This endpoint adds a one-time offline temporary password for a door lock.'; - - public static readonly ADD_OFFLINE_TEMP_PASSWORD_MULTIPLE_TIME_SUMMARY = - 'Add offline temporary passwords (multiple-time)'; - public static readonly ADD_OFFLINE_TEMP_PASSWORD_MULTIPLE_TIME_DESCRIPTION = - 'This endpoint adds multiple offline temporary passwords for door locks.'; - + public static readonly ADD_VISITOR_PASSWORD_SUMMARY = + 'Add visitor password'; + public static readonly ADD_VISITOR_PASSWORD_DESCRIPTION = + 'This endpoint allows you to add a visitor password based on the operation type.'; public static readonly GET_VISITOR_PASSWORD_SUMMARY = 'Get visitor passwords'; public static readonly GET_VISITOR_PASSWORD_DESCRIPTION = diff --git a/libs/common/src/constants/visitor-password.enum.ts b/libs/common/src/constants/visitor-password.enum.ts new file mode 100644 index 0000000..0a08e85 --- /dev/null +++ b/libs/common/src/constants/visitor-password.enum.ts @@ -0,0 +1,6 @@ +export enum VisitorPasswordEnum { + ONLINE_ONE_TIME = 'ONLINE_ONE_TIME', + ONLINE_MULTIPLE_TIME = 'ONLINE_MULTIPLE_TIME', + OFFLINE_ONE_TIME = 'OFFLINE_ONE_TIME', + OFFLINE_MULTIPLE_TIME = 'OFFLINE_MULTIPLE_TIME', +} diff --git a/src/scene/services/scene.service.ts b/src/scene/services/scene.service.ts index c053385..b831416 100644 --- a/src/scene/services/scene.service.ts +++ b/src/scene/services/scene.service.ts @@ -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, diff --git a/src/vistor-password/controllers/index.ts b/src/vistor-password/controllers/index.ts index b579b2d..ca4b986 100644 --- a/src/vistor-password/controllers/index.ts +++ b/src/vistor-password/controllers/index.ts @@ -1,2 +1 @@ export * from './visitor-password.controller'; -export * from './project-visitor-password.controller'; \ No newline at end of file diff --git a/src/vistor-password/controllers/project-visitor-password.controller.ts b/src/vistor-password/controllers/project-visitor-password.controller.ts deleted file mode 100644 index f72b5c9..0000000 --- a/src/vistor-password/controllers/project-visitor-password.controller.ts +++ /dev/null @@ -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); - } -} diff --git a/src/vistor-password/controllers/visitor-password.controller.ts b/src/vistor-password/controllers/visitor-password.controller.ts index 3e1b781..5730b7b 100644 --- a/src/vistor-password/controllers/visitor-password.controller.ts +++ b/src/vistor-password/controllers/visitor-password.controller.ts @@ -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); } } diff --git a/src/vistor-password/dtos/temp-pass.dto.ts b/src/vistor-password/dtos/temp-pass.dto.ts index 0590935..3637124 100644 --- a/src/vistor-password/dtos/temp-pass.dto.ts +++ b/src/vistor-password/dtos/temp-pass.dto.ts @@ -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[]; +} diff --git a/src/vistor-password/services/visitor-password.service.ts b/src/vistor-password/services/visitor-password.service.ts index 2f08f0c..62a8716 100644 --- a/src/vistor-password/services/visitor-password.service.ts +++ b/src/vistor-password/services/visitor-password.service.ts @@ -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 { 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 { diff --git a/src/vistor-password/visitor-password.module.ts b/src/vistor-password/visitor-password.module.ts index 5ee1f0e..778abd4 100644 --- a/src/vistor-password/visitor-password.module.ts +++ b/src/vistor-password/visitor-password.module.ts @@ -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,