import { Body, Controller, Delete, Get, Headers, Inject, Param, Patch, Post, Put, Query, UseFilters, } from '@nestjs/common'; import { ApiCreatedResponse, ApiHeader, ApiOkResponse, ApiTags, } from '@nestjs/swagger'; import { RequestUser, User } from 'src/authentication/user.decorator'; import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { RolesService } from './roles.service'; import { GrantPermissionsToRoleReq, GrantPermissionsToRoleRes, CreateRoleReq, CreateRoleRes, GetRolesByCustomerReq, GetRolesByCustomerRes, RevokePermissionsFromRoleReq, RevokePermissionsFromRoleRes, UpdateRoleReq, UpdateRoleRes, RoleDto, SetRolePermissionsReq, SetRolePermissionsRes, SetRoleUsersRes, SetRoleUsersReq, } from './dto/entities'; import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; import { PERMISSIONS_GROUPS } from 'src/authentication/permissions.enum'; import { Authenticated, RequireAllPermissions, } from 'src/authentication/authentication.decorator'; import { LanguageEnum } from 'src/utils/languages.enum'; @ApiTags('Roles') @ApiHeader({ name: 'dadosfera-lang', enum: LanguageEnum, required: false, description: 'Defaults to pt-br', }) @Authenticated() @UseFilters(new GrpcToHttpExceptionFilter()) @Controller('roles') export class RolesController { logger: DadosferaLogger; constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, private rolesService: RolesService, ) { this.logger = dadosferaLogger.logger; } @Get() @ApiOkResponse({ type: GetRolesByCustomerRes }) async searchRoles( @User() user: RequestUser, @Query() filters: GetRolesByCustomerReq, @Headers('dadosfera-lang') language, ) { this.logger.info('searchRoles', { user }); this.rolesService.setLanguage(language); return await this.rolesService.roleSearch(filters, user); } @Post() @ApiCreatedResponse({ type: CreateRoleRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async createRole( @User() user: RequestUser, @Body() body: CreateRoleReq, @Headers('dadosfera-lang') language, ) { this.logger.info('createRole', { user }); this.rolesService.setLanguage(language); return await this.rolesService.createRole(body, user); } @Put('permissions') @ApiOkResponse({ type: GrantPermissionsToRoleRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async grantPermissionsToRole( @User() user: RequestUser, @Body() body: GrantPermissionsToRoleReq, @Headers('dadosfera-lang') language, ) { this.logger.info('grantPermissionsToRole', { user }); this.rolesService.setLanguage(language); return await this.rolesService.grantPermissionsToRole(body, user); } @Delete('permissions') @ApiOkResponse({ type: RevokePermissionsFromRoleRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async revokePermissionsFromRole( @User() user: RequestUser, @Body() body: RevokePermissionsFromRoleReq, @Headers('dadosfera-lang') language, ) { this.logger.info('revokePermissionsToRole', { user }); this.rolesService.setLanguage(language); return await this.rolesService.revokePermissionFromRole(body, user); } @Patch('permissions') @ApiOkResponse({ type: SetRolePermissionsRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async setRolePermissions( @User() user: RequestUser, @Body() body: SetRolePermissionsReq, @Headers('dadosfera-lang') language, ) { this.logger.info('setRolePermissions', { user }); this.rolesService.setLanguage(language); return this.rolesService.setRolePermissions(body, user); } @Patch('users') @ApiOkResponse({ type: SetRoleUsersRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async setRoleUsers( @User() user: RequestUser, @Body() body: SetRoleUsersReq, @Headers('dadosfera-lang') language, ) { this.logger.info('setRoleUsers', { user }); this.rolesService.setLanguage(language); return this.rolesService.setRoleUsers(body, user); } @Get(':id') @ApiOkResponse({ type: RoleDto }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async getRoleById( @User() user: RequestUser, @Param('id') id: string, @Headers('dadosfera-lang') language, ) { this.logger.info('getRoleById', { user }); this.rolesService.setLanguage(language); return await this.rolesService.getRolesById(id, user); } @Delete(':id') @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async deleteRole( @User() user: RequestUser, @Param('id') id: string, @Headers('dadosfera-lang') language, ) { this.logger.info('deleteRole', { user }); this.rolesService.setLanguage(language); return await this.rolesService.removeRole(id, user); } @Patch(':id') @ApiOkResponse({ type: UpdateRoleRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async updateRole( @User() user: RequestUser, @Param('id') id: string, @Body() body: UpdateRoleReq, @Headers('dadosfera-lang') language, ) { this.logger.info('updateRole', { user }); this.rolesService.setLanguage(language); return this.rolesService.updateRole(id, body, user); } }