Add permission and role management features

This commit is contained in:
faris Aljohari
2024-12-16 00:19:14 -06:00
parent 57397e653a
commit 64027d3a16
22 changed files with 473 additions and 17 deletions
+1
View File
@@ -0,0 +1 @@
export * from './permission.controller';
@@ -0,0 +1,24 @@
import { Controller, Get, Param } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';
import { ControllerRoute } from '@app/common/constants/controller-route';
import { EnableDisableStatusEnum } from '@app/common/constants/days.enum';
import { PermissionService } from '../services';
@ApiTags('Permission Module')
@Controller({
version: EnableDisableStatusEnum.ENABLED,
path: ControllerRoute.PERMISSION.ROUTE,
})
export class PermissionController {
constructor(private readonly permissionService: PermissionService) {}
@Get(':roleUuid')
@ApiOperation({
summary: ControllerRoute.PERMISSION.ACTIONS.GET_PERMISSION_BY_ROLE_SUMMARY,
description:
ControllerRoute.PERMISSION.ACTIONS.GET_PERMISSION_BY_ROLE_DESCRIPTION,
})
async getPermissionsByRole(@Param('roleUuid') roleUuid: string) {
return await this.permissionService.getPermissionsByRole(roleUuid);
}
}
+14
View File
@@ -0,0 +1,14 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { CommonModule } from '@app/common';
import { PermissionController } from './controllers';
import { PermissionService } from './services';
import { RoleTypeRepository } from '@app/common/modules/role-type/repositories';
@Module({
imports: [ConfigModule, CommonModule],
controllers: [PermissionController],
providers: [PermissionService, RoleTypeRepository],
exports: [PermissionService],
})
export class PermissionModule {}
+1
View File
@@ -0,0 +1 @@
export * from './permission.service';
@@ -0,0 +1,52 @@
import { PermissionMapping } from '@app/common/constants/permissions-mapping';
import { RolePermissions } from '@app/common/constants/role-permissions';
import { RoleType } from '@app/common/constants/role.type.enum';
import { RoleTypeRepository } from '@app/common/modules/role-type/repositories';
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
@Injectable()
export class PermissionService {
constructor(private readonly roleTypeRepository: RoleTypeRepository) {}
async getPermissionsByRole(roleUuid: string) {
try {
const role = await this.roleTypeRepository.findOne({
where: {
uuid: roleUuid,
},
});
if (!role) {
throw new HttpException('Role not found', HttpStatus.NOT_FOUND);
}
const permissions = this.mapPermissions(role.type.toString() as RoleType);
return permissions;
} catch (err) {
throw new HttpException(
err.message || 'Internal Server Error',
err.status || HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
mapPermissions(role: RoleType): any[] {
const rolePermissions = RolePermissions[role]; // Permissions for the role
const mappedPermissions = Object.entries(PermissionMapping).map(
([title, subOptions]) => ({
title,
subOptions: Object.entries(subOptions).map(
([subTitle, permissions]) => ({
title: subTitle,
subOptions: permissions.map((permission) => ({
title: permission,
isChecked: rolePermissions.includes(`${subTitle}_${permission}`), // Check if the role has the permission
})),
}),
),
}),
);
return mappedPermissions;
}
}