using Asp.Versioning; using Core.Blueprint.Application.UsesCases.BlobStorage.Ports; using Core.Blueprint.Application.UsesCases.KeyVault.Input; 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 BlobStorageController : ControllerBase { private readonly IComponentHandler uploadBlobHandler; private readonly IComponentHandler getBlobListHandler; private readonly IComponentHandler downloadBlobHandler; private readonly IComponentHandler deleteBlobHandler; private readonly IStoragePort port; /// /// Handles all services and business rules related to . /// public BlobStorageController( IComponentHandler uploadBlobHandler, IComponentHandler getBlobListHandler, IComponentHandler downloadBlobHandler, IComponentHandler deleteBlobHandler, IStoragePort port ) { this.uploadBlobHandler = uploadBlobHandler; this.getBlobListHandler = getBlobListHandler; this.downloadBlobHandler = downloadBlobHandler; this.deleteBlobHandler = deleteBlobHandler; this.port = port; } /// /// Uploads a new blob. /// [HttpPost("UploadBlob")] [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 UploadBlobAsync([FromBody] UploadBlobRequest newBlob, CancellationToken cancellationToken = default) { await uploadBlobHandler.ExecuteAsync(newBlob, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Gets all blobs into the container. /// [HttpGet] [Route("GetBlobList")] [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 GetBlobList([FromQuery] string? prefix, CancellationToken cancellationToken) { await getBlobListHandler.ExecuteAsync(new GetBlobListRequest { Prefix = prefix }, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Downloads a blob by name. /// [HttpPost("DownloadBlob")] [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 DownloadBlobAsync([FromBody] DownloadBlobRequest request, CancellationToken cancellationToken = default) { if (string.IsNullOrEmpty(request.BlobName)) { return BadRequest("Invalid blob name"); } await downloadBlobHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Deletes a blob by name. /// [HttpDelete] [Route("DeleteBlob")] [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 DeleteBlobAsync([FromBody] DeleteBlobRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request.BlobName)) { return BadRequest("Invalid blob name"); } await deleteBlobHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } } }