2017-01-25 17:10:08 +01:00
|
|
|
|
using System;
|
|
|
|
|
using MediatR;
|
|
|
|
|
using System.Collections.Generic;
|
2017-02-27 18:23:15 -08:00
|
|
|
|
using System.Runtime.Serialization;
|
2017-03-14 18:02:28 +01:00
|
|
|
|
using System.Collections;
|
2017-05-11 13:55:40 +02:00
|
|
|
|
using Ordering.API.Application.Models;
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-01-25 17:10:08 +01:00
|
|
|
|
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
|
|
|
|
|
{
|
2017-03-05 11:09:34 -08:00
|
|
|
|
// DDD and CQRS patterns comment: Note that it is recommended to implement immutable Commands
|
2017-02-27 21:05:28 -08:00
|
|
|
|
// In this case, its immutability is achieved by having all the setters as private
|
|
|
|
|
// plus only being able to update the data just once, when creating the object through its constructor.
|
|
|
|
|
// References on Immutable Commands:
|
|
|
|
|
// http://cqrs.nu/Faq
|
|
|
|
|
// https://docs.spine3.org/motivation/immutability.html
|
|
|
|
|
// http://blog.gauffin.org/2012/06/griffin-container-introducing-command-support/
|
|
|
|
|
// https://msdn.microsoft.com/en-us/library/bb383979.aspx
|
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataContract]
|
2017-01-18 16:51:44 -08:00
|
|
|
|
public class CreateOrderCommand
|
2016-12-29 11:03:03 +01:00
|
|
|
|
:IAsyncRequest<bool>
|
|
|
|
|
{
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-01-25 17:10:08 +01:00
|
|
|
|
private readonly List<OrderItemDTO> _orderItems;
|
|
|
|
|
|
2017-05-11 18:34:07 +02:00
|
|
|
|
[DataMember]
|
|
|
|
|
public string UserId { get; private set; }
|
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string City { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string Street { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string State { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string Country { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string ZipCode { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string CardNumber { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string CardHolderName { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public DateTime CardExpiration { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public string CardSecurityNumber { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-02-27 17:52:14 +01:00
|
|
|
|
public int CardTypeId { get; private set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-02-27 18:23:15 -08:00
|
|
|
|
[DataMember]
|
2017-01-30 15:46:43 +01:00
|
|
|
|
public IEnumerable<OrderItemDTO> OrderItems => _orderItems;
|
2016-12-29 11:03:03 +01:00
|
|
|
|
|
2017-01-18 16:51:44 -08:00
|
|
|
|
public CreateOrderCommand()
|
2016-12-29 11:03:03 +01:00
|
|
|
|
{
|
2017-01-25 17:10:08 +01:00
|
|
|
|
_orderItems = new List<OrderItemDTO>();
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-11 18:34:07 +02:00
|
|
|
|
public CreateOrderCommand(List<BasketItem> basketItems, string userId, string city, string street, string state, string country, string zipcode,
|
2017-02-27 17:52:14 +01:00
|
|
|
|
string cardNumber, string cardHolderName, DateTime cardExpiration,
|
2017-05-11 13:55:40 +02:00
|
|
|
|
string cardSecurityNumber, int cardTypeId) : this()
|
2017-02-27 17:52:14 +01:00
|
|
|
|
{
|
2017-05-11 13:55:40 +02:00
|
|
|
|
_orderItems = MapToOrderItems(basketItems);
|
2017-05-11 18:34:07 +02:00
|
|
|
|
UserId = userId;
|
2017-02-27 17:52:14 +01:00
|
|
|
|
City = city;
|
|
|
|
|
Street = street;
|
|
|
|
|
State = state;
|
|
|
|
|
Country = country;
|
|
|
|
|
ZipCode = zipcode;
|
|
|
|
|
CardNumber = cardNumber;
|
|
|
|
|
CardHolderName = cardHolderName;
|
2017-03-14 18:02:28 +01:00
|
|
|
|
CardExpiration = cardExpiration;
|
2017-02-27 17:52:14 +01:00
|
|
|
|
CardSecurityNumber = cardSecurityNumber;
|
|
|
|
|
CardTypeId = cardTypeId;
|
2017-03-03 17:51:32 +01:00
|
|
|
|
CardExpiration = cardExpiration;
|
2017-05-11 13:55:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<OrderItemDTO> MapToOrderItems(List<BasketItem> basketItems)
|
|
|
|
|
{
|
|
|
|
|
var result = new List<OrderItemDTO>();
|
|
|
|
|
basketItems.ForEach((item) => {
|
|
|
|
|
result.Add(new OrderItemDTO() {
|
2017-05-14 14:48:37 +02:00
|
|
|
|
ProductId = int.TryParse(item.ProductId, out int id) ? id : -1,
|
2017-05-11 13:55:40 +02:00
|
|
|
|
ProductName = item.ProductName,
|
|
|
|
|
PictureUrl = item.PictureUrl,
|
|
|
|
|
UnitPrice = item.UnitPrice,
|
|
|
|
|
Units = item.Quantity
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
return result;
|
2017-02-27 17:52:14 +01:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-25 17:10:08 +01:00
|
|
|
|
public class OrderItemDTO
|
|
|
|
|
{
|
|
|
|
|
public int ProductId { get; set; }
|
|
|
|
|
|
|
|
|
|
public string ProductName { get; set; }
|
|
|
|
|
|
|
|
|
|
public decimal UnitPrice { get; set; }
|
|
|
|
|
|
|
|
|
|
public decimal Discount { get; set; }
|
|
|
|
|
|
|
|
|
|
public int Units { get; set; }
|
2017-01-30 15:46:43 +01:00
|
|
|
|
|
|
|
|
|
public string PictureUrl { get; set; }
|
2016-12-29 11:03:03 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|