diff --git a/src/user-device-permission/controllers/index.ts b/src/user-device-permission/controllers/index.ts index e69de29..9ea28cf 100644 --- a/src/user-device-permission/controllers/index.ts +++ b/src/user-device-permission/controllers/index.ts @@ -0,0 +1 @@ +export * from './user-device-permission.controller'; diff --git a/src/user-device-permission/controllers/user-device-permission.controller.ts b/src/user-device-permission/controllers/user-device-permission.controller.ts index f5e253f..825694f 100644 --- a/src/user-device-permission/controllers/user-device-permission.controller.ts +++ b/src/user-device-permission/controllers/user-device-permission.controller.ts @@ -1,7 +1,9 @@ import { Body, Controller, + Delete, Get, + HttpException, HttpStatus, Param, Post, @@ -24,8 +26,8 @@ export class UserDevicePermissionController { private readonly userDevicePermissionService: UserDevicePermissionService, ) {} - @ApiBearerAuth() - @UseGuards(JwtAuthGuard) + // @ApiBearerAuth() + // @UseGuards(JwtAuthGuard) @Post('add') async addDevicePermission( @Body() userDevicePermissionDto: UserDevicePermissionAddDto, @@ -40,40 +42,45 @@ export class UserDevicePermissionController { message: 'User Permission for Devices Added Successfully', data: addDetails, }; - } catch (err) { - throw new Error(err); + } catch (error) { + throw new HttpException( + error.message || 'Internal server error', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); } } @ApiBearerAuth() @UseGuards(JwtAuthGuard) - @Put('edit/:userId') + @Put('edit/:devicePermissionUuid') async editDevicePermission( - @Param('userId') userId: string, + @Param('devicePermissionUuid') devicePermissionUuid: string, @Body() userDevicePermissionEditDto: UserDevicePermissionEditDto, ) { try { await this.userDevicePermissionService.editUserPermission( - userId, + devicePermissionUuid, userDevicePermissionEditDto, ); return { statusCode: HttpStatus.OK, message: 'User Permission for Devices Updated Successfully', - data: {}, }; - } catch (err) { - throw new Error(err); + } catch (error) { + throw new HttpException( + error.message || 'Internal server error', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); } } @ApiBearerAuth() @UseGuards(JwtAuthGuard) - @Get('list') - async fetchDevicePermission() { + @Get(':deviceUuid/list') + async fetchDevicePermission(@Param('deviceUuid') deviceUuid: string) { try { const deviceDetails = - await this.userDevicePermissionService.fetchuserPermission(); + await this.userDevicePermissionService.fetchUserPermission(deviceUuid); return { statusCode: HttpStatus.OK, message: 'Device Details fetched Successfully', @@ -83,4 +90,25 @@ export class UserDevicePermissionController { throw new Error(err); } } + @ApiBearerAuth() + @UseGuards(JwtAuthGuard) + @Delete(':devicePermissionUuid') + async deleteDevicePermission( + @Param('devicePermissionUuid') devicePermissionUuid: string, + ) { + try { + await this.userDevicePermissionService.deleteDevicePermission( + devicePermissionUuid, + ); + return { + statusCode: HttpStatus.OK, + message: 'User Permission for Devices Deleted Successfully', + }; + } catch (error) { + throw new HttpException( + error.message || 'Internal server error', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } } diff --git a/src/user-device-permission/dtos/index.ts b/src/user-device-permission/dtos/index.ts index e69de29..7792d07 100644 --- a/src/user-device-permission/dtos/index.ts +++ b/src/user-device-permission/dtos/index.ts @@ -0,0 +1,2 @@ +export * from './user-device-permission.add.dto'; +export * from './user-device-permission.edit.dto'; diff --git a/src/user-device-permission/dtos/user-device-permission.add.dto.ts b/src/user-device-permission/dtos/user-device-permission.add.dto.ts index c7459df..12ee133 100644 --- a/src/user-device-permission/dtos/user-device-permission.add.dto.ts +++ b/src/user-device-permission/dtos/user-device-permission.add.dto.ts @@ -1,28 +1,29 @@ +import { PermissionType } from '@app/common/constants/permission-type.enum'; import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsString } from 'class-validator'; +import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; export class UserDevicePermissionAddDto { @ApiProperty({ - description: 'user id', + description: 'user uuid', required: true, }) @IsString() @IsNotEmpty() - userId: string; + userUuid: string; @ApiProperty({ - description: 'permission type id', + description: 'permission type', + enum: PermissionType, required: true, }) - @IsString() - @IsNotEmpty() - permissionTypeId: string; + @IsEnum(PermissionType) + permissionType: PermissionType; @ApiProperty({ - description: 'device id', + description: 'device uuid', required: true, }) @IsString() @IsNotEmpty() - deviceId: string; + deviceUuid: string; } diff --git a/src/user-device-permission/dtos/user-device-permission.edit.dto.ts b/src/user-device-permission/dtos/user-device-permission.edit.dto.ts index 7cc4fce..ce537e1 100644 --- a/src/user-device-permission/dtos/user-device-permission.edit.dto.ts +++ b/src/user-device-permission/dtos/user-device-permission.edit.dto.ts @@ -1,7 +1,13 @@ -import { OmitType } from '@nestjs/swagger'; -import { UserDevicePermissionAddDto } from './user-device-permission.add.dto'; +import { PermissionType } from '@app/common/constants/permission-type.enum'; +import { ApiProperty } from '@nestjs/swagger'; +import { IsEnum } from 'class-validator'; -export class UserDevicePermissionEditDto extends OmitType( - UserDevicePermissionAddDto, - ['userId'], -) {} +export class UserDevicePermissionEditDto { + @ApiProperty({ + description: 'permission type', + enum: PermissionType, + required: true, + }) + @IsEnum(PermissionType) + permissionType: PermissionType; +} diff --git a/src/user-device-permission/services/index.ts b/src/user-device-permission/services/index.ts index e69de29..1dc9e53 100644 --- a/src/user-device-permission/services/index.ts +++ b/src/user-device-permission/services/index.ts @@ -0,0 +1 @@ +export * from './user-device-permission.service'; diff --git a/src/user-device-permission/services/user-device-permission.service.ts b/src/user-device-permission/services/user-device-permission.service.ts index 64073a1..b02cb6a 100644 --- a/src/user-device-permission/services/user-device-permission.service.ts +++ b/src/user-device-permission/services/user-device-permission.service.ts @@ -1,38 +1,107 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { UserDevicePermissionAddDto } from '../dtos/user-device-permission.add.dto'; import { UserDevicePermissionEditDto } from '../dtos/user-device-permission.edit.dto'; import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories'; +import { PermissionTypeRepository } from '@app/common/modules/permission/repositories'; @Injectable() export class UserDevicePermissionService { constructor( private readonly deviceUserPermissionRepository: DeviceUserPermissionRepository, + private readonly permissionTypeRepository: PermissionTypeRepository, ) {} async addUserPermission(userDevicePermissionDto: UserDevicePermissionAddDto) { - return await this.deviceUserPermissionRepository.save({ - userUuid: userDevicePermissionDto.userId, - deviceUuid: userDevicePermissionDto.deviceId, - permissionTypeUuid: userDevicePermissionDto.permissionTypeId, - }); + try { + const permissionType = await this.getPermissionType( + userDevicePermissionDto.permissionType, + ); + return await this.deviceUserPermissionRepository.save({ + userUuid: userDevicePermissionDto.userUuid, + deviceUuid: userDevicePermissionDto.deviceUuid, + permissionType: { + uuid: permissionType.uuid, + }, + }); + } catch (error) { + if (error.code === '23505') { + throw new HttpException( + 'This Permission already belongs to this user', + HttpStatus.BAD_REQUEST, + ); + } + throw new HttpException( + error.message || 'Internal Server Error', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } } async editUserPermission( - userId: string, + devicePermissionUuid: string, userDevicePermissionEditDto: UserDevicePermissionEditDto, ) { - return await this.deviceUserPermissionRepository.update( - { userUuid: userId }, - { - deviceUuid: userDevicePermissionEditDto.deviceId, - permissionType: { - uuid: userDevicePermissionEditDto.permissionTypeId, + try { + const permissionType = await this.getPermissionType( + userDevicePermissionEditDto.permissionType, + ); + return await this.deviceUserPermissionRepository.update( + { uuid: devicePermissionUuid }, + { + permissionType: { + uuid: permissionType.uuid, + }, }, - }, - ); + ); + } catch (error) { + if (error.code === '23505') { + throw new HttpException( + 'This Permission already belongs to this user', + HttpStatus.BAD_REQUEST, + ); + } + throw new HttpException( + error.message || 'Internal Server Error', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } } - async fetchuserPermission() { - return await this.deviceUserPermissionRepository.find(); + async fetchUserPermission(deviceUuid: string) { + const devicePermissions = await this.deviceUserPermissionRepository.find({ + where: { + deviceUuid: deviceUuid, + }, + relations: ['permissionType', 'user'], + }); + return devicePermissions.map((permission) => { + return { + uuid: permission.uuid, + deviceUuid: permission.deviceUuid, + firstName: permission.user.firstName, + lastName: permission.user.lastName, + email: permission.user.email, + permissionType: permission.permissionType.type, + }; + }); + } + private async getPermissionType(permissionType: string) { + return await this.permissionTypeRepository.findOne({ + where: { + type: permissionType, + }, + }); + } + async deleteDevicePermission(devicePermissionUuid: string) { + try { + return await this.deviceUserPermissionRepository.delete({ + uuid: devicePermissionUuid, + }); + } catch (error) { + throw new HttpException( + error.message || 'Internal Server Error', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } } } diff --git a/src/user-device-permission/user-device-permission.module.ts b/src/user-device-permission/user-device-permission.module.ts index b7e5dbd..e2a8b46 100644 --- a/src/user-device-permission/user-device-permission.module.ts +++ b/src/user-device-permission/user-device-permission.module.ts @@ -5,12 +5,14 @@ import { ConfigModule } from '@nestjs/config'; import { UserDevicePermissionService } from './services/user-device-permission.service'; import { UserDevicePermissionController } from './controllers/user-device-permission.controller'; import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories'; +import { PermissionTypeRepository } from '@app/common/modules/permission/repositories'; @Module({ imports: [ConfigModule, DeviceRepositoryModule], controllers: [UserDevicePermissionController], providers: [ DeviceUserPermissionRepository, + PermissionTypeRepository, DeviceRepository, UserDevicePermissionService, ],