mirror of
https://github.com/dadosfera/maestro.git
synced 2026-11-07 20:49:07 +00:00
FEAT: get permissions working
This commit is contained in:
@@ -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)),
|
||||
);
|
||||
|
||||
@@ -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>;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user