using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Catalog;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Swashbuckle.AspNetCore.Annotations;
namespace Warehouse.Products
{
[ApiController]
public class GetQuantityOnHandController : ControllerBase
{
private readonly IMediator _mediator;
public GetQuantityOnHandController(IMediator mediator)
{
_mediator = mediator;
}
[SwaggerOperation(
OperationId = "GetQuantityOnHand",
Tags = new[] { "Warehouse" })]
[HttpGet("/warehouse/products/{sku}", Name = "GetQuantityOnHand")]
public async Task<IActionResult> GetQuantityOnHand([FromRoute] string sku)
{
var result = await _mediator.Send(new GetQuantityOnHandRequest(sku));
if (result.Exists)
{
return Ok(result.Result);
}
return NotFound();
}
}
public class GetQuantityOnHandRequest : IRequest<(bool Exists, GetQuantityOnHandResult Result)>
{
public GetQuantityOnHandRequest(string sku)
{
Sku = sku;
}
public string Sku { get; set; }
}
public class GetQuantityOnHandResult
{
public string Sku { get; set; }
public int QuantityOnHand { get; set; }
}
public class GetQuantityOnHandHandler : IRequestHandler<GetQuantityOnHandRequest, (bool Exists, GetQuantityOnHandResult Result)>
{
private readonly CatalogDbContext _db;
public GetQuantityOnHandHandler(CatalogDbContext db)
{
_db = db;
_db.Database.EnsureCreated();
}
public async Task<(bool Exists, GetQuantityOnHandResult Result)> Handle(GetQuantityOnHandRequest request, CancellationToken cancellationToken)
{
var product = await _db.Products
.Where(x => x.Sku == request.Sku)
.Select(x => new {x.QuantityOnHand})
.SingleOrDefaultAsync(cancellationToken);
if (product == null)
{
return (false, null);
}
var result = new GetQuantityOnHandResult
{
Sku = request.Sku,
QuantityOnHand = product.QuantityOnHand
};
return (true, result);
}
}
}