using Asp.Versioning;
using Core.Blueprint.Application.UsesCases.KeyVault.Input;
using Core.Blueprint.Application.UsesCases.KeyVault.Ports;
using Lib.Architecture.BuildingBlocks;
using Microsoft.AspNetCore.Mvc;
namespace Core.Cerberos.Service.API.Controllers
{
///
/// Handles all services and business rules related to .
///
[ApiVersion("1.0")]
[Route("api/v{api-version:apiVersion}/[controller]")]
[Produces("application/json")]
[ApiController]
public class KeyVaultController : ControllerBase
{
private readonly IComponentHandler createSecretHandler;
private readonly IComponentHandler getSecretHandler;
private readonly IComponentHandler updateSecretHandler;
private readonly IComponentHandler deleteSecretHandler;
private readonly IKeyVaultPort port;
///
/// Handles all services and business rules related to .
///
public KeyVaultController(
IComponentHandler getSecretHandler,
IComponentHandler createSecretHandler,
IComponentHandler updateSecretHandler,
IComponentHandler deleteSecretHandler,
IKeyVaultPort port
)
{
this.createSecretHandler = createSecretHandler;
this.updateSecretHandler = updateSecretHandler;
this.deleteSecretHandler = deleteSecretHandler;
this.getSecretHandler = getSecretHandler;
this.port = port;
}
///
/// Creates a new secret.
///
[HttpPost("CreateSecret")]
[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)]
public async Task CreateSecretAsync([FromBody] CreateSecretRequest newSecret, CancellationToken cancellationToken = default)
{
await createSecretHandler.ExecuteAsync(newSecret, cancellationToken).ConfigureAwait(false);
return port.ViewModel;
}
///
/// Gets the secret by name.
///
[HttpPost]
[Route("GetSecretByName")]
[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)]
public async Task GetSecretByName([FromBody] GetSecretRequest request, CancellationToken cancellationToken)
{
if (string.IsNullOrEmpty(request.Name)) { return BadRequest("Invalid secret name"); }
await getSecretHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false);
return port.ViewModel;
}
///
/// Updates a full secret by identifier.
///
[HttpPut("UpdateSecret")]
[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)]
public async Task UpdateSecretAsync([FromBody] UpdateSecretRequest request, CancellationToken cancellationToken = default)
{
if (string.IsNullOrEmpty(request.Name)) { return BadRequest("Invalid secret name"); }
if (string.IsNullOrEmpty(request.Value)) { return BadRequest("Invalid secret value"); }
await updateSecretHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false);
return port.ViewModel;
}
///
/// Deletes a secret by name.
///
[HttpDelete]
[Route("DeleteSecret")]
[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)]
public async Task DeleteSecretAsync([FromBody] DeleteSecretRequest request,
CancellationToken cancellationToken)
{
if (string.IsNullOrEmpty(request.Name)) { return BadRequest("Invalid secret name"); }
await deleteSecretHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false);
return port.ViewModel;
}
}
}