using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; using cuqmbr.TravelGuide.Application.Common.Models; using cuqmbr.TravelGuide.Application.Common.ViewModels; using cuqmbr.TravelGuide.Domain.Enums; using cuqmbr.TravelGuide.Application.Buses; using cuqmbr.TravelGuide.Application.Buses.Commands.AddBus; using cuqmbr.TravelGuide.Application.Buses.Queries.GetBusesPage; using cuqmbr.TravelGuide.Application.Buses.Queries.GetBus; using cuqmbr.TravelGuide.Application.Buses.Commands.UpdateBus; using cuqmbr.TravelGuide.Application.Buses.Commands.DeleteBus; using cuqmbr.TravelGuide.Application.Buses.ViewModels; namespace cuqmbr.TravelGuide.HttpApi.Controllers; [Route("buses")] public class BusesController : ControllerBase { [HttpPost] [SwaggerOperation("Add a bus")] [SwaggerResponse( StatusCodes.Status201Created, "Object successfuly created", typeof(BusDto))] [SwaggerResponse( StatusCodes.Status400BadRequest, "Object already exists", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status400BadRequest, "Input data validation error", typeof(HttpValidationProblemDetails))] [SwaggerResponse( StatusCodes.Status401Unauthorized, "Unauthorized to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status403Forbidden, "Not enough privileges to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status404NotFound, "Parent object not found", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status500InternalServerError, "Internal server error", typeof(ProblemDetails))] public async Task> Add( [FromBody] AddBusViewModel viewModel, CancellationToken cancellationToken) { return StatusCode( StatusCodes.Status201Created, await Mediator.Send( new AddBusCommand() { Number = viewModel.Number, Model = viewModel.Model, Capacity = viewModel.Capacity }, cancellationToken)); } [HttpGet] [SwaggerOperation("Get a list of all buses")] [SwaggerResponse( StatusCodes.Status200OK, "Request successful", typeof(PaginatedList))] [SwaggerResponse( StatusCodes.Status400BadRequest, "Input data validation error", typeof(HttpValidationProblemDetails))] [SwaggerResponse( StatusCodes.Status401Unauthorized, "Unauthorized to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status403Forbidden, "Not enough privileges to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status500InternalServerError, "Internal server error", typeof(ProblemDetails))] public async Task> GetPage( [FromQuery] PageQuery pageQuery, [FromQuery] SearchQuery searchQuery, [FromQuery] SortQuery sortQuery, [FromQuery] GetBusesPageFilterViewModel filterQuery, CancellationToken cancellationToken) { return await Mediator.Send( new GetBusesPageQuery() { PageNumber = pageQuery.PageNumber, PageSize = pageQuery.PageSize, Search = searchQuery.Search, Sort = sortQuery.Sort, CapacityGreaterOrEqualThan = filterQuery.CapacityGreaterOrEqualThan, CapacityLessOrEqualThan = filterQuery.CapacityLessOrEqualThan }, cancellationToken); } [HttpGet("{uuid:guid}")] [SwaggerOperation("Get a bus by uuid")] [SwaggerResponse( StatusCodes.Status200OK, "Request successful", typeof(BusDto))] [SwaggerResponse( StatusCodes.Status400BadRequest, "Input data validation error", typeof(HttpValidationProblemDetails))] [SwaggerResponse( StatusCodes.Status401Unauthorized, "Unauthorized to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status403Forbidden, "Not enough privileges to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status404NotFound, "Object not found", typeof(BusDto))] [SwaggerResponse( StatusCodes.Status500InternalServerError, "Internal server error", typeof(ProblemDetails))] public async Task Get( [FromRoute] Guid uuid, CancellationToken cancellationToken) { return await Mediator.Send(new GetBusQuery() { Guid = uuid }, cancellationToken); } [HttpPut("{uuid:guid}")] [SwaggerOperation("Update a bus")] [SwaggerResponse( StatusCodes.Status200OK, "Request successful", typeof(BusDto))] [SwaggerResponse( StatusCodes.Status400BadRequest, "Object already exists", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status400BadRequest, "Input data validation error", typeof(HttpValidationProblemDetails))] [SwaggerResponse( StatusCodes.Status401Unauthorized, "Unauthorized to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status403Forbidden, "Not enough privileges to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status404NotFound, "Object not found", typeof(BusDto))] [SwaggerResponse( StatusCodes.Status404NotFound, "Parent object not found", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status500InternalServerError, "Internal server error", typeof(ProblemDetails))] public async Task Update( [FromRoute] Guid uuid, [FromBody] UpdateBusViewModel viewModel, CancellationToken cancellationToken) { return await Mediator.Send( new UpdateBusCommand() { Guid = uuid, Number = viewModel.Number, Model = viewModel.Model, Capacity = viewModel.Capacity }, cancellationToken); } [HttpDelete("{uuid:guid}")] [SwaggerOperation("Delete a bus")] [SwaggerResponse(StatusCodes.Status204NoContent, "Request successful")] [SwaggerResponse( StatusCodes.Status400BadRequest, "Input data validation error", typeof(HttpValidationProblemDetails))] [SwaggerResponse( StatusCodes.Status401Unauthorized, "Unauthorized to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status403Forbidden, "Not enough privileges to perform an action", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status404NotFound, "Object not found", typeof(ProblemDetails))] [SwaggerResponse( StatusCodes.Status500InternalServerError, "Internal server error", typeof(ProblemDetails))] public async Task Delete( [FromRoute] Guid uuid, CancellationToken cancellationToken) { await Mediator.Send( new DeleteBusCommand() { Guid = uuid }, cancellationToken); return StatusCode(StatusCodes.Status204NoContent); } }