From d5cd5628609c0805bac3fcc7e376f7971a9f79a6 Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Tue, 12 Jul 2022 15:43:21 -0300 Subject: [PATCH] FEAT: get permissions working --- .../authentication.decorator.ts | 10 +++++-- src/authentication/permissions.enum.ts | 6 ++-- src/modules/permissions/dto/entities.ts | 11 ++++++- .../permissions/permissions.controller.ts | 20 +++++++++++-- .../permissions/permissions.service.ts | 29 +++++++++++++++---- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/authentication/authentication.decorator.ts b/src/authentication/authentication.decorator.ts index 6c86f13..5bebd81 100644 --- a/src/authentication/authentication.decorator.ts +++ b/src/authentication/authentication.decorator.ts @@ -1,6 +1,6 @@ import { Request } from 'express'; import { CustomDecorator } from '@nestjs/common'; -import { Permission } from './permissions.enum'; +import { PermissionsObjectPermission } from './permissions.enum'; import { RequestUser } from './user.decorator'; export const AUTH_FUNCTION_KEY = '__AUTH_FUNCTION__'; @@ -31,13 +31,17 @@ function SetMultipleMetadata(metadataKey, metadataValue): CustomDecorator { return decoratorFactory as any; } -export function RequireAllPermissions(...permissions: Permission[]) { +export function RequireAllPermissions( + ...permissions: PermissionsObjectPermission[] +) { return SetMultipleMetadata(AUTH_FUNCTION_KEY, (req, user: RequestUser) => permissions.every(({ seqid }) => user.permissions.includes(seqid)), ); } -export function RequireSomePermission(...permissions: Permission[]) { +export function RequireSomePermission( + ...permissions: PermissionsObjectPermission[] +) { return SetMultipleMetadata(AUTH_FUNCTION_KEY, (req, user: RequestUser) => permissions.some(({ seqid }) => user.permissions.includes(seqid)), ); diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 4589d3a..4f0b3f3 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -8,7 +8,7 @@ export enum PermissionUsages { INTERNAL = 'internal', } -export interface Permission { +export interface PermissionsObjectPermission { seqid: number; claim: string; usage: PermissionUsages; @@ -17,12 +17,12 @@ export interface Permission { 'en-us': string; }; } -export interface PermissionGroup { +export interface PermissionsObjectGroup { title: { 'pt-br': string; 'en-us': string; }; - permissions: Record; + permissions: Record; } /* diff --git a/src/modules/permissions/dto/entities.ts b/src/modules/permissions/dto/entities.ts index f4dc174..9e084d5 100644 --- a/src/modules/permissions/dto/entities.ts +++ b/src/modules/permissions/dto/entities.ts @@ -1,4 +1,4 @@ -import { ApiProperty } from '@nestjs/swagger'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class PermissionDto { @ApiProperty() @@ -33,3 +33,12 @@ export class GetPublicPermissionsRes { @ApiProperty({ type: [PermissionGroup] }) permissionGroups: PermissionGroup[]; } + +export enum LanguageEnum { + ptbr = 'pt-br', + enus = 'en-us', +} +export class GetPublicPermissionsHeader { + @ApiPropertyOptional({ enum: LanguageEnum }) + 'dadosfera-lang'; +} diff --git a/src/modules/permissions/permissions.controller.ts b/src/modules/permissions/permissions.controller.ts index 539c87a..12c8db1 100644 --- a/src/modules/permissions/permissions.controller.ts +++ b/src/modules/permissions/permissions.controller.ts @@ -1,8 +1,13 @@ -import { Controller, Get, Inject } from '@nestjs/common'; +import { Controller, Get, Headers, Inject } from '@nestjs/common'; import { ApiOkResponse, ApiTags } from '@nestjs/swagger'; import { DadosferaLogger } from 'dadosfera-logs'; +import { PermissionUsages } from 'src/authentication/permissions.enum'; import { User } from 'src/authentication/user.decorator'; -import { GetPublicPermissionsRes } from './dto/entities'; +import { + GetPublicPermissionsHeader, + GetPublicPermissionsRes, + LanguageEnum, +} from './dto/entities'; import { PermissionsClientService } from './permissions.service'; @ApiTags('Permissions') @@ -20,7 +25,16 @@ export class PermissionsController { @Get() @ApiOkResponse({ type: GetPublicPermissionsRes }) - getPublicPermissions(@User() user) { + getPublicPermissions( + @User() user, + @Headers() headers: GetPublicPermissionsHeader, + ) { this.logger.info('getPublicPermissions', { user }); + + const language: LanguageEnum = headers['dadosfera-lang']; + return this.permissionsService.getPermissions( + PermissionUsages.PUBLIC, + language, + ); } } diff --git a/src/modules/permissions/permissions.service.ts b/src/modules/permissions/permissions.service.ts index 67c700e..480dab7 100644 --- a/src/modules/permissions/permissions.service.ts +++ b/src/modules/permissions/permissions.service.ts @@ -12,13 +12,14 @@ import { PermissionsProtoService as PermissionsServiceInterface } from 'protospa import { InjectPermissionsRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages'; import { DadosferaLogger } from 'dadosfera-logs'; import { - Permission, + PermissionsObjectPermission, PERMISSIONS, PermissionsObject, PermissionUsages, + PermissionsObjectGroup, } from '../../authentication/permissions.enum'; import ErrorBuilder from '../../utils/ErrorBuilder'; -import { PermissionGroup } from './dto/entities'; +import { LanguageEnum, PermissionDto, PermissionGroup } from './dto/entities'; @Injectable() export class PermissionsClientService @@ -73,11 +74,27 @@ export class PermissionsClientService this.permissionsService.InjectPermissions({ permissions }), ); } - getPublicPermissions() { - return this.getPermissions(PermissionUsages.PUBLIC); - } - getPermissions(permissionUsage?: PermissionUsages): PermissionGroup[] { + getPermissions( + permissionUsage?: PermissionUsages, + language: LanguageEnum = LanguageEnum.ptbr, + ): PermissionGroup[] { const groups: PermissionGroup[] = []; + for (const key in PERMISSIONS) { + const permissionGroup: PermissionsObjectGroup = PERMISSIONS[key]; + const title = permissionGroup.title[language]; + const permissions: PermissionDto[] = Object.values( + permissionGroup.permissions, + ) + .filter(({ usage }) => + permissionUsage ? usage === permissionUsage : true, + ) + .map(({ seqid, name }) => ({ id: seqid, name: name[language] })); + + groups.push({ + title, + permissions, + }); + } return groups; } }