FIX: changing hierarchy strategy

This commit is contained in:
Gabriel Rosa
2022-07-20 15:17:58 -03:00
parent c61c37b268
commit 3e7581e20c
12 changed files with 205 additions and 71 deletions
+4 -3
View File
@@ -1,8 +1,9 @@
import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';
import { UserRole } from 'src/modules/roles/dto/entities';
export class Hierarchy {
@ApiProperty()
id: number;
id: string;
@ApiProperty()
name: string;
}
@@ -68,7 +69,7 @@ export class CreateUserReq {
@ApiPropertyOptional()
department?: string;
@ApiPropertyOptional()
hierarchy?: number;
hierarchy?: string;
}
export class CreateUserRes {
@ApiProperty()
@@ -93,7 +94,7 @@ export class UpdateUserReq {
@ApiPropertyOptional()
department?: string;
@ApiPropertyOptional()
hierarchy?: number;
hierarchy?: string;
@ApiPropertyOptional()
roleNames?: string[];
}
+79
View File
@@ -0,0 +1,79 @@
import { LanguageEnum } from 'src/utils/languages.enum';
interface InternalHierarchyType {
name: Record<LanguageEnum, string>;
}
export const HIERARCHIES: Record<string, InternalHierarchyType> = {
presidence: {
name: {
'pt-br': 'Presidência',
'en-us': 'Presidence',
},
},
directory: {
name: {
'pt-br': 'Diretoria',
'en-us': 'Directory',
},
},
management: {
name: {
'pt-br': 'Gerência',
'en-us': 'Management',
},
},
specialist: {
name: {
'pt-br': 'Especialista',
'en-us': 'Specialist',
},
},
supervisor: {
name: {
'pt-br': 'Coordenador ou Supervisor',
'en-us': 'Supervisor',
},
},
trainee: {
name: {
'pt-br': 'Trainee',
'en-us': 'Trainee',
},
},
'senior-analyst': {
name: {
'pt-br': 'Analista Sênior',
'en-us': 'Senior Analyst',
},
},
'midlevel-analyst': {
name: {
'pt-br': 'Analista Pleno',
'en-us': 'Mid-level Analyst',
},
},
'junior-analyst': {
name: {
'pt-br': 'Analista Júnior',
'en-us': 'Junior Analyst',
},
},
intern: {
name: {
'pt-br': 'Estagiário',
'en-us': 'Intern',
},
},
'youth-apprentice': {
name: {
'pt-br': 'Jovem aprendiz',
'en-us': 'Youth Apprentice',
},
},
other: {
name: {
'pt-br': 'Outro',
'en-us': 'Other',
},
},
};
+56 -7
View File
@@ -3,6 +3,7 @@ import {
Controller,
Delete,
Get,
Headers,
Inject,
Param,
Patch,
@@ -11,12 +12,18 @@ import {
Req,
UseFilters,
} from '@nestjs/common';
import { ApiCreatedResponse, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import {
ApiCreatedResponse,
ApiHeader,
ApiOkResponse,
ApiTags,
} from '@nestjs/swagger';
import { DadosferaLogger } from 'dadosfera-logs';
import { RequireAllPermissions } from 'src/authentication/authentication.decorator';
import { PERMISSIONS } from 'src/authentication/permissions.enum';
import { RequestUser, User } from 'src/authentication/user.decorator';
import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter';
import { LanguageEnum } from 'src/utils/languages.enum';
import {
AssignRoleToUserReq,
BatchCreateUserReq,
@@ -38,6 +45,12 @@ import { UsersService } from './users.service';
// TODO GET de hierarquias e do PATCH em usuário
@ApiTags('Users')
@Controller('users')
@ApiHeader({
name: 'dadosfera-lang',
enum: LanguageEnum,
required: false,
description: 'Defaults to pt-br',
})
@UseFilters(GrpcToHttpExceptionFilter)
export class UsersController {
logger: any;
@@ -56,16 +69,24 @@ export class UsersController {
type: GetAllUsersByCustomerIdRes,
description: 'List of users of a customer',
})
async getAllUsersByCustomerId(@User() user: RequestUser) {
async getAllUsersByCustomerId(
@User() user: RequestUser,
@Headers('dadosfera-lang') language,
) {
this.logger.info('getAllUsersByCustomerId', { user });
this.userService.setLanguage(language);
return await this.userService.findAllUsersByCustomerId(user.customer_id);
}
@Get('hierarchies')
@RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN)
@ApiOkResponse({ type: GetAllHierarchiesRes })
async getAllHierarchies(@User() user: RequestUser) {
async getAllHierarchies(
@User() user: RequestUser,
@Headers('dadosfera-lang') language,
) {
this.logger.info('getAllHierarchies', { user });
this.userService.setLanguage(language);
return await this.userService.getAllHierarchies();
}
@@ -74,16 +95,26 @@ export class UsersController {
@ApiOkResponse({
type: UserByCustomer,
})
async findOneById(@User() user: RequestUser, @Param('id') id: string) {
async findOneById(
@User() user: RequestUser,
@Param('id') id: string,
@Headers('dadosfera-lang') language,
) {
this.logger.info('findOneById', { user });
this.userService.setLanguage(language);
return await this.userService.findOneById(id);
}
@Post()
@RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN)
@ApiCreatedResponse({ type: CreateUserRes })
async createUser(@User() user: RequestUser, @Body() body: CreateUserReq) {
async createUser(
@User() user: RequestUser,
@Body() body: CreateUserReq,
@Headers('dadosfera-lang') language,
) {
this.logger.info('createUser', { user });
this.userService.setLanguage(language);
return await this.userService.createUser(body);
}
@@ -93,24 +124,36 @@ export class UsersController {
async batchCreateUser(
@User() user: RequestUser,
@Body() body: BatchCreateUserReq,
@Headers('dadosfera-lang') language,
) {
this.logger.info('batchCreateUser', { user });
this.userService.setLanguage(language);
return await this.userService.batchCreateUser(body);
}
@Delete(':id')
@RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN)
@ApiOkResponse({ type: DeleteUserRes })
async deleteUser(@User() user: RequestUser, @Param('id') id: string) {
async deleteUser(
@User() user: RequestUser,
@Param('id') id: string,
@Headers('dadosfera-lang') language,
) {
this.logger.info('deleteUser', { user });
this.userService.setLanguage(language);
return await this.userService.deleteUser({ id });
}
@Patch('roles')
@RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN)
@ApiOkResponse({ type: SetUserRolesRes })
async setUserRoles(@User() user: RequestUser, @Body() body: SetUserRolesReq) {
async setUserRoles(
@User() user: RequestUser,
@Body() body: SetUserRolesReq,
@Headers('dadosfera-lang') language,
) {
this.logger.info('createUser', { user });
this.userService.setLanguage(language);
return await this.userService.setRoles(body, user.customer_id);
}
@@ -119,8 +162,10 @@ export class UsersController {
async assignRoleToUser(
@User() user: RequestUser,
@Body() body: AssignRoleToUserReq,
@Headers('dadosfera-lang') language,
) {
this.logger.info('assignRoleToUser', { user });
this.userService.setLanguage(language);
return await this.userService.assignRoleToUser(body);
}
@@ -129,8 +174,10 @@ export class UsersController {
async unassignRoleToUser(
@User() user: RequestUser,
@Req() request: UnassignRoleToUserReq,
@Headers('dadosfera-lang') language,
) {
this.logger.info('unassignRoleToUser', { user });
this.userService.setLanguage(language);
return await this.userService.unassignRoleToUser(request);
}
@@ -141,8 +188,10 @@ export class UsersController {
@User() user: RequestUser,
@Body() body: UpdateUserReq,
@Param('id') id: string,
@Headers('dadosfera-lang') language,
) {
this.logger.info('updateUser', { user });
this.userService.setLanguage(language);
return await this.userService.updateUser(body, id, user.customer_id);
}
}
+45 -41
View File
@@ -14,14 +14,20 @@ import { lastValueFrom } from 'rxjs';
import {
BatchCreateUserReq,
CreateUserReq,
Hierarchy,
SetUserRolesReq,
UpdateUserReq,
User,
} from './dtos/entities';
import { RolesService } from '../roles/roles.service';
import { HIERARCHIES } from './hierarchies';
import { LanguageEnum } from 'src/utils/languages.enum';
import { UserByCustomer } from 'protospack-v2/dist/lib/Duc/interfaces/entities';
@Injectable()
export class UsersService implements OnModuleInit {
logger: any;
language: LanguageEnum = LanguageEnum.ptbr;
private usersClientService: UsersProtoService;
constructor(
@@ -39,14 +45,16 @@ export class UsersService implements OnModuleInit {
);
}
setLanguage(l: LanguageEnum = LanguageEnum.ptbr) {
if (Object.values(LanguageEnum).includes(l)) this.language = l;
this.rolesService.setLanguage(l);
}
async findAllUsersByCustomerId(customerId: string) {
const { users } = await lastValueFrom(
this.usersClientService.UserFindAllByCustomerId({ customerId }),
);
users?.forEach((u) => {
const roles: any[] = this.rolesService.getRolesPermissionsName(u.roles);
u.roles = roles;
});
this.adjustUsersPayload(users);
return { users };
}
@@ -54,12 +62,7 @@ export class UsersService implements OnModuleInit {
const { user } = await lastValueFrom(
this.usersClientService.UserFindOneById({ id }),
);
if (user) {
const roles: any[] = this.rolesService.getRolesPermissionsName(
user.roles,
);
user.roles = roles;
}
this.adjustUsersPayload([user]);
return { user };
}
@@ -76,12 +79,7 @@ export class UsersService implements OnModuleInit {
roleNames,
}),
);
if (user) {
const roles: any[] = this.rolesService.getRolesPermissionsName(
user.roles,
);
user.roles = roles;
}
this.adjustUsersPayload([user]);
return { user };
}
@@ -100,12 +98,7 @@ export class UsersService implements OnModuleInit {
jobTitle,
}),
);
if (user) {
const roles: any[] = this.rolesService.getRolesPermissionsName(
user.roles,
);
user.roles = roles;
}
this.adjustUsersPayload([user]);
return { user };
}
@@ -121,31 +114,27 @@ export class UsersService implements OnModuleInit {
customerId,
}),
);
if (user) {
const roles: any[] = this.rolesService.getRolesPermissionsName(
user.roles,
);
user.roles = roles;
}
this.adjustUsersPayload([user]);
return { user };
}
async batchCreateUser({ users }: BatchCreateUserReq) {
const usersToCreate: UserCreateRequest[] = users.map((u) => ({
...u,
roleIds: [],
roleNames: u.roleNames,
name: u.name || '',
hierarchy: u.hierarchy || null,
}));
const usersToCreate: UserCreateRequest[] = users.map(
({ roleNames, email, department, hierarchy, jobTitle, name }) => ({
roleNames,
email,
department,
hierarchy,
jobTitle,
name,
roleIds: [],
}),
);
const { errorUsers, usersCreated } = await lastValueFrom(
this.usersClientService.UserBatchCreate({
users: usersToCreate,
}),
);
usersCreated?.forEach((u) => {
const roles: any[] = this.rolesService.getRolesPermissionsName(u.roles);
u.roles = roles;
});
this.adjustUsersPayload(usersCreated);
return { errorUsers, usersCreated };
}
async assignRoleToUser(body: AssignRoleToUserRequest) {
@@ -159,7 +148,22 @@ export class UsersService implements OnModuleInit {
async deleteUser(id: IdRequest) {
return lastValueFrom(this.usersClientService.UserRemove(id));
}
async getAllHierarchies() {
return lastValueFrom(this.usersClientService.UserFindAllHierarchies({}));
getAllHierarchies(): Hierarchy[] {
return Object.keys(HIERARCHIES).map((key) => ({
id: key,
name: HIERARCHIES[key]?.name[this.language] || key,
}));
}
adjustUsersPayload(users: UserByCustomer[]) {
users?.forEach((u) => {
if (!u) return;
const roles: any[] = this.rolesService.getRolesPermissionsName(u.roles);
u.roles = roles;
u.hierarchy =
HIERARCHIES[u.hierarchy]?.name[this.language] || u.hierarchy;
});
return users;
}
}