Newer
Older
Warehouse / src / WebApi / API / V1 / ProductController.cs
@Derek Comartin Derek Comartin on 22 Aug 2023 2 KB Init
using MyWarehouse.Application.Common.Dependencies.DataAccess.Repositories.Common;
using MyWarehouse.Application.Products;
using MyWarehouse.Application.Products.CreateProduct;
using MyWarehouse.Application.Products.DeleteProduct;
using MyWarehouse.Application.Products.GetProduct;
using MyWarehouse.Application.Products.GetProducts;
using MyWarehouse.Application.Products.GetProductsSummary;
using MyWarehouse.Application.Products.ProductStockMass;
using MyWarehouse.Application.Products.ProductStockValue;
using MyWarehouse.Application.Products.UpdateProduct;

namespace MyWarehouse.WebApi.API.V1;

[Authorize]
[ApiController]
[ApiVersion("1.0")]
[Route("v{v:apiVersion}/products")]
public class ProductController : ControllerBase
{
    private readonly IMediator _mediator;

    public ProductController(IMediator mediator) => _mediator = mediator;

    [HttpPost]
    public async Task<ActionResult<int>> Create(CreateProductCommand command)
        => Ok(await _mediator.Send(command));

    [HttpGet]
    public async Task<ActionResult<IListResponseModel<ProductDto>>> GetList([FromQuery] GetProductsListQuery query)
        => Ok(await _mediator.Send(query));

    [HttpGet("{id}")]
    public async Task<ActionResult<ProductDetailsDto>> Get(int id)
        => Ok(await _mediator.Send(new GetProductDetailsQuery() { Id = id }));

    [HttpDelete("{id}")]
    public async Task<ActionResult> Delete(int id)
    {
        await _mediator.Send(new DeleteProductCommand() { Id = id });

        return NoContent();
    }

    [HttpPut("{id}")]
    public async Task<ActionResult> Update(int id, UpdateProductCommand command)
    {
        if (id != command.Id) return BadRequest();

        await _mediator.Send(command);

        return NoContent();
    }
    
    [HttpPut("{id}/sale")]
    public async Task<ActionResult> FlashSale(int id, FlashSaleCommand command)
    {
        if (id != command.Id) return BadRequest();

        await _mediator.Send(command);

        return NoContent();
    }

    [HttpGet("totalMass")]
    public async Task<ActionResult<StockMassDto>> ProductStockMass()
        => Ok(await _mediator.Send(new ProductStockMassQuery()));

    [HttpGet("totalValue")]
    public async Task<ActionResult<StockValueDto>> ProductStockValue()
        => Ok(await _mediator.Send(new ProductStockValueQuery()));

    [HttpGet("stockCount")]
    public async Task<ActionResult<ProductStockCountDto>> ProductStockCount()
        => Ok(await _mediator.Send(new ProductStockCountQuery()));
}