From 2aed66d371237fe83e18ab69aafab794268539e3 Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Thu, 17 Apr 2025 15:20:27 -0300 Subject: [PATCH] FEAT: add decorator to block endpoint if not found module --- src/authentication/authentication.guard.ts | 1 + src/authentication/permissions.enum.ts | 5 +++++ src/decorators/authentication.decorator.ts | 8 ++++++++ src/decorators/user.decorator.ts | 1 + src/modules/customers/customers.controller.ts | 12 ++++++------ 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/authentication/authentication.guard.ts b/src/authentication/authentication.guard.ts index 7e938b0..bc69f8c 100644 --- a/src/authentication/authentication.guard.ts +++ b/src/authentication/authentication.guard.ts @@ -121,6 +121,7 @@ export class AuthenticationGuard customer_id: accessTokenPayload.customer_id, customer_name: accessTokenPayload.customer_name, customer_tier: accessTokenPayload.customer_tier, + customer_modules: accessTokenPayload.customer_modules, access_token: accessToken, }; // TODO: for backwards compatibility. remove in the future diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 5116cfe..4e23457 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -609,6 +609,11 @@ export interface DadosferaModule { key: string; permissionSeqId: number; } + +export const DADOSFERA_MODULES_KEYS = { + LOG_DASHBOARD: 'logs-dashboard' +} + export const DADOSFERA_MODULES: Array = [ { name: 'Intelligence Module', diff --git a/src/decorators/authentication.decorator.ts b/src/decorators/authentication.decorator.ts index 385ced0..03f9aed 100644 --- a/src/decorators/authentication.decorator.ts +++ b/src/decorators/authentication.decorator.ts @@ -25,6 +25,14 @@ export function RequireSomePermission( ); } +export function RequireModule( + key: string +) { + return createAuthenticatedDecorator((_, user: RequestUser) => + user.customer_modules.some(module => module === key), + ); +} + export function AuthenticateCondition(func: AuthenticationFunction) { return createAuthenticatedDecorator(func); } diff --git a/src/decorators/user.decorator.ts b/src/decorators/user.decorator.ts index 94b6045..2ce38ae 100644 --- a/src/decorators/user.decorator.ts +++ b/src/decorators/user.decorator.ts @@ -11,6 +11,7 @@ export interface RequestUser { customer_name: string; customer_tier: string; access_token: string; + customer_modules: string[]; } export const User: (options?: { required?: boolean }) => ParameterDecorator = diff --git a/src/modules/customers/customers.controller.ts b/src/modules/customers/customers.controller.ts index 7700eb3..c4980d0 100644 --- a/src/modules/customers/customers.controller.ts +++ b/src/modules/customers/customers.controller.ts @@ -12,10 +12,11 @@ import { UseFilters, } from '@nestjs/common'; import { ApiOkResponse, ApiProduces, ApiTags } from '@nestjs/swagger'; -import { PERMISSIONS_GROUPS } from 'src/authentication/permissions.enum'; +import { DADOSFERA_MODULES_KEYS, PERMISSIONS_GROUPS } from 'src/authentication/permissions.enum'; import { Authenticated, RequireAllPermissions, + RequireModule, } from 'src/decorators/authentication.decorator'; import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; import { CustomersService } from './customers.service'; @@ -97,15 +98,14 @@ export class CustomersController { @RequireAllPermissions( PERMISSIONS_GROUPS.USERS.permissions.ADMIN, ) + @RequireModule(DADOSFERA_MODULES_KEYS.LOG_DASHBOARD) async getCustomerMixPanelLogsDashboard( @User() user: RequestUser, - ): Promise<{ url: string }> { - this.logger.info('getLogsDashboardUrl'); + ): Promise<{ url: string }> { + this.logger.info('getLogsDashboardUrl'); const metadata = PackTheMetadata(user); - const result = await this.customersService.getLogsDashboardUrl(metadata); + const result = await this.customersService.getLogsDashboardUrl(metadata); return result; } - - }