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 {
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,
);
}
}
}

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 { 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;
}

View File

@ -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;
}

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 { 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) {
try {
const permissionType = await this.getPermissionType(
userDevicePermissionDto.permissionType,
);
return await this.deviceUserPermissionRepository.save({
userUuid: userDevicePermissionDto.userId,
deviceUuid: userDevicePermissionDto.deviceId,
permissionTypeUuid: userDevicePermissionDto.permissionTypeId,
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,
) {
try {
const permissionType = await this.getPermissionType(
userDevicePermissionEditDto.permissionType,
);
return await this.deviceUserPermissionRepository.update(
{ userUuid: userId },
{ uuid: devicePermissionUuid },
{
deviceUuid: userDevicePermissionEditDto.deviceId,
permissionType: {
uuid: userDevicePermissionEditDto.permissionTypeId,
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,
);
}
}
}

View File

@ -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,
],