From 14cfc46492a38996fbbecd359b59c3211f2019da Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Thu, 14 Jul 2022 10:23:04 -0300 Subject: [PATCH] FEAT: Roles WIP --- package-lock.json | 16 +-- package.json | 2 +- src/authentication/permissions.enum.ts | 6 ++ .../permissions.controller.spec.ts | 4 +- .../permissions/permissions.controller.ts | 10 +- src/modules/permissions/permissions.module.ts | 5 +- .../permissions/permissions.service.ts | 31 ++++-- src/modules/roles/dto/entities.ts | 25 +++-- src/modules/roles/roles.controller.ts | 62 +++++++----- src/modules/roles/roles.module.ts | 2 + src/modules/roles/roles.service.ts | 97 +++++++++++++++++-- src/modules/users/dtos/entities.ts | 50 +++------- src/modules/users/users.controller.ts | 30 +++--- src/utils/ErrorBuilder.ts | 18 +++- src/utils/errorCodes.ts | 5 +- 15 files changed, 247 insertions(+), 116 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2373222..5e807ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.1", - "protospack-v2": "3.0.0", + "protospack-v2": "file:../protospack-v2/protospack-v2-0.0.0.tgz", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", @@ -9015,10 +9015,12 @@ } }, "node_modules/protospack-v2": { - "version": "3.0.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.0.0.tgz", - "integrity": "sha512-GEFbf8+vVaq/lA28K4nFf7bOSlghQJn/aeVnrYzh4YJUaa1+ccNz3uQs9p5OGbfjt2u/fFE5rHGEBUtueAA8KA==", + "version": "0.0.0", + "resolved": "file:../protospack-v2/protospack-v2-0.0.0.tgz", + "integrity": "sha512-/Pmor5eTfl0kRUC0uMsqsMojLnl3j5vMHhO9CYYQ9/5bYWSvq40+NovS9msyuqNsTW2oAYpGvMNDm6zeaV4Ciw==", + "license": "ISC", "dependencies": { + "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", "ts-proto": "^1.112.2" } @@ -17244,10 +17246,10 @@ } }, "protospack-v2": { - "version": "3.0.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.0.0.tgz", - "integrity": "sha512-GEFbf8+vVaq/lA28K4nFf7bOSlghQJn/aeVnrYzh4YJUaa1+ccNz3uQs9p5OGbfjt2u/fFE5rHGEBUtueAA8KA==", + "version": "file:../protospack-v2/protospack-v2-0.0.0.tgz", + "integrity": "sha512-/Pmor5eTfl0kRUC0uMsqsMojLnl3j5vMHhO9CYYQ9/5bYWSvq40+NovS9msyuqNsTW2oAYpGvMNDm6zeaV4Ciw==", "requires": { + "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", "ts-proto": "^1.112.2" } diff --git a/package.json b/package.json index e267cb9..ed44165 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.1", - "protospack-v2": "3.0.0", + "protospack-v2": "file:../protospack-v2/protospack-v2-0.0.0.tgz", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 4f0b3f3..3a8f1cc 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -17,6 +17,12 @@ export interface PermissionsObjectPermission { 'en-us': string; }; } +export interface PermissionsObjectPermissionTranslated { + seqid: number; + claim: string; + usage: PermissionUsages; + name?: string; +} export interface PermissionsObjectGroup { title: { 'pt-br': string; diff --git a/src/modules/permissions/permissions.controller.spec.ts b/src/modules/permissions/permissions.controller.spec.ts index 0f34649..04a0822 100644 --- a/src/modules/permissions/permissions.controller.spec.ts +++ b/src/modules/permissions/permissions.controller.spec.ts @@ -3,7 +3,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { DucClient } from 'src/clients/duc/client.config'; import { PermissionsController } from './permissions.controller'; import { DadosferaLogger } from 'dadosfera-logs'; -import { PermissionsClientService } from './permissions.service'; +import { PermissionsService } from './permissions.service'; const ducClient = new DucClient(); @@ -21,7 +21,7 @@ describe('PermissionsController', () => { ]), ], controllers: [PermissionsController], - providers: [DadosferaLogger, PermissionsClientService], + providers: [DadosferaLogger, PermissionsService], }).compile(); controller = module.get(PermissionsController); diff --git a/src/modules/permissions/permissions.controller.ts b/src/modules/permissions/permissions.controller.ts index 12c8db1..d63f3af 100644 --- a/src/modules/permissions/permissions.controller.ts +++ b/src/modules/permissions/permissions.controller.ts @@ -2,13 +2,13 @@ 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 { RequestUser, User } from 'src/authentication/user.decorator'; import { GetPublicPermissionsHeader, GetPublicPermissionsRes, LanguageEnum, } from './dto/entities'; -import { PermissionsClientService } from './permissions.service'; +import { PermissionsService } from './permissions.service'; @ApiTags('Permissions') @Controller('permissions') @@ -18,7 +18,7 @@ export class PermissionsController { constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, - private permissionsService: PermissionsClientService, + private permissionsService: PermissionsService, ) { this.logger = dadosferaLogger.logger; } @@ -26,13 +26,13 @@ export class PermissionsController { @Get() @ApiOkResponse({ type: GetPublicPermissionsRes }) getPublicPermissions( - @User() user, + @User() user: RequestUser, @Headers() headers: GetPublicPermissionsHeader, ) { this.logger.info('getPublicPermissions', { user }); const language: LanguageEnum = headers['dadosfera-lang']; - return this.permissionsService.getPermissions( + return this.permissionsService.getPermissionsGrouped( PermissionUsages.PUBLIC, language, ); diff --git a/src/modules/permissions/permissions.module.ts b/src/modules/permissions/permissions.module.ts index b569e7c..4475a81 100644 --- a/src/modules/permissions/permissions.module.ts +++ b/src/modules/permissions/permissions.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { ClientsModule } from '@nestjs/microservices'; import { DadosferaLogger } from 'dadosfera-logs'; -import { PermissionsClientService } from './permissions.service'; +import { PermissionsService } from './permissions.service'; import { DucClient } from '../../clients/duc/client.config'; import { PermissionsController } from './permissions.controller'; @@ -18,7 +18,8 @@ const ducClient = new DucClient(); }, ]), ], - providers: [PermissionsClientService, DadosferaLogger], + providers: [PermissionsService, DadosferaLogger], controllers: [PermissionsController], + exports: [PermissionsService], }) export class PermissionsModule {} diff --git a/src/modules/permissions/permissions.service.ts b/src/modules/permissions/permissions.service.ts index 480dab7..026dcbd 100644 --- a/src/modules/permissions/permissions.service.ts +++ b/src/modules/permissions/permissions.service.ts @@ -12,22 +12,21 @@ import { PermissionsProtoService as PermissionsServiceInterface } from 'protospa import { InjectPermissionsRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages'; import { DadosferaLogger } from 'dadosfera-logs'; import { - PermissionsObjectPermission, PERMISSIONS, - PermissionsObject, PermissionUsages, PermissionsObjectGroup, + PermissionsObjectPermissionTranslated, } from '../../authentication/permissions.enum'; import ErrorBuilder from '../../utils/ErrorBuilder'; import { LanguageEnum, PermissionDto, PermissionGroup } from './dto/entities'; @Injectable() -export class PermissionsClientService +export class PermissionsService implements OnModuleInit, OnApplicationBootstrap { logger: any; - private permissionsService: PermissionsServiceInterface; + private permissionsClientService: PermissionsServiceInterface; constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, @@ -37,7 +36,7 @@ export class PermissionsClientService } onModuleInit() { - this.permissionsService = + this.permissionsClientService = this.grpcClient.getService( ProtoServices.PermissionsProtoService, ); @@ -71,10 +70,10 @@ export class PermissionsClientService this.logger.info('InjectPermissions'); return lastValueFrom( - this.permissionsService.InjectPermissions({ permissions }), + this.permissionsClientService.InjectPermissions({ permissions }), ); } - getPermissions( + getPermissionsGrouped( permissionUsage?: PermissionUsages, language: LanguageEnum = LanguageEnum.ptbr, ): PermissionGroup[] { @@ -97,4 +96,22 @@ export class PermissionsClientService } return groups; } + getAllPermissions(language: LanguageEnum = LanguageEnum.ptbr) { + const permissions: PermissionsObjectPermissionTranslated[] = []; + for (const key in PERMISSIONS) { + const permissionGroup: PermissionsObjectGroup = PERMISSIONS[key]; + const permissionGroupPermissions: PermissionsObjectPermissionTranslated[] = + Object.values(permissionGroup.permissions).map((p) => ({ + ...p, + name: p.name[language], + })); + permissions.concat(permissionGroupPermissions); + } + return permissions; + } + getPermissionsBySeqId(seqIds: number[]) { + const permissionGroupPermissions = this.getAllPermissions(); + + return permissionGroupPermissions.filter((p) => seqIds.includes(p.seqid)); + } } diff --git a/src/modules/roles/dto/entities.ts b/src/modules/roles/dto/entities.ts index a0495f8..c0ecdd2 100644 --- a/src/modules/roles/dto/entities.ts +++ b/src/modules/roles/dto/entities.ts @@ -1,30 +1,39 @@ -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger'; import { Permission } from 'src/modules/permissions/dto/entities'; -import { UserWithoutRoles } from 'src/modules/users/dtos/entities'; +import { + Customer, + UserNoRolesAndCustomer, +} from 'src/modules/users/dtos/entities'; export class Role { @ApiProperty() id: string; @ApiProperty() name: string; + @ApiProperty() + description: string; @ApiPropertyOptional({ type: () => [Permission] }) permissions: Permission[]; - @ApiPropertyOptional({ type: () => [UserWithoutRoles] }) - users: UserWithoutRoles[]; + @ApiPropertyOptional({ type: () => [UserNoRolesAndCustomer] }) + users: UserNoRolesAndCustomer[]; @ApiProperty() createdAt: string; @ApiProperty() updatedAt: string; + @ApiProperty({ type: () => Customer }) + customer?: Customer; } +export class CustomerRole extends OmitType(Role, ['customer']) {} + export enum TrueOrFalseEnum { true = 'true', false = 'false', } export class GetRolesByCustomerReq { @ApiPropertyOptional() - permission_id: string[]; + permissionIds: string[]; @ApiPropertyOptional({ enum: TrueOrFalseEnum }) - get_users: TrueOrFalseEnum; + getUsers: TrueOrFalseEnum; } export class GetRolesByCustomerRes { @@ -35,7 +44,7 @@ export class CreateRoleReq { @ApiProperty() name: string; @ApiProperty() - permissionIds: string[]; + permissionIds: number[]; @ApiPropertyOptional() userIds: string[]; @ApiProperty() @@ -43,7 +52,7 @@ export class CreateRoleReq { } export class CreateRoleRes { @ApiProperty() - role: Role; + role: CustomerRole; } export class AssignPermissionsToRoleReq { diff --git a/src/modules/roles/roles.controller.ts b/src/modules/roles/roles.controller.ts index a8f615c..d249773 100644 --- a/src/modules/roles/roles.controller.ts +++ b/src/modules/roles/roles.controller.ts @@ -9,25 +9,28 @@ import { Post, Put, Query, + UseFilters, } from '@nestjs/common'; -import { ApiResponse, ApiTags } from '@nestjs/swagger'; -import { User } from 'src/authentication/user.decorator'; +import { ApiCreatedResponse, ApiOkResponse, ApiTags } from '@nestjs/swagger'; +import { RequestUser, User } from 'src/authentication/user.decorator'; import { DadosferaLogger } from 'dadosfera-logs'; import { RolesService } from './roles.service'; import { - AssignPermissionsToRoleReq, - AssignPermissionsToRoleRes, + AssignPermissionsToRoleReq as grantPermissionsToRoleReq, + AssignPermissionsToRoleRes as GrantPermissionsToRoleRes, CreateRoleReq, CreateRoleRes, GetRolesByCustomerReq, GetRolesByCustomerRes, - UnassignPermissionsToRoleReq, - UnassignPermissionsToRoleRes, + UnassignPermissionsToRoleReq as RevokePermissionsToRoleReq, + UnassignPermissionsToRoleRes as RevokePermissionsToRoleRes, UpdateRoleReq, UpdateRoleRes, } from './dto/entities'; +import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; @ApiTags('Roles') +@UseFilters(new GrpcToHttpExceptionFilter()) @Controller('roles') export class RolesController { logger: any; @@ -39,46 +42,57 @@ export class RolesController { ) { this.logger = dadosferaLogger.logger; } + @Get() - @ApiResponse({ type: GetRolesByCustomerRes }) + @ApiOkResponse({ type: GetRolesByCustomerRes }) async getRolesByCustomer( - @User() user, + @User() user: RequestUser, @Query() filters: GetRolesByCustomerReq, ) { this.logger.info('getRolesByCustomer', { user }); - this.rolesService.getRolesByCustomer(filters); + return await this.rolesService.getRolesByCustomer( + filters, + user.customer_id, + ); } + @Post() - @ApiResponse({ type: CreateRoleRes }) - async createRole(@User() user, @Body() body: CreateRoleReq) { + @ApiCreatedResponse({ type: CreateRoleRes }) + async createRole(@User() user: RequestUser, @Body() body: CreateRoleReq) { this.logger.info('createRole', { user }); + return await this.rolesService.createRole(body, user.customer_id); } + @Delete(':id') - async deleteRole(@User() user, @Param('id') id: string) { + async deleteRole(@User() user: RequestUser, @Param('id') id: string) { this.logger.info('deleteRole', { user }); return await this.rolesService.removeRole(id); } + @Put('permissions') - @ApiResponse({ type: AssignPermissionsToRoleRes }) - async assignPermissionsToRole( - @User() user, - @Body() body: AssignPermissionsToRoleReq, + @ApiOkResponse({ type: GrantPermissionsToRoleRes }) + async grantPermissionsToRole( + @User() user: RequestUser, + @Body() body: grantPermissionsToRoleReq, ) { - this.logger.info('assignPermissionsToRole', { user }); + this.logger.info('grantPermissionsToRole', { user }); + return await this.rolesService.grantPermissionsToRole(body); } @Delete('permissions') - @ApiResponse({ type: UnassignPermissionsToRoleRes }) - async unassignPermissionsToRole( - @User() user, - @Body() body: UnassignPermissionsToRoleReq, + @ApiOkResponse({ type: RevokePermissionsToRoleRes }) + async revokePermissionsToRole( + @User() user: RequestUser, + @Body() body: RevokePermissionsToRoleReq, ) { - this.logger.info('unassignPermissionsToRole', { user }); + this.logger.info('revokePermissionsToRole', { user }); + return await this.rolesService.revokePermissionToRole(body); } + @Patch(':id') - @ApiResponse({ type: UpdateRoleRes }) + @ApiOkResponse({ type: UpdateRoleRes }) async updateRole( - @User() user, + @User() user: RequestUser, @Param('id') id: string, @Body() body: UpdateRoleReq, ) { diff --git a/src/modules/roles/roles.module.ts b/src/modules/roles/roles.module.ts index 4e3bec6..5b3a3b9 100644 --- a/src/modules/roles/roles.module.ts +++ b/src/modules/roles/roles.module.ts @@ -4,6 +4,7 @@ import { DucClient } from 'src/clients/duc/client.config'; import { RolesController } from './roles.controller'; import { RolesService } from './roles.service'; import { DadosferaLogger } from 'dadosfera-logs'; +import { PermissionsModule } from '../permissions/permissions.module'; const ducClient = new DucClient(); @@ -15,6 +16,7 @@ const ducClient = new DucClient(); ...ducClient.config(), }, ]), + PermissionsModule, ], controllers: [RolesController], providers: [RolesService, DadosferaLogger], diff --git a/src/modules/roles/roles.service.ts b/src/modules/roles/roles.service.ts index 5b64d32..142021d 100644 --- a/src/modules/roles/roles.service.ts +++ b/src/modules/roles/roles.service.ts @@ -1,10 +1,16 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { ProtoServices } from 'protospack-v2/dist/lib/Duc'; import { RolesProtoService } from 'protospack-v2/dist/lib/Duc/interfaces/write-service'; -import { GetRolesByCustomerReq } from './dto/entities'; +import { CreateRoleReq, GetRolesByCustomerReq, Role } from './dto/entities'; import { DadosferaLogger } from 'dadosfera-logs'; import { ClientGrpc } from '@nestjs/microservices'; import { lastValueFrom } from 'rxjs'; +import { PermissionsService } from '../permissions/permissions.service'; +import { + GrantPermissionsToRoleRequest, + RevokePermissionsFromRoleRequest, + RoleUpdateRequest, +} from 'protospack-v2/dist/lib/Duc/interfaces/messages'; @Injectable() export class RolesService { @@ -15,22 +21,97 @@ export class RolesService { @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, @Inject('DUC_PACKAGE') private readonly grpcClient: ClientGrpc, + private permissionsService: PermissionsService, ) { this.logger = dadosferaLogger.logger; } onModuleInit() { this.rolesClientService = this.grpcClient.getService( - ProtoServices.UsersProtoService, + ProtoServices.RolesProtoService, ); } - async getRolesByCustomer(filters: GetRolesByCustomerReq) { - let { permission_id } = filters; - if (!Array.isArray(permission_id)) permission_id = [permission_id]; - const { get_users } = filters; - const is_get_users = get_users === 'true'; + async getRolesByCustomer(filters: GetRolesByCustomerReq, customerId: string) { + let { permissionIds } = filters; + if (permissionIds && !Array.isArray(permissionIds)) + permissionIds = [permissionIds]; + const { getUsers } = filters; + const isGetUsers = getUsers === 'true'; + const permissionSeqIds = + permissionIds?.map((id) => { + const seqId = Number(id); + if (isNaN(seqId)) + throw new BadRequestException(`permissionId ${id} not valid`); + return seqId; + }) || []; + const roles = await lastValueFrom( + this.rolesClientService.RoleFindAllByCustomerId({ + customerId, + getUsers: isGetUsers, + permissionIds: [], + permissionSeqIds, + }), + ); + const rolesTreated = this.getRolesPermissionsName(roles.roles); + return { roles: rolesTreated }; } + + async createRole(data: CreateRoleReq, customerId: string) { + const { description, name, permissionIds, userIds } = data; + const role = await lastValueFrom( + this.rolesClientService.RoleCreate({ + customerId, + name, + permissionIds: [], + permissionSeqIds: permissionIds, + description, + userIds, + }), + ); + const [roleTreated] = this.getRolesPermissionsName([role.role]); + return { role: roleTreated }; + } + async removeRole(id: string) { return lastValueFrom(this.rolesClientService.RoleRemove({ id })); } + async grantPermissionsToRole({ + roleId, + permissionIds, + }: GrantPermissionsToRoleRequest) { + const role = await lastValueFrom( + this.rolesClientService.GrantPermissionsToRole({ + permissionIds, + roleId, + }), + ); + } + + async revokePermissionToRole({ + roleId, + permissionIds, + }: RevokePermissionsFromRoleRequest) { + const role = await lastValueFrom( + this.rolesClientService.RevokePermissionsFromRole({ + permissionIds, + roleId, + }), + ); + } + + async updateRole(req: RoleUpdateRequest) { + const role = await lastValueFrom(this.rolesClientService.RoleUpdate(req)); + } + getRolesPermissionsName(roles: Role[]) { + for (const role of roles) { + const permisisonSeqIds = role.permissions.map((p) => p.seqid); + const permissions = + this.permissionsService.getPermissionsBySeqId(permisisonSeqIds); + role.permissions.forEach((p) => { + const permission = permissions.find((per) => per.seqid === p.seqid); + p.name = permission.name; + }); + } + return roles; + } } diff --git a/src/modules/users/dtos/entities.ts b/src/modules/users/dtos/entities.ts index 1d9f010..3664d05 100644 --- a/src/modules/users/dtos/entities.ts +++ b/src/modules/users/dtos/entities.ts @@ -1,4 +1,4 @@ -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger'; import { Role } from 'src/modules/roles/dto/entities'; export class Customer { @ApiProperty() @@ -26,35 +26,13 @@ export class User { @ApiProperty({ type: [Role] }) roles: Role[]; @ApiProperty() - jobTitle: string; + jobTitle?: string; @ApiProperty() - department: string; + department?: string; @ApiProperty() - hierarchy: string; - @ApiProperty() - customer: Customer; - @ApiProperty() - mfaStatus: string; - @ApiProperty() - createdAt: string; - @ApiProperty() - updatedAt: string; -} -export class UserWithoutRoles { - @ApiProperty() - id: string; - @ApiProperty() - name: string; - @ApiProperty() - email: string; - @ApiProperty() - jobTitle: string; - @ApiProperty() - department: string; - @ApiProperty() - hierarchy: string; - @ApiProperty() - customer: Customer; + hierarchy?: string; + @ApiPropertyOptional() + customer?: Customer; @ApiProperty() mfaStatus: string; @ApiProperty() @@ -62,6 +40,10 @@ export class UserWithoutRoles { @ApiProperty() updatedAt: string; } +export class UserNoRoles extends OmitType(User, ['roles']) {} +export class UserNoRolesAndCustomer extends OmitType(UserNoRoles, [ + 'customer', +]) {} export class UserByCustomer { @ApiProperty({ type: [Role] }) roles: Role[]; @@ -80,17 +62,17 @@ export class UserByCustomer { } export class CreateUserReq { @ApiPropertyOptional() - name: string; + name?: string; @ApiProperty() email: string; @ApiPropertyOptional() - roles: string[]; + roles?: string[]; @ApiPropertyOptional() - jobTitle: string; + jobTitle?: string; @ApiPropertyOptional() - department: string; + department?: string; @ApiPropertyOptional() - hierarchy: string; + hierarchy?: string; } export class CreateUserRes { @ApiProperty() @@ -107,7 +89,7 @@ export class BatchCreateUserRes { export class GetAllUsersByCustomerIdReq { @ApiPropertyOptional() - s: string; + s?: string; } export class GetAllUsersByCustomerIdRes { @ApiProperty({ type: [UserByCustomer] }) diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index 6fde82e..7d7b3ed 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -23,6 +23,7 @@ import { } from './dtos/entities'; import { UsersService } from './users.service'; +// TODO GET de hierarquias e do PATCH em usuário @ApiTags('Users') @Controller('users') export class UsersController { @@ -54,42 +55,41 @@ export class UsersController { @Post() @ApiOkResponse({ type: CreateUserRes }) - async createUser(@User() user, @Body() body: CreateUserReq) { + async createUser(@User() user: RequestUser, @Body() body: CreateUserReq) { this.logger.info('createUser', { user }); } @Post('batch') @ApiOkResponse({ type: CreateUserRes }) - async batchCreateUser(@User() user, @Body() body: CreateUserReq) { + async batchCreateUser( + @User() user: RequestUser, + @Body() body: CreateUserReq, + ) { this.logger.info('batchCreateUser', { user }); } @Delete(':id') @ApiOkResponse({ type: DeleteUserRes }) - async deleteUser(@User() user, @Param('id') id: string) { + async deleteUser(@User() user: RequestUser, @Param('id') id: string) { this.logger.info('deleteUser', { user }); return await this.userService.deleteUser({ id }); } @Put('role') - async assignRoleToUser(@User() user, @Body() body: AssignRoleToUserReq) { + async assignRoleToUser( + @User() user: RequestUser, + @Body() body: AssignRoleToUserReq, + ) { this.logger.info('assignRoleToUser', { user }); return await this.userService.assignRoleToUser(body); } @Delete('role') - async unassignRoleToUser(@User() user, @Body() body: UnassignRoleToUserReq) { + async unassignRoleToUser( + @User() user: RequestUser, + @Body() body: UnassignRoleToUserReq, + ) { this.logger.info('unassignRoleToUser', { user }); return await this.userService.unassignRoleToUser(body); } - - // @Get('search') - // @ApiOkResponse({ type: SearchUserRes }) - // async searchUser( - // @User() user: RequestUser, - // @Query('s') searchQuery: SearchUserReq, - // ) { - // this.logger.info('searchUser', { user }); - // console.log(searchQuery); - // } } diff --git a/src/utils/ErrorBuilder.ts b/src/utils/ErrorBuilder.ts index 2f2cfd9..b00e8f1 100644 --- a/src/utils/ErrorBuilder.ts +++ b/src/utils/ErrorBuilder.ts @@ -112,6 +112,13 @@ export function EnrichErrorCode(code: string) { code, }; + case ErrorCodes.ROLE.ALREADY_EXIST: + return { + statusCode: HttpStatus.BAD_REQUEST, + error: 'Grupo já existe', + message: 'Não é possível criar um grupo com esse nome', + code, + }; case ErrorCodes.INTERNAL: case ErrorCodes.UNKNOWN: default: @@ -121,6 +128,7 @@ export function EnrichErrorCode(code: string) { message: 'Erro desconhecido. Tente novamente ou entre em contato com o suporte', code: ErrorCodes.UNKNOWN, + details: code, }; } } @@ -138,8 +146,14 @@ export default class ErrorBuilder extends HttpException { logger.log(code); } - const { statusCode, message, error, code: rCode } = EnrichErrorCode(code); - super({ statusCode, message, error, code: rCode }, statusCode); + const { + statusCode, + message, + error, + code: rCode, + details, + } = EnrichErrorCode(code); + super({ statusCode, message, error, code: rCode, details }, statusCode); this.code = code; } } diff --git a/src/utils/errorCodes.ts b/src/utils/errorCodes.ts index 5d345df..74a60ec 100644 --- a/src/utils/errorCodes.ts +++ b/src/utils/errorCodes.ts @@ -13,12 +13,15 @@ export const AUTH = { RESET_PASSWORD_CODE_INVALID: 'AUTH.RESET_PASSWORD_CODE_INVALID', WEAK_NEW_PASSWORD: 'AUTH.WEAK_NEW_PASSWORD', }; - +export const ROLE = { + ALREADY_EXIST: 'ROLE.ALREADY_EXISTS', +}; const ErrorCodes = { UNKNOWN: 'UNKNOWN', RATE_LIMIT: 'RATE_LIMIT', INTERNAL: 'INTERNAL', AUTH, + ROLE, }; export default ErrorCodes;