@ -0,0 +1,48 @@ | |||||
namespace Microsoft.eShopOnContainers.Services.Ordering.Api.Application.Commands | |||||
{ | |||||
using System; | |||||
using MediatR; | |||||
using Domain; | |||||
using System.Collections; | |||||
using System.Collections.Generic; | |||||
public class NewOrderCommand | |||||
:IAsyncRequest<bool> | |||||
{ | |||||
private readonly List<OrderItem> _orderItems; | |||||
public string City { get; set; } | |||||
public string Street { get; set; } | |||||
public string State { get; set; } | |||||
public string Country { get; set; } | |||||
public string ZipCode { get; set; } | |||||
public string CardNumber { get; set; } | |||||
public string CardHolderName { get; set; } | |||||
public DateTime CardExpiration { get; set; } | |||||
public string CardSecurityNumber { get; set; } | |||||
public int CardTypeId { get; set; } | |||||
public string Buyer { get; set; } | |||||
public IEnumerable<OrderItem> OrderItems => _orderItems; | |||||
public void AddOrderItem(OrderItem item) | |||||
{ | |||||
_orderItems.Add(item); | |||||
} | |||||
public NewOrderCommand() | |||||
{ | |||||
_orderItems = new List<OrderItem>(); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,118 @@ | |||||
namespace Microsoft.eShopOnContainers.Services.Ordering.Api.Application.Commands | |||||
{ | |||||
using Domain.Repositories; | |||||
using MediatR; | |||||
using System.Linq; | |||||
using System; | |||||
using System.Threading.Tasks; | |||||
using Domain; | |||||
public class NewOrderCommandHandler | |||||
: IAsyncRequestHandler<NewOrderCommand, bool> | |||||
{ | |||||
private readonly IBuyerRepository _buyerRepository; | |||||
private readonly IOrderRepository _orderRepository; | |||||
public NewOrderCommandHandler(IBuyerRepository buyerRepository,IOrderRepository orderRepository) | |||||
{ | |||||
if (buyerRepository == null) | |||||
{ | |||||
throw new ArgumentNullException(nameof(buyerRepository)); | |||||
} | |||||
if (orderRepository == null) | |||||
{ | |||||
throw new ArgumentNullException(nameof(orderRepository)); | |||||
} | |||||
_buyerRepository = buyerRepository; | |||||
_orderRepository = orderRepository; | |||||
} | |||||
public async Task<bool> Handle(NewOrderCommand message) | |||||
{ | |||||
//find buyer/payment or add a new one buyer/payment | |||||
var buyer = await _buyerRepository.FindAsync(message.Buyer); | |||||
if (buyer == null) | |||||
{ | |||||
buyer = CreateBuyer(message); | |||||
} | |||||
var payment = GetExistingPaymentOrAddANewOne(buyer, message); | |||||
await _buyerRepository.UnitOfWork | |||||
.SaveChangesAsync(); | |||||
//create order for buyer and payment method | |||||
var order = CreateOrder(buyer.Id, payment.Id, 0); | |||||
order.SetAddress( new Address() | |||||
{ | |||||
City = message.City, | |||||
State = message.State, | |||||
Street = message.Street, | |||||
ZipCode = message.ZipCode | |||||
}); | |||||
foreach (var item in message.OrderItems) | |||||
{ | |||||
order.AddOrderItem(item); | |||||
} | |||||
_orderRepository.Add(order); | |||||
var result = await _orderRepository.UnitOfWork | |||||
.SaveChangesAsync(); | |||||
return result > 0; | |||||
} | |||||
Payment GetExistingPaymentOrAddANewOne(Buyer buyer, NewOrderCommand message) | |||||
{ | |||||
Payment payment = PaymentAlreadyExist(buyer, message); | |||||
if (payment == null) | |||||
{ | |||||
payment = CreatePayment(message); | |||||
buyer.Payments.Add(payment); | |||||
} | |||||
return payment; | |||||
} | |||||
Payment PaymentAlreadyExist(Domain.Buyer buyer, NewOrderCommand message) | |||||
{ | |||||
return buyer.Payments | |||||
.SingleOrDefault(p => | |||||
{ | |||||
return p.CardHolderName == message.CardHolderName | |||||
&& | |||||
p.CardNumber == message.CardNumber | |||||
&& | |||||
p.Expiration == message.CardExpiration | |||||
&& | |||||
p.SecurityNumber == message.CardSecurityNumber; | |||||
}); | |||||
} | |||||
Buyer CreateBuyer(NewOrderCommand message) | |||||
{ | |||||
return _buyerRepository.Add( | |||||
new Buyer(message.Buyer)); | |||||
} | |||||
Order CreateOrder(int buyerId, int paymentId, int addressId) | |||||
{ | |||||
return new Order(buyerId, paymentId); | |||||
} | |||||
Payment CreatePayment(NewOrderCommand message) | |||||
{ | |||||
return new Payment(message.CardNumber, message.CardSecurityNumber, message.CardHolderName, message.CardExpiration, message.CardTypeId); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,63 @@ | |||||
| |||||
//namespace FunctionalTests.Services.Basket | |||||
//{ | |||||
// using Microsoft.eShopOnContainers.Services.Basket.API; | |||||
// using Microsoft.eShopOnContainers.Services.Basket.API.Model; | |||||
// using Microsoft.Extensions.Logging; | |||||
// using Microsoft.Extensions.Options; | |||||
// using System.Collections.Generic; | |||||
// using System.Threading.Tasks; | |||||
// using Xunit; | |||||
// public class RedisBasketRepositoryTests | |||||
// { | |||||
// [Fact] | |||||
// public async Task UpdateBasket_return_and_add_basket() | |||||
// { | |||||
// var redisBasketRepository = BuildBasketRepository(); | |||||
// var basket = await redisBasketRepository.UpdateBasket(new CustomerBasket("customerId") | |||||
// { | |||||
// BuyerId = "buyerId", | |||||
// Items = BuildBasketItems() | |||||
// }); | |||||
// Assert.NotNull(basket); | |||||
// Assert.Equal(1, basket.Items.Count); | |||||
// } | |||||
// [Fact] | |||||
// public async Task GetBasket_return_existing_basket() | |||||
// { | |||||
// } | |||||
// RedisBasketRepository BuildBasketRepository() | |||||
// { | |||||
// var loggerFactory = new LoggerFactory(); | |||||
// var options = Options.Create<BasketSettings>(new BasketSettings() | |||||
// { | |||||
// ConnectionString = "127.0.0.1" | |||||
// }); | |||||
// return new RedisBasketRepository(options, loggerFactory); | |||||
// } | |||||
// List<BasketItem> BuildBasketItems() | |||||
// { | |||||
// return new List<BasketItem>() | |||||
// { | |||||
// new BasketItem() | |||||
// { | |||||
// Id = "basketId", | |||||
// PictureUrl = "pictureurl", | |||||
// ProductId = "productId", | |||||
// ProductName = "productName", | |||||
// Quantity = 1, | |||||
// UnitPrice = 1 | |||||
// } | |||||
// }; | |||||
// } | |||||
// } | |||||
//} |