Add user device permission CRUD operations

This commit is contained in:
faris Aljohari
2024-05-05 19:48:03 +03:00
parent 5aa69255be
commit fa6929a4e5
8 changed files with 155 additions and 45 deletions

View File

@ -0,0 +1 @@
export * from './user-device-permission.controller';

View File

@ -1,7 +1,9 @@
import { import {
Body, Body,
Controller, Controller,
Delete,
Get, Get,
HttpException,
HttpStatus, HttpStatus,
Param, Param,
Post, Post,
@ -24,8 +26,8 @@ export class UserDevicePermissionController {
private readonly userDevicePermissionService: UserDevicePermissionService, private readonly userDevicePermissionService: UserDevicePermissionService,
) {} ) {}
@ApiBearerAuth() // @ApiBearerAuth()
@UseGuards(JwtAuthGuard) // @UseGuards(JwtAuthGuard)
@Post('add') @Post('add')
async addDevicePermission( async addDevicePermission(
@Body() userDevicePermissionDto: UserDevicePermissionAddDto, @Body() userDevicePermissionDto: UserDevicePermissionAddDto,
@ -40,40 +42,45 @@ export class UserDevicePermissionController {
message: 'User Permission for Devices Added Successfully', message: 'User Permission for Devices Added Successfully',
data: addDetails, data: addDetails,
}; };
} catch (err) { } catch (error) {
throw new Error(err); throw new HttpException(
error.message || 'Internal server error',
error.status || HttpStatus.INTERNAL_SERVER_ERROR,
);
} }
} }
@ApiBearerAuth() @ApiBearerAuth()
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@Put('edit/:userId') @Put('edit/:devicePermissionUuid')
async editDevicePermission( async editDevicePermission(
@Param('userId') userId: string, @Param('devicePermissionUuid') devicePermissionUuid: string,
@Body() userDevicePermissionEditDto: UserDevicePermissionEditDto, @Body() userDevicePermissionEditDto: UserDevicePermissionEditDto,
) { ) {
try { try {
await this.userDevicePermissionService.editUserPermission( await this.userDevicePermissionService.editUserPermission(
userId, devicePermissionUuid,
userDevicePermissionEditDto, userDevicePermissionEditDto,
); );
return { return {
statusCode: HttpStatus.OK, statusCode: HttpStatus.OK,
message: 'User Permission for Devices Updated Successfully', message: 'User Permission for Devices Updated Successfully',
data: {},
}; };
} catch (err) { } catch (error) {
throw new Error(err); throw new HttpException(
error.message || 'Internal server error',
error.status || HttpStatus.INTERNAL_SERVER_ERROR,
);
} }
} }
@ApiBearerAuth() @ApiBearerAuth()
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@Get('list') @Get(':deviceUuid/list')
async fetchDevicePermission() { async fetchDevicePermission(@Param('deviceUuid') deviceUuid: string) {
try { try {
const deviceDetails = const deviceDetails =
await this.userDevicePermissionService.fetchuserPermission(); await this.userDevicePermissionService.fetchUserPermission(deviceUuid);
return { return {
statusCode: HttpStatus.OK, statusCode: HttpStatus.OK,
message: 'Device Details fetched Successfully', message: 'Device Details fetched Successfully',
@ -83,4 +90,25 @@ export class UserDevicePermissionController {
throw new Error(err); 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,
);
}
}
} }

View File

@ -0,0 +1,2 @@
export * from './user-device-permission.add.dto';
export * from './user-device-permission.edit.dto';

View File

@ -1,28 +1,29 @@
import { PermissionType } from '@app/common/constants/permission-type.enum';
import { ApiProperty } from '@nestjs/swagger'; import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsString } from 'class-validator'; import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
export class UserDevicePermissionAddDto { export class UserDevicePermissionAddDto {
@ApiProperty({ @ApiProperty({
description: 'user id', description: 'user uuid',
required: true, required: true,
}) })
@IsString() @IsString()
@IsNotEmpty() @IsNotEmpty()
userId: string; userUuid: string;
@ApiProperty({ @ApiProperty({
description: 'permission type id', description: 'permission type',
enum: PermissionType,
required: true, required: true,
}) })
@IsString() @IsEnum(PermissionType)
@IsNotEmpty() permissionType: PermissionType;
permissionTypeId: string;
@ApiProperty({ @ApiProperty({
description: 'device id', description: 'device uuid',
required: true, required: true,
}) })
@IsString() @IsString()
@IsNotEmpty() @IsNotEmpty()
deviceId: string; deviceUuid: string;
} }

View File

@ -1,7 +1,13 @@
import { OmitType } from '@nestjs/swagger'; import { PermissionType } from '@app/common/constants/permission-type.enum';
import { UserDevicePermissionAddDto } from './user-device-permission.add.dto'; import { ApiProperty } from '@nestjs/swagger';
import { IsEnum } from 'class-validator';
export class UserDevicePermissionEditDto extends OmitType( export class UserDevicePermissionEditDto {
UserDevicePermissionAddDto, @ApiProperty({
['userId'], description: 'permission type',
) {} enum: PermissionType,
required: true,
})
@IsEnum(PermissionType)
permissionType: PermissionType;
}

View File

@ -0,0 +1 @@
export * from './user-device-permission.service';

View File

@ -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 { UserDevicePermissionAddDto } from '../dtos/user-device-permission.add.dto';
import { UserDevicePermissionEditDto } from '../dtos/user-device-permission.edit.dto'; import { UserDevicePermissionEditDto } from '../dtos/user-device-permission.edit.dto';
import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories'; import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories';
import { PermissionTypeRepository } from '@app/common/modules/permission/repositories';
@Injectable() @Injectable()
export class UserDevicePermissionService { export class UserDevicePermissionService {
constructor( constructor(
private readonly deviceUserPermissionRepository: DeviceUserPermissionRepository, private readonly deviceUserPermissionRepository: DeviceUserPermissionRepository,
private readonly permissionTypeRepository: PermissionTypeRepository,
) {} ) {}
async addUserPermission(userDevicePermissionDto: UserDevicePermissionAddDto) { async addUserPermission(userDevicePermissionDto: UserDevicePermissionAddDto) {
return await this.deviceUserPermissionRepository.save({ try {
userUuid: userDevicePermissionDto.userId, const permissionType = await this.getPermissionType(
deviceUuid: userDevicePermissionDto.deviceId, userDevicePermissionDto.permissionType,
permissionTypeUuid: userDevicePermissionDto.permissionTypeId, );
}); 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( async editUserPermission(
userId: string, devicePermissionUuid: string,
userDevicePermissionEditDto: UserDevicePermissionEditDto, userDevicePermissionEditDto: UserDevicePermissionEditDto,
) { ) {
return await this.deviceUserPermissionRepository.update( try {
{ userUuid: userId }, const permissionType = await this.getPermissionType(
{ userDevicePermissionEditDto.permissionType,
deviceUuid: userDevicePermissionEditDto.deviceId, );
permissionType: { return await this.deviceUserPermissionRepository.update(
uuid: userDevicePermissionEditDto.permissionTypeId, { 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() { async fetchUserPermission(deviceUuid: string) {
return await this.deviceUserPermissionRepository.find(); 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,
);
}
} }
} }

View File

@ -5,12 +5,14 @@ import { ConfigModule } from '@nestjs/config';
import { UserDevicePermissionService } from './services/user-device-permission.service'; import { UserDevicePermissionService } from './services/user-device-permission.service';
import { UserDevicePermissionController } from './controllers/user-device-permission.controller'; import { UserDevicePermissionController } from './controllers/user-device-permission.controller';
import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories'; import { DeviceUserPermissionRepository } from '@app/common/modules/device-user-permission/repositories';
import { PermissionTypeRepository } from '@app/common/modules/permission/repositories';
@Module({ @Module({
imports: [ConfigModule, DeviceRepositoryModule], imports: [ConfigModule, DeviceRepositoryModule],
controllers: [UserDevicePermissionController], controllers: [UserDevicePermissionController],
providers: [ providers: [
DeviceUserPermissionRepository, DeviceUserPermissionRepository,
PermissionTypeRepository,
DeviceRepository, DeviceRepository,
UserDevicePermissionService, UserDevicePermissionService,
], ],