using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.eShopWeb.Infrastructure.Data;
namespace Microsoft.eShopWeb.Features.Orders
{
[Route("order/my-orders")]
public class GetMyOrdersController : Controller
{
private readonly IMediator _mediator;
public GetMyOrdersController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
public async Task<IActionResult> MyOrders()
{
var viewModel = await _mediator.Send(new GetMyOrdersQuery(User.Identity.Name));
return View("/Features/Orders/GetMyOrders.cshtml", viewModel);
}
}
public class GetMyOrdersViewModel
{
public IEnumerable<OrderSummaryViewModel> Orders { get; set; }
}
public class OrderSummaryViewModel
{
private const string DEFAULT_STATUS = "Pending";
public int OrderNumber { get; set; }
public DateTimeOffset OrderDate { get; set; }
public decimal Total { get; set; }
public string Status => DEFAULT_STATUS;
}
public class GetMyOrdersQuery : IRequest<GetMyOrdersViewModel>
{
public string UserName { get; set; }
public GetMyOrdersQuery(string userName)
{
UserName = userName;
}
}
public class GetMyOrdersHandler : IRequestHandler<GetMyOrdersQuery, GetMyOrdersViewModel>
{
private readonly CatalogContext _db;
public GetMyOrdersHandler(CatalogContext db)
{
_db = db;
}
public async Task<GetMyOrdersViewModel> Handle(GetMyOrdersQuery request, CancellationToken cancellationToken)
{
var result = new GetMyOrdersViewModel();
result.Orders = await _db.CustomerOrdersWithItems(request.UserName)
.Select(o => new OrderSummaryViewModel
{
OrderDate = o.OrderDate,
OrderNumber = o.Id,
Total = o.OrderItems.Sum(x => x.Units * x.UnitPrice),
})
.ToArrayAsync(cancellationToken);
return result;
}
}
}