import { Body, Controller, Delete, Get, Inject, Param, Patch, Post, Put, Query, UseFilters, } from '@nestjs/common'; import { ApiCreatedResponse, ApiHeaders, ApiOkResponse, ApiTags, } from '@nestjs/swagger'; import { RequestUser, User } from 'src/decorators/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/decorators/authentication.decorator'; import { LanguageEnum } from 'src/utils/languages.enum'; import { Language } from 'src/decorators/language.decorator'; import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator'; @ApiInternalOnlyController() @ApiTags('Roles') @ApiHeaders([{ name: 'dadosfera-lang', enum: LanguageEnum, required: false }]) @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() params: GetRolesByCustomerReq, @Language() language: LanguageEnum, ) { this.logger.info('searchRoles', { user }); this.rolesService.setLanguage(language); return await this.rolesService.roleSearch(params, user); } @Post() @ApiCreatedResponse({ type: CreateRoleRes }) @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) async createRole( @User() user: RequestUser, @Body() body: CreateRoleReq, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { 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, @Language() language: LanguageEnum, ) { this.logger.info('updateRole', { user }); this.rolesService.setLanguage(language); return this.rolesService.updateRole(id, body, user); } }