import { Body, Controller, Delete, Get, Headers, HttpCode, HttpStatus, Inject, Param, Patch, Post, Put, Req, UseFilters, } from '@nestjs/common'; 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, BatchCreateUserRes, CreateUserReq, CreateUserRes, DeleteUserRes, GetAllDepartmentsRes, GetAllHierarchiesRes, GetAllJobTitlesRes, GetAllUsersByCustomerIdRes, SetUserRolesReq, SetUserRolesRes, UnassignRoleToUserReq, UpdateUserReq, UpdateUserRes, UserByCustomer, } from './dtos/entities'; 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; constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, private userService: UsersService, ) { this.logger = dadosferaLogger.logger; } @Get() @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiOkResponse({ type: GetAllUsersByCustomerIdRes, description: 'List of users of a customer', }) async getAllUsersByCustomerId( @User() user: RequestUser, @Headers('dadosfera-lang') language, ): Promise { 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, @Headers('dadosfera-lang') language, ): Promise { this.logger.info('getAllHierarchies', { user }); this.userService.setLanguage(language); return await this.userService.getAllHierarchies(); } @Get('departments') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiOkResponse({ type: GetAllDepartmentsRes }) async getAllDepartments( @User() user: RequestUser, @Headers('dadosfera-lang') language, ): Promise { this.logger.info('getAllHierarchies', { user }); this.userService.setLanguage(language); return await this.userService.getAllDepartments(user.customer_id); } @Get('jobTitles') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiOkResponse({ type: GetAllDepartmentsRes }) async getAllJobTitles( @User() user: RequestUser, @Headers('dadosfera-lang') language, ): Promise { this.logger.info('getAllHierarchies', { user }); this.userService.setLanguage(language); return await this.userService.getAllJobTitles(user.customer_id); } @Get(':id') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiOkResponse({ type: UserByCustomer, }) 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, @Headers('dadosfera-lang') language, ) { this.logger.info('createUser', { user }); this.userService.setLanguage(language); return await this.userService.createUser(body); } @Post('batch') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiCreatedResponse({ type: BatchCreateUserRes }) 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); } @Post(':id') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @HttpCode(HttpStatus.OK) async resendInvite( @User() user: RequestUser, @Param('id') id: string, @Headers('dadosfera-lang') language, ) { this.logger.info('resendInvite', { user }); this.userService.setLanguage(language); return this.userService.resendInvite({ id }); } @Delete(':id') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiOkResponse({ type: DeleteUserRes }) 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, @Headers('dadosfera-lang') language, ) { this.logger.info('createUser', { user }); this.userService.setLanguage(language); return await this.userService.setRoles(body, user.customer_id); } @Put('role') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) 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); } @Delete('role') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) 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); } @Patch(':id') @RequireAllPermissions(PERMISSIONS.USERS.permissions.ADMIN) @ApiOkResponse({ type: UpdateUserRes }) async updateUser( @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); } }