From 007178fab69a2018b7c0be94b171b60560e744fa Mon Sep 17 00:00:00 2001 From: sahil-jassal-sf Date: Fri, 5 Jan 2024 15:00:30 +0530 Subject: [PATCH] refactor(chore): fix sonar code smells fix sonar code smells related to cognitive complexity, empty constructor and method types GH-116 --- .../casbin-authorization-action.provider.ts | 23 ++++--- .../casbin-enforcer-config.provider.ts | 6 +- src/providers/user-permissions.provider.ts | 4 -- src/types.ts | 68 ++++++++++--------- 4 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/providers/casbin-authorization-action.provider.ts b/src/providers/casbin-authorization-action.provider.ts index 43bce64..732a70f 100644 --- a/src/providers/casbin-authorization-action.provider.ts +++ b/src/providers/casbin-authorization-action.provider.ts @@ -2,7 +2,6 @@ import {Getter, inject, Provider} from '@loopback/core'; import {Request} from '@loopback/express'; import {HttpErrors} from '@loopback/rest'; import * as casbin from 'casbin'; - import {AuthorizationBindings} from '../keys'; import { AuthorizationMetadata, @@ -63,15 +62,7 @@ export class CasbinAuthorizationProvider } const subject = this.getUserName(`${user.id}`); - let desiredPermissions; - - if (metadata.permissions && metadata.permissions.length > 0) { - desiredPermissions = metadata.permissions; - } else { - throw new HttpErrors.Unauthorized( - `Permissions are missing in the decorator.`, - ); - } + const desiredPermissions = this.getDesiredPermissions(metadata); // Fetch casbin config by invoking casbin-config-getter-provider const casbinConfig = await this.getCasbinEnforcerConfig( @@ -90,7 +81,7 @@ export class CasbinAuthorizationProvider ); } // In case casbin policy is coming via provider, use that to initialise enforcer - else if (!metadata.isCasbinPolicy && casbinConfig.allowedRes) { + else if (casbinConfig.allowedRes) { const policy = this.createCasbinPolicy( casbinConfig.allowedRes, subject, @@ -124,6 +115,16 @@ export class CasbinAuthorizationProvider return `u${id}`; } + getDesiredPermissions(metadata: AuthorizationMetadata): Array { + if (metadata.permissions && metadata.permissions.length > 0) { + return metadata.permissions; + } else { + throw new HttpErrors.Unauthorized( + `Permissions are missing in the decorator.`, + ); + } + } + // Create casbin policy for user based on ResourcePermission data provided by extension client createCasbinPolicy( resPermObj: ResourcePermissionObject[], diff --git a/src/providers/casbin-enforcer-config.provider.ts b/src/providers/casbin-enforcer-config.provider.ts index d3f26c7..11395a5 100644 --- a/src/providers/casbin-enforcer-config.provider.ts +++ b/src/providers/casbin-enforcer-config.provider.ts @@ -1,15 +1,11 @@ import {Provider} from '@loopback/context'; -import {CasbinEnforcerConfigGetterFn, IAuthUserWithPermissions} from '../types'; import {HttpErrors} from '@loopback/rest'; +import {CasbinEnforcerConfigGetterFn, IAuthUserWithPermissions} from '../types'; export class CasbinEnforcerProvider implements Provider { - constructor() { - //This is intentional - } - value(): CasbinEnforcerConfigGetterFn { return async ( authUser: IAuthUserWithPermissions, diff --git a/src/providers/user-permissions.provider.ts b/src/providers/user-permissions.provider.ts index 20b1b9d..08cf348 100644 --- a/src/providers/user-permissions.provider.ts +++ b/src/providers/user-permissions.provider.ts @@ -5,10 +5,6 @@ import {UserPermission, UserPermissionsFn} from '../types'; export class UserPermissionsProvider implements Provider> { - constructor() { - //This is intentional - } - value(): UserPermissionsFn { return (userPermissions, rolePermissions) => this.action(userPermissions, rolePermissions); diff --git a/src/types.ts b/src/types.ts index 7d337bb..8e4c0f5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,27 +3,29 @@ import {FileAdapter, Model} from 'casbin'; import PostgresAdapter from 'casbin-pg-adapter'; /** - * Authorize action method interface + * Authorize action method type + * + * @param userPermissions - Array of permission keys granted to the user + * This is actually a union of permissions picked up based on role + * attached to the user and allowed permissions at specific user level */ -export interface AuthorizeFn { - // userPermissions - Array of permission keys granted to the user - // This is actually a union of permissions picked up based on role - // attached to the user and allowed permissions at specific user level - (userPermissions: string[], request?: Request): Promise; -} +export type AuthorizeFn = ( + userPermissions: string[], + request?: Request, +) => Promise; /** - * Casbin authorize action method interface + * Casbin authorize action method type + * @param user - User object corresponding to the logged in user + * @param resVal - value of the resource for which authorisation is being sought + * */ -export interface CasbinAuthorizeFn { - // user - User object corresponding to the logged in user - // resVal - value of the resource for which authorisation is being sought - ( - user: IAuthUserWithPermissions, - resVal: string, - request: Request, - ): Promise; -} +export type CasbinAuthorizeFn = ( + user: IAuthUserWithPermissions, + resVal: string, + request: Request, +) => Promise; + export type PermissionObject = { [controller: string]: { [method: string]: string[]; @@ -82,40 +84,40 @@ export interface UserPermission { } /** - * User permissions manipulation method interface. + * User permissions manipulation method type. * * This is where we can add our business logic to read and * union permissions associated to user via role with * those associated directly to the user. * */ -export interface UserPermissionsFn { - (userPermissions: UserPermission[], rolePermissions: T[]): T[]; -} +export type UserPermissionsFn = ( + userPermissions: UserPermission[], + rolePermissions: T[], +) => T[]; /** - * Casbin enforcer getter method interface + * Casbin enforcer getter method type * * This method provides the Casbin config * required to initialise a Casbin enforcer */ -export interface CasbinEnforcerConfigGetterFn { - ( - authUser: IAuthUserWithPermissions, - resource: string, - isCasbinPolicy?: boolean, - ): Promise; -} +export type CasbinEnforcerConfigGetterFn = ( + authUser: IAuthUserWithPermissions, + resource: string, + isCasbinPolicy?: boolean, +) => Promise; /** - * Casbin resource value modifier method interface + * Casbin resource value modifier method type * * This method can help modify the resource value * for integration with casbin, as per business logic */ -export interface CasbinResourceModifierFn { - (pathParams: string[], req: Request): Promise; -} +export type CasbinResourceModifierFn = ( + pathParams: string[], + req: Request, +) => Promise; /** * Casbin config object