fix(modules): moduleguards properly compare user_module_access to module_list, rather than user_roles to module_list
Optimize toStringFromBoolean mmethod to immediately return an array of Module strings rather than an object of string-string objects that needs to be filtered and manipulated further.
This commit is contained in:
parent
ebc1cd77d8
commit
e6c949e40b
|
|
@ -6,7 +6,7 @@ import {
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { Reflector } from '@nestjs/core';
|
import { Reflector } from '@nestjs/core';
|
||||||
import { MODULES_KEY } from '../decorators/modules-guard.decorators';
|
import { MODULES_KEY } from '../decorators/modules-guard.decorators';
|
||||||
import { Modules, Roles } from '.prisma/client';
|
import { Modules } from '.prisma/client';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -33,11 +33,13 @@ export class ModulesGuard implements CanActivate {
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!requiredModules.includes(user.role)) {
|
for (const module of requiredModules) {
|
||||||
|
if (!user.user_module_access.includes(module)) {
|
||||||
throw new ForbiddenException(
|
throw new ForbiddenException(
|
||||||
`The role ${user.role} is not authorized to access this resource.`,
|
`The role ${user.role} is not authorized to access this resource.`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,9 +35,8 @@ export const toBooleanFromString = (arr?: readonly string[] | null): Record<Modu
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const toStringFromBoolean = (map: Record<Modules, boolean>): Record<Modules, Modules | null> => {
|
export const toStringFromBoolean = (boolean_module_access: Record<Modules, boolean>): Modules[] => {
|
||||||
return module_list.reduce((acc, mod) => {
|
const access_array = Object.entries(boolean_module_access);
|
||||||
acc[mod] = map[mod] ? mod : null;
|
const allowed_accesses = access_array.filter(([_key, value]) => value === true);
|
||||||
return acc;
|
return allowed_accesses.map(([key]) => key as Modules);
|
||||||
}, {} as Record<Modules, Modules | null>);
|
|
||||||
}
|
}
|
||||||
|
|
@ -159,10 +159,7 @@ export class EmployeesService {
|
||||||
|
|
||||||
let module_access_array: Modules[] = [];
|
let module_access_array: Modules[] = [];
|
||||||
if (employee.user.user_module_access) {
|
if (employee.user.user_module_access) {
|
||||||
const stringfy_module_access = toStringFromBoolean(employee.user.user_module_access);
|
module_access_array = toStringFromBoolean(employee.user.user_module_access);
|
||||||
module_access_array = module_list
|
|
||||||
.map(mod => stringfy_module_access[mod])
|
|
||||||
.filter((value): value is Modules => value !== null && value !== undefined);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let company_name = 'Solucom';
|
let company_name = 'Solucom';
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { Injectable, NotFoundException } from '@nestjs/common';
|
import { Injectable, NotFoundException } from '@nestjs/common';
|
||||||
import { Users } from '@prisma/client';
|
import { Modules, Users } from '@prisma/client';
|
||||||
|
import { toStringFromBoolean } from 'src/common/mappers/module-access.mapper';
|
||||||
import { PrismaService } from 'src/prisma/prisma.service';
|
import { PrismaService } from 'src/prisma/prisma.service';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
|
@ -26,12 +27,16 @@ export abstract class AbstractUserService {
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw new NotFoundException(`No user with email #${email} exists`);
|
throw new NotFoundException(`No user with email #${email} exists`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let module_access: Modules[] = [];
|
||||||
|
if (user.user_module_access !== null) module_access = toStringFromBoolean(user.user_module_access);
|
||||||
|
|
||||||
const clean_user = {
|
const clean_user = {
|
||||||
first_name: user.first_name,
|
first_name: user.first_name,
|
||||||
last_name: user.last_name,
|
last_name: user.last_name,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
user_module_access: user.user_module_access,
|
user_module_access: module_access,
|
||||||
}
|
}
|
||||||
|
|
||||||
return clean_user;
|
return clean_user;
|
||||||
|
|
|
||||||
10
src/identity-and-account/users-management/user.dto.ts
Normal file
10
src/identity-and-account/users-management/user.dto.ts
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
import { Modules, Roles } from "@prisma/client";
|
||||||
|
import { IsArray, IsEmail, IsEnum, IsString } from "class-validator";
|
||||||
|
|
||||||
|
export class UserDto {
|
||||||
|
@IsString() first_name!: string;
|
||||||
|
@IsString() last_name!: string;
|
||||||
|
@IsEmail() email!: string;
|
||||||
|
@IsEnum(Roles) role!: string;
|
||||||
|
@IsArray() @IsEnum(Modules, { each: true }) user_module_access!: Modules[];
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user