FEAT: get permissions working

This commit is contained in:
Gabriel Rosa
2022-07-12 15:43:21 -03:00
parent f5064420a7
commit d5cd562860
5 changed files with 60 additions and 16 deletions
@@ -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)),
);
+3 -3
View File
@@ -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<string, Permission>;
permissions: Record<string, PermissionsObjectPermission>;
}
/*
+10 -1
View File
@@ -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';
}
@@ -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,
);
}
}
+23 -6
View File
@@ -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;
}
}