using Asp.Versioning; using Core.Blueprint.Application.UsesCases.SQL.Input; using Core.Blueprint.Application.UsesCases.SQL.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 SqlSampleController : ControllerBase { private readonly IComponentHandler createSampleHandler; private readonly IComponentHandler getAllSamplesHandler; private readonly IComponentHandler getSampleHandler; private readonly IComponentHandler updateSampleHandler; private readonly IComponentHandler deleteSampleStatusHandler; private readonly ISQLPort port; /// /// Handles all services and business rules related to . /// public SqlSampleController( IComponentHandler getSampleHandler, IComponentHandler getAllSamplesHandler, IComponentHandler createSampleHandler, IComponentHandler updateSampleHandler, IComponentHandler deleteSampleStatusHandler, ISQLPort port ) { this.createSampleHandler = createSampleHandler; this.updateSampleHandler = updateSampleHandler; this.deleteSampleStatusHandler = deleteSampleStatusHandler; this.getAllSamplesHandler = getAllSamplesHandler; this.getSampleHandler = getSampleHandler; this.port = port; } /// /// Creates a new Sample. /// [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)] public async Task CreateSampleAsync([FromBody] CreateSqlSampleRequest newSample, CancellationToken cancellationToken = default) { await createSampleHandler.ExecuteAsync(newSample, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Gets all Samples. /// [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)] public async Task GetAllSamplesAsync(CancellationToken cancellationToken) { await getAllSamplesHandler.ExecuteAsync(new GetAllSqlSamplesRequest { }, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Gets the Sample 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)] public async Task GetSampleById([FromBody] GetSqlSampleRequest request, CancellationToken cancellationToken) { if (request.Id <= 0) { return BadRequest("Invalid Sample identifier"); } await getSampleHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Updates a full Sample 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)] public async Task UpdateSampleAsync([FromBody] UpdateSqlSampleRequest request, CancellationToken cancellationToken = default) { if (request.Id <= 0) { return BadRequest("Invalid Sample identifier"); } await updateSampleHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Deletes a Sample. /// [HttpDelete] [Route("Delete")] [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 DeleteSampleStatusAsync([FromBody] DeleteSqlSampleRequest request, CancellationToken cancellationToken) { if (request.Id <= 0) { return BadRequest("Invalid Sample identifier"); } await deleteSampleStatusHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } } }