209 lines
10 KiB
C#
209 lines
10 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// Handles all requests for role authentication.
|
|
/// </summary>
|
|
[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<GetRoleRequest> getRoleHandler;
|
|
private readonly IComponentHandler<GetAllRolesRequest> getAllRolesHandler;
|
|
private readonly IComponentHandler<CreateRoleRequest> createRoleHandler;
|
|
private readonly IComponentHandler<UpdateRoleRequest> updateRoleHandler;
|
|
private readonly IComponentHandler<ChangeRoleStatusRequest> changeStatusRoleHandler;
|
|
private readonly IComponentHandler<AddApplicationToRoleRequest> addApplicationToRoleHandler;
|
|
private readonly IComponentHandler<RemoveApplicationFromRoleRequest> removeApplicationToRoleHandler;
|
|
private readonly IRolePort port;
|
|
|
|
/// <summary>
|
|
/// Handles all requests for role authentication.
|
|
/// </summary>
|
|
public RoleController(
|
|
IComponentHandler<GetRoleRequest> getRoleHandler,
|
|
IComponentHandler<GetAllRolesRequest> getAllRolesHandler,
|
|
IComponentHandler<CreateRoleRequest> createRoleHandler,
|
|
IComponentHandler<UpdateRoleRequest> updateRoleHandler,
|
|
IComponentHandler<ChangeRoleStatusRequest> changeRoleStatusHandler,
|
|
IComponentHandler<AddApplicationToRoleRequest> addApplicationToRoleHandler,
|
|
IComponentHandler<RemoveApplicationFromRoleRequest> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets all the roles.
|
|
/// </summary>
|
|
[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<IActionResult> GetAllRolesAsync(CancellationToken cancellationToken)
|
|
{
|
|
await getAllRolesHandler.ExecuteAsync(new GetAllRolesRequest { }, cancellationToken).ConfigureAwait(false);
|
|
|
|
return port.ViewModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the role by identifier.
|
|
/// </summary>
|
|
[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<IActionResult> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new role.
|
|
/// </summary>
|
|
[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<IActionResult> CreateRoleAsync([FromBody] CreateRoleRequest newRole, CancellationToken cancellationToken = default)
|
|
{
|
|
await createRoleHandler.ExecuteAsync(newRole, cancellationToken).ConfigureAwait(false);
|
|
|
|
return port.ViewModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates a full role by identifier.
|
|
/// </summary>
|
|
[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<IActionResult> UpdateRoleAsync([FromBody] UpdateRoleRequest entity, CancellationToken cancellationToken = default)
|
|
{
|
|
await updateRoleHandler.ExecuteAsync(entity, cancellationToken).ConfigureAwait(false);
|
|
|
|
return port.ViewModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Changes the status of the role.
|
|
/// </summary>
|
|
[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<IActionResult> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds an application to the role's list of applications.
|
|
/// </summary>
|
|
[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<IActionResult> AddApplicationToRoleAsync(AddApplicationToRoleRequest request, CancellationToken cancellationToken)
|
|
{
|
|
if (string.IsNullOrEmpty(request.RoleId)) { return BadRequest("Invalid role identifier"); }
|
|
|
|
await addApplicationToRoleHandler.ExecuteAsync(request, cancellationToken);
|
|
|
|
return port.ViewModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Removes an application from the role's list of applications.
|
|
/// </summary>
|
|
[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<IActionResult> RemoveApplicationToRoleAsync(RemoveApplicationFromRoleRequest request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
if (string.IsNullOrEmpty(request.RoleId)) { return BadRequest("Invalid role identifier"); }
|
|
|
|
await removeApplicationToRoleHandler.ExecuteAsync(request, cancellationToken);
|
|
|
|
return port.ViewModel;
|
|
}
|
|
}
|
|
}
|