using Asp.Versioning; using Core.Blueprint.Application.UsesCases.Mongo.Input; using Core.Blueprint.Application.UsesCases.Mongo.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 MongoSampleController : ControllerBase { private readonly IComponentHandler createSampleHandler; private readonly IComponentHandler getAllSamplesHandler; private readonly IComponentHandler getSampleHandler; private readonly IComponentHandler updateSampleHandler; private readonly IComponentHandler deleteSampleHandler; private readonly IMongoPort port; /// /// Handles all services and business rules related to . /// public MongoSampleController( IComponentHandler getSampleHandler, IComponentHandler getAllSamplesHandler, IComponentHandler createSampleHandler, IComponentHandler updateSampleHandler, IComponentHandler deleteSampleHandler, IMongoPort port ) { this.createSampleHandler = createSampleHandler; this.updateSampleHandler = updateSampleHandler; this.deleteSampleHandler = deleteSampleHandler; 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] CreateMongoSampleRequest 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 GetAllMongoSamplesRequest { }, 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] GetMongoSampleRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request._Id)) { 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] UpdateMongoSampleRequest request, CancellationToken cancellationToken = default) { if (string.IsNullOrEmpty(request._Id)) { 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 DeleteSampleAsync([FromBody] DeleteMongoSampleRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid sample identifier"); } await deleteSampleHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } } }