Moved get visitor password and get device for visitor password

This commit is contained in:
hannathkadher
2025-02-16 23:26:20 +04:00
parent b59230d5d8
commit 427a57501f
17 changed files with 185 additions and 45 deletions

View File

@ -540,6 +540,15 @@ export class ControllerRoute {
}; };
}; };
static DEVICE_PROJECT = class {
public static readonly ROUTE = '/projects/:projectUuid/devices';
static ACTIONS = class {
public static readonly GET_ALL_DEVICES_SUMMARY = 'Get all devices';
public static readonly GET_ALL_DEVICES_DESCRIPTION =
'This endpoint retrieves all devices in the system.';
};
};
static DEVICE_PERMISSION = class { static DEVICE_PERMISSION = class {
public static readonly ROUTE = 'device-permission'; public static readonly ROUTE = 'device-permission';
@ -680,6 +689,8 @@ export class ControllerRoute {
}; };
static VISITOR_PASSWORD = class { static VISITOR_PASSWORD = class {
public static readonly ROUTE = 'visitor-password'; public static readonly ROUTE = 'visitor-password';
public static readonly PROJECT_ROUTE =
'/projects/:projectUuid/visitor-password';
static ACTIONS = class { static ACTIONS = class {
public static readonly ADD_ONLINE_TEMP_PASSWORD_MULTIPLE_TIME_SUMMARY = public static readonly ADD_ONLINE_TEMP_PASSWORD_MULTIPLE_TIME_SUMMARY =

View File

@ -16,6 +16,7 @@ import {
} from '@app/common/modules/scene/repositories'; } from '@app/common/modules/scene/repositories';
import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories'; import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories';
import { AutomationRepository } from '@app/common/modules/automation/repositories'; import { AutomationRepository } from '@app/common/modules/automation/repositories';
import { ProjectRepository } from '@app/common/modules/project/repositiories/project.repository';
@Module({ @Module({
imports: [ConfigModule, SpaceRepositoryModule, DeviceStatusFirebaseModule], imports: [ConfigModule, SpaceRepositoryModule, DeviceStatusFirebaseModule],
@ -32,6 +33,7 @@ import { AutomationRepository } from '@app/common/modules/automation/repositorie
SceneRepository, SceneRepository,
SceneDeviceRepository, SceneDeviceRepository,
AutomationRepository, AutomationRepository,
ProjectRepository,
], ],
exports: [AutomationService], exports: [AutomationService],
}) })

View File

@ -0,0 +1,29 @@
import { DeviceService } from '../services/device.service';
import { Controller, Get, Param, UseGuards } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { EnableDisableStatusEnum } from '@app/common/constants/days.enum';
import { ControllerRoute } from '@app/common/constants/controller-route';
import { PermissionsGuard } from 'src/guards/permissions.guard';
import { Permissions } from 'src/decorators/permissions.decorator';
import { ProjectParam } from '../dtos';
@ApiTags('Device Module')
@Controller({
version: EnableDisableStatusEnum.ENABLED,
path: ControllerRoute.DEVICE_PROJECT.ROUTE,
})
export class DeviceProjectController {
constructor(private readonly deviceService: DeviceService) {}
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('DEVICE_VIEW')
@Get()
@ApiOperation({
summary: ControllerRoute.DEVICE.ACTIONS.GET_ALL_DEVICES_SUMMARY,
description: ControllerRoute.DEVICE.ACTIONS.GET_ALL_DEVICES_DESCRIPTION,
})
async getAllDevices(@Param() param: ProjectParam) {
return await this.deviceService.getAllDevices(param);
}
}

View File

@ -224,17 +224,6 @@ export class DeviceController {
async getDevicesInGateway(@Param('gatewayUuid') gatewayUuid: string) { async getDevicesInGateway(@Param('gatewayUuid') gatewayUuid: string) {
return await this.deviceService.getDevicesInGateway(gatewayUuid); return await this.deviceService.getDevicesInGateway(gatewayUuid);
} }
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('DEVICE_VIEW')
@Get()
@ApiOperation({
summary: ControllerRoute.DEVICE.ACTIONS.GET_ALL_DEVICES_SUMMARY,
description: ControllerRoute.DEVICE.ACTIONS.GET_ALL_DEVICES_DESCRIPTION,
})
async getAllDevices() {
return await this.deviceService.getAllDevices();
}
@ApiBearerAuth() @ApiBearerAuth()
@UseGuards(PermissionsGuard) @UseGuards(PermissionsGuard)

View File

@ -20,6 +20,8 @@ import {
} from '@app/common/modules/scene/repositories'; } from '@app/common/modules/scene/repositories';
import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories'; import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories';
import { AutomationRepository } from '@app/common/modules/automation/repositories'; import { AutomationRepository } from '@app/common/modules/automation/repositories';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { DeviceProjectController } from './controllers/device-project.controller';
@Module({ @Module({
imports: [ imports: [
ConfigModule, ConfigModule,
@ -28,13 +30,14 @@ import { AutomationRepository } from '@app/common/modules/automation/repositorie
DeviceRepositoryModule, DeviceRepositoryModule,
DeviceStatusFirebaseModule, DeviceStatusFirebaseModule,
], ],
controllers: [DeviceController], controllers: [DeviceController, DeviceProjectController],
providers: [ providers: [
DeviceService, DeviceService,
ProductRepository, ProductRepository,
DeviceUserPermissionRepository, DeviceUserPermissionRepository,
PermissionTypeRepository, PermissionTypeRepository,
SpaceRepository, SpaceRepository,
ProjectRepository,
DeviceRepository, DeviceRepository,
UserRepository, UserRepository,
TuyaService, TuyaService,

View File

@ -1,3 +1,4 @@
export * from './add.device.dto'; export * from './add.device.dto';
export * from './control.device.dto'; export * from './control.device.dto';
export * from './get.device.dto'; export * from './get.device.dto';
export * from './project.param.dto';

View File

@ -0,0 +1,11 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsUUID } from 'class-validator';
export class ProjectParam {
@ApiProperty({
description: 'UUID of the project this community belongs to',
example: 'd290f1ee-6c54-4b01-90e6-d701748f0851',
})
@IsUUID()
projectUuid: string;
}

View File

@ -60,6 +60,8 @@ import { BaseResponseDto } from '@app/common/dto/base.response.dto';
import { SuccessResponseDto } from '@app/common/dto/success.response.dto'; import { SuccessResponseDto } from '@app/common/dto/success.response.dto';
import { DeleteSceneFromSceneDeviceDto } from '../dtos/delete.device.dto'; import { DeleteSceneFromSceneDeviceDto } from '../dtos/delete.device.dto';
import { DeviceEntity } from '@app/common/modules/device/entities'; import { DeviceEntity } from '@app/common/modules/device/entities';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { ProjectParam } from '../dtos';
@Injectable() @Injectable()
export class DeviceService { export class DeviceService {
@ -74,6 +76,7 @@ export class DeviceService {
@Inject(forwardRef(() => SceneService)) @Inject(forwardRef(() => SceneService))
private readonly sceneService: SceneService, private readonly sceneService: SceneService,
private readonly tuyaService: TuyaService, private readonly tuyaService: TuyaService,
private readonly projectRepository: ProjectRepository,
) { ) {
const accessKey = this.configService.get<string>('auth-config.ACCESS_KEY'); const accessKey = this.configService.get<string>('auth-config.ACCESS_KEY');
const secretKey = this.configService.get<string>('auth-config.SECRET_KEY'); const secretKey = this.configService.get<string>('auth-config.SECRET_KEY');
@ -950,8 +953,12 @@ export class DeviceService {
); );
} }
} }
async getAllDevices(): Promise<GetDeviceDetailsInterface[]> { async getAllDevices(
param: ProjectParam,
): Promise<GetDeviceDetailsInterface[]> {
try { try {
await this.validateProject(param.projectUuid);
const devices = await this.deviceRepository.find({ const devices = await this.deviceRepository.find({
where: { isActive: true }, where: { isActive: true },
relations: [ relations: [
@ -1490,4 +1497,17 @@ export class DeviceService {
); );
} }
} }
private async validateProject(uuid: string) {
const project = await this.projectRepository.findOne({
where: { uuid },
});
if (!project) {
throw new HttpException(
`A project with the uuid '${uuid}' doesn't exists.`,
HttpStatus.BAD_REQUEST,
);
}
return project;
}
} }

View File

@ -19,6 +19,7 @@ import {
} from '@app/common/modules/scene/repositories'; } from '@app/common/modules/scene/repositories';
import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories'; import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories';
import { AutomationRepository } from '@app/common/modules/automation/repositories'; import { AutomationRepository } from '@app/common/modules/automation/repositories';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
@Module({ @Module({
imports: [ConfigModule, DeviceRepositoryModule], imports: [ConfigModule, DeviceRepositoryModule],
controllers: [DoorLockController], controllers: [DoorLockController],
@ -32,6 +33,7 @@ import { AutomationRepository } from '@app/common/modules/automation/repositorie
DeviceStatusFirebaseService, DeviceStatusFirebaseService,
SpaceRepository, SpaceRepository,
DeviceStatusLogRepository, DeviceStatusLogRepository,
ProjectRepository,
TuyaService, TuyaService,
SceneService, SceneService,
SceneIconRepository, SceneIconRepository,

View File

@ -15,6 +15,7 @@ import {
import { TuyaService } from '@app/common/integrations/tuya/services/tuya.service'; import { TuyaService } from '@app/common/integrations/tuya/services/tuya.service';
import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories'; import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories';
import { AutomationRepository } from '@app/common/modules/automation/repositories'; import { AutomationRepository } from '@app/common/modules/automation/repositories';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
@Module({ @Module({
imports: [ConfigModule, SpaceRepositoryModule, DeviceStatusFirebaseModule], imports: [ConfigModule, SpaceRepositoryModule, DeviceStatusFirebaseModule],
@ -28,6 +29,7 @@ import { AutomationRepository } from '@app/common/modules/automation/repositorie
ProductRepository, ProductRepository,
SceneIconRepository, SceneIconRepository,
SceneRepository, SceneRepository,
ProjectRepository,
SceneDeviceRepository, SceneDeviceRepository,
AutomationRepository, AutomationRepository,
], ],

View File

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

View File

@ -0,0 +1,48 @@
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

@ -5,7 +5,6 @@ import {
Post, Post,
HttpStatus, HttpStatus,
UseGuards, UseGuards,
Get,
Req, Req,
} from '@nestjs/common'; } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger'; import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
@ -146,32 +145,4 @@ export class VisitorPasswordController {
data: temporaryPassword, data: temporaryPassword,
}; };
} }
@ApiBearerAuth()
@UseGuards(PermissionsGuard)
@Permissions('VISITOR_PASSWORD_VIEW')
@Get()
@ApiOperation({
summary:
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_PASSWORD_SUMMARY,
description:
ControllerRoute.VISITOR_PASSWORD.ACTIONS.GET_VISITOR_PASSWORD_DESCRIPTION,
})
async GetVisitorPassword() {
return await this.visitorPasswordService.getPasswords();
}
@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() {
return await this.visitorPasswordService.getAllPassDevices();
}
} }

View File

@ -1 +1,2 @@
export * from './temp-pass.dto'; export * from './temp-pass.dto';
export * from './project.param.dto';

View File

@ -0,0 +1,11 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsUUID } from 'class-validator';
export class ProjectParam {
@ApiProperty({
description: 'UUID of the project this community belongs to',
example: 'd290f1ee-6c54-4b01-90e6-d701748f0851',
})
@IsUUID()
projectUuid: string;
}

View File

@ -14,6 +14,7 @@ import {
AddDoorLockOfflineOneTimeDto, AddDoorLockOfflineOneTimeDto,
AddDoorLockOnlineMultipleDto, AddDoorLockOnlineMultipleDto,
AddDoorLockOnlineOneTimeDto, AddDoorLockOnlineOneTimeDto,
ProjectParam,
} from '../dtos'; } from '../dtos';
import { EmailService } from '@app/common/util/email.service'; import { EmailService } from '@app/common/util/email.service';
import { PasswordEncryptionService } from 'src/door-lock/services/encryption.services'; import { PasswordEncryptionService } from 'src/door-lock/services/encryption.services';
@ -30,6 +31,7 @@ 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';
@Injectable() @Injectable()
export class VisitorPasswordService { export class VisitorPasswordService {
@ -42,6 +44,7 @@ export class VisitorPasswordService {
private readonly doorLockService: DoorLockService, private readonly doorLockService: DoorLockService,
private readonly deviceService: DeviceService, private readonly deviceService: DeviceService,
private readonly passwordEncryptionService: PasswordEncryptionService, private readonly passwordEncryptionService: PasswordEncryptionService,
private readonly projectRepository: ProjectRepository,
) { ) {
const accessKey = this.configService.get<string>('auth-config.ACCESS_KEY'); const accessKey = this.configService.get<string>('auth-config.ACCESS_KEY');
const secretKey = this.configService.get<string>('auth-config.SECRET_KEY'); const secretKey = this.configService.get<string>('auth-config.SECRET_KEY');
@ -444,12 +447,21 @@ export class VisitorPasswordService {
); );
} }
} }
async getPasswords() { async getPasswords(param: ProjectParam) {
await this.validateProject(param.projectUuid);
const deviceIds = await this.deviceRepository.find({ const deviceIds = await this.deviceRepository.find({
where: { where: {
productDevice: { productDevice: {
prodType: ProductType.DL, prodType: ProductType.DL,
}, },
spaceDevice: {
community: {
project: {
uuid: param.projectUuid,
},
},
},
isActive: true, isActive: true,
}, },
}); });
@ -487,14 +499,24 @@ export class VisitorPasswordService {
}); });
} }
async getAllPassDevices() { async getAllPassDevices(param: ProjectParam) {
await this.validateProject(param.projectUuid);
const devices = await this.deviceRepository.find({ const devices = await this.deviceRepository.find({
where: { where: {
productDevice: { productDevice: {
prodType: ProductType.DL, prodType: ProductType.DL,
}, },
spaceDevice: {
community: {
project: {
uuid: param.projectUuid,
},
},
},
isActive: true, isActive: true,
}, },
relations: ['productDevice'], relations: ['productDevice'],
}); });
const devicesData = await Promise.all( const devicesData = await Promise.all(
@ -907,4 +929,17 @@ export class VisitorPasswordService {
); );
} }
} }
private async validateProject(uuid: string) {
const project = await this.projectRepository.findOne({
where: { uuid },
});
if (!project) {
throw new HttpException(
`A project with the uuid '${uuid}' doesn't exists.`,
HttpStatus.BAD_REQUEST,
);
}
return project;
}
} }

View File

@ -21,9 +21,11 @@ import {
} from '@app/common/modules/scene/repositories'; } from '@app/common/modules/scene/repositories';
import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories'; import { SceneDeviceRepository } from '@app/common/modules/scene-device/repositories';
import { AutomationRepository } from '@app/common/modules/automation/repositories'; import { AutomationRepository } from '@app/common/modules/automation/repositories';
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { VisitorPasswordProjectController } from './controllers';
@Module({ @Module({
imports: [ConfigModule, DeviceRepositoryModule, DoorLockModule], imports: [ConfigModule, DeviceRepositoryModule, DoorLockModule],
controllers: [VisitorPasswordController], controllers: [VisitorPasswordController, VisitorPasswordProjectController],
providers: [ providers: [
VisitorPasswordService, VisitorPasswordService,
EmailService, EmailService,
@ -41,6 +43,7 @@ import { AutomationRepository } from '@app/common/modules/automation/repositorie
SceneRepository, SceneRepository,
SceneDeviceRepository, SceneDeviceRepository,
AutomationRepository, AutomationRepository,
ProjectRepository,
], ],
exports: [VisitorPasswordService], exports: [VisitorPasswordService],
}) })