2017-01-25 17:10:08 +01:00
|
|
|
|
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
|
2016-12-29 11:03:03 +01:00
|
|
|
|
{
|
2017-01-17 18:32:40 -08:00
|
|
|
|
using Domain.AggregatesModel.BuyerAggregate;
|
2017-01-25 17:10:08 +01:00
|
|
|
|
using Domain.AggregatesModel.OrderAggregate;
|
2016-12-29 11:03:03 +01:00
|
|
|
|
using MediatR;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
2017-01-18 16:51:44 -08:00
|
|
|
|
public class CreateOrderCommandHandler
|
|
|
|
|
: IAsyncRequestHandler<CreateOrderCommand, bool>
|
2016-12-29 11:03:03 +01:00
|
|
|
|
{
|
|
|
|
|
private readonly IBuyerRepository _buyerRepository;
|
|
|
|
|
private readonly IOrderRepository _orderRepository;
|
|
|
|
|
|
2017-01-25 17:10:08 +01:00
|
|
|
|
public CreateOrderCommandHandler(IBuyerRepository buyerRepository, IOrderRepository orderRepository)
|
2016-12-29 11:03:03 +01:00
|
|
|
|
{
|
|
|
|
|
if (buyerRepository == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(nameof(buyerRepository));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (orderRepository == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException(nameof(orderRepository));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_buyerRepository = buyerRepository;
|
|
|
|
|
_orderRepository = orderRepository;
|
|
|
|
|
}
|
2017-01-25 17:10:08 +01:00
|
|
|
|
|
2017-01-18 16:51:44 -08:00
|
|
|
|
public async Task<bool> Handle(CreateOrderCommand message)
|
2016-12-29 11:03:03 +01:00
|
|
|
|
{
|
|
|
|
|
//find buyer/payment or add a new one buyer/payment
|
|
|
|
|
|
2017-01-25 17:10:08 +01:00
|
|
|
|
var buyer = await _buyerRepository.FindAsync(message.BuyerFullName);
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
|
|
|
|
if (buyer == null)
|
|
|
|
|
{
|
2017-01-25 17:10:08 +01:00
|
|
|
|
buyer = new Buyer(message.BuyerFullName);
|
2016-12-29 11:03:03 +01:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-27 11:38:23 +01:00
|
|
|
|
var payment = buyer.AddPaymentMethod(message.CardTypeId,
|
2017-01-25 17:10:08 +01:00
|
|
|
|
$"Payment Method on {DateTime.UtcNow}",
|
|
|
|
|
message.CardNumber,
|
|
|
|
|
message.CardSecurityNumber,
|
|
|
|
|
message.CardHolderName,
|
|
|
|
|
message.CardExpiration);
|
|
|
|
|
|
|
|
|
|
_buyerRepository.Add(buyer);
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
|
|
|
|
await _buyerRepository.UnitOfWork
|
|
|
|
|
.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
//create order for buyer and payment method
|
|
|
|
|
|
2017-01-25 17:10:08 +01:00
|
|
|
|
var order = new Order(buyer.Id, payment.Id, new Address(message.Street, message.City, message.State, message.Country, message.ZipCode));
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-01-25 17:10:08 +01:00
|
|
|
|
foreach (var item in message.Items)
|
2016-12-29 11:03:03 +01:00
|
|
|
|
{
|
2017-01-25 17:10:08 +01:00
|
|
|
|
order.AddOrderItem(item.ProductId, item.ProductName, item.UnitPrice, item.Discount, item.Units);
|
2016-12-29 11:03:03 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_orderRepository.Add(order);
|
|
|
|
|
|
|
|
|
|
var result = await _orderRepository.UnitOfWork
|
|
|
|
|
.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
return result > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|