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 MongoBlueprintController : ControllerBase { private readonly IComponentHandler createBlueprintHandler; private readonly IComponentHandler getAllBlueprintsHandler; private readonly IComponentHandler getBlueprintHandler; private readonly IComponentHandler updateBlueprintHandler; private readonly IComponentHandler deleteBlueprintHandler; private readonly IMongoPort port; /// /// Handles all services and business rules related to . /// public MongoBlueprintController( IComponentHandler getBlueprintHandler, IComponentHandler getAllBlueprintsHandler, IComponentHandler createBlueprintHandler, IComponentHandler updateBlueprintHandler, IComponentHandler deleteBlueprintHandler, IMongoPort port ) { this.createBlueprintHandler = createBlueprintHandler; this.updateBlueprintHandler = updateBlueprintHandler; this.deleteBlueprintHandler = deleteBlueprintHandler; this.getAllBlueprintsHandler = getAllBlueprintsHandler; this.getBlueprintHandler = getBlueprintHandler; this.port = port; } /// /// Creates a new blueprint. /// [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 CreateBlueprintAsync([FromBody] CreateBlueprintRequest newBlueprint, CancellationToken cancellationToken = default) { await createBlueprintHandler.ExecuteAsync(newBlueprint, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Gets all blueprints. /// [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 GetAllBlueprintsAsync(CancellationToken cancellationToken) { await getAllBlueprintsHandler.ExecuteAsync(new GetAllBlueprintsRequest { }, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Gets the blueprint 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 GetBlueprintById([FromBody] GetBlueprintRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid blueprint identifier"); } await getBlueprintHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Updates a full blueprint 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 UpdateBlueprintAsync([FromBody] UpdateBlueprintRequest request, CancellationToken cancellationToken = default) { if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid blueprint identifier"); } await updateBlueprintHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } /// /// Deletes a blueprint. /// [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 DeleteBlueprintAsync([FromBody] DeleteBlueprintRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request._Id)) { return BadRequest("Invalid blueprint identifier"); } await deleteBlueprintHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return port.ViewModel; } } }