using Asp.Versioning; using Core.Cerberos.Adapters.Attributes; using Core.Cerberos.Adapters.Common.Constants; using Core.Cerberos.Application.UseCases.Roles.Input; using Core.Cerberos.Application.UseCases.Roles.Ports; using Lib.Architecture.BuildingBlocks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Core.Cerberos.Service.API.Controllers { /// /// Handles all requests for role authentication. /// [ApiVersion("1.0")] [Route("api/v{api-version:apiVersion}/[controller]")] [Produces("application/json")] [ApiController] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] public class RoleController : ControllerBase { private readonly IComponentHandler getRoleHandler; private readonly IComponentHandler getAllRolesHandler; private readonly IComponentHandler createRoleHandler; private readonly IComponentHandler updateRoleHandler; private readonly IComponentHandler changeStatusRoleHandler; private readonly IComponentHandler addApplicationToRoleHandler; private readonly IComponentHandler removeApplicationToRoleHandler; private readonly IRolePort port; /// /// Handles all requests for role authentication. /// public RoleController( IComponentHandler getRoleHandler, IComponentHandler getAllRolesHandler, IComponentHandler createRoleHandler, IComponentHandler updateRoleHandler, IComponentHandler changeRoleStatusHandler, IComponentHandler addApplicationToRoleHandler, IComponentHandler removeApplicationToRoleHandler, IRolePort port ) { this.createRoleHandler = createRoleHandler; this.updateRoleHandler = updateRoleHandler; this.changeStatusRoleHandler = changeRoleStatusHandler; this.getAllRolesHandler = getAllRolesHandler; this.getRoleHandler = getRoleHandler; this.addApplicationToRoleHandler = addApplicationToRoleHandler; this.removeApplicationToRoleHandler = removeApplicationToRoleHandler; this.port = port; } /// /// Gets all the roles. /// [HttpGet("GetAll")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Read")] public async Task GetAllRolesAsync(CancellationToken cancellationToken) { await getAllRolesHandler.ExecuteAsync(new GetAllRolesRequest { }, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Gets the role by identifier. /// [HttpPost] [Route("GetById")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Read")] public async Task GetRoleById([FromBody] GetRoleRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request.Id)) { return BadRequest("Invalid role identifier"); } await getRoleHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Creates a new role. /// [HttpPost("Create")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Write")] public async Task CreateRoleAsync([FromBody] CreateRoleRequest newRole, CancellationToken cancellationToken = default) { await createRoleHandler.ExecuteAsync(newRole, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Updates a full role by identifier. /// [HttpPut("Update")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Write")] public async Task UpdateRoleAsync([FromBody] UpdateRoleRequest entity, CancellationToken cancellationToken = default) { await updateRoleHandler.ExecuteAsync(entity, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Changes the status of the role. /// [HttpPatch] [Route("ChangeStatus")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Write")] public async Task ChageRoleStatusAsync(ChangeRoleStatusRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request.Id)) { return BadRequest("Invalid role identifier"); } await changeStatusRoleHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Adds an application to the role's list of applications. /// [HttpPost] [Route("AddApplication")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Write")] public async Task AddApplicationToRoleAsync(AddApplicationToRoleRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request.RoleId)) { return BadRequest("Invalid role identifier"); } await addApplicationToRoleHandler.ExecuteAsync(request, cancellationToken); return port.ViewModel; } /// /// Removes an application from the role's list of applications. /// [HttpDelete] [Route("RemoveApplication")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [Authorize(AuthenticationSchemes = Schemes.HeathScheme)] [Permission("RoleManagement.Write")] public async Task RemoveApplicationToRoleAsync(RemoveApplicationFromRoleRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request.RoleId)) { return BadRequest("Invalid role identifier"); } await removeApplicationToRoleHandler.ExecuteAsync(request, cancellationToken); return port.ViewModel; } } }