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; } } }