From c89cc06f9456d758e9335f2dfd0a0160bfd737fb Mon Sep 17 00:00:00 2001 From: Christian Arenas Date: Mon, 15 May 2017 19:17:16 +0200 Subject: [PATCH] Add new methods to order aggregate root and modify saga process --- .../Ordering.API/Application/Sagas/Saga.cs | 5 -- .../AggregatesModel/OrderAggregate/Order.cs | 64 +++++++++++++++++-- .../OrderAggregate/OrderStatus.cs | 4 +- ...sChangedToAwaitingValidationDomainEvent.cs | 23 +++++++ .../OrderStatusChangedToPaidDomainEvent.cs | 23 +++++++ ...tatusChangedToStockConfirmedDomainEvent.cs | 16 +++++ .../OrderStockMethodVerifiedDomainEvent.cs | 24 ------- 7 files changed, 122 insertions(+), 37 deletions(-) create mode 100644 src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToAwaitingValidationDomainEvent.cs create mode 100644 src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToPaidDomainEvent.cs create mode 100644 src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToStockConfirmedDomainEvent.cs delete mode 100644 src/Services/Ordering/Ordering.Domain/Events/OrderStockMethodVerifiedDomainEvent.cs diff --git a/src/Services/Ordering/Ordering.API/Application/Sagas/Saga.cs b/src/Services/Ordering/Ordering.API/Application/Sagas/Saga.cs index caaa3fa37..b03fb18fa 100644 --- a/src/Services/Ordering/Ordering.API/Application/Sagas/Saga.cs +++ b/src/Services/Ordering/Ordering.API/Application/Sagas/Saga.cs @@ -17,10 +17,5 @@ namespace Ordering.API.Application.Sagas public abstract TEntity FindSagaById(int id); public abstract Task SaveChangesAsync(); - //{ - // var ctx = context ?? _dbContext; - // var result = await ctx.SaveChangesAsync(); - // return result > 0; - //} } } diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index e8bc2b42b..887900f90 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -1,5 +1,6 @@ using Microsoft.eShopOnContainers.Services.Ordering.Domain.Seedwork; using Ordering.Domain.Events; +using Ordering.Domain.Exceptions; using System; using System.Collections.Generic; using System.Linq; @@ -93,18 +94,38 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O _buyerId = id; } - public void SetOrderStatusId(int id) + #region Status Changes + public void SetSubmitedStatus() { - _orderStatusId = id; + _orderStatusId = OrderStatus.Submited.Id; + } + + public void SetAwaitingValidationStatus() + { + if (_orderStatusId != OrderStatus.Submited.Id) + { + StatusChangeException(); + } + + _orderStatusId = OrderStatus.AwaitingValidation.Id; + + AddDomainEvent(new OrderStatusChangedToAwaitingValidationDomainEvent(Id, OrderItems)); } - public void SetOrderStockConfirmed(IEnumerable orderStockNotConfirmedItems = null) + public void SetStockConfirmedStatus(IEnumerable orderStockNotConfirmedItems = null) { - if(orderStockNotConfirmedItems is null) + if (_orderStatusId != OrderStatus.AwaitingValidation.Id) { - OrderStatus = OrderStatus.StockValidated; + StatusChangeException(); + } + + if (orderStockNotConfirmedItems is null) + { + OrderStatus = OrderStatus.StockConfirmed; _description = "All the items were confirmed with available stock."; + + AddDomainEvent(new OrderStatusChangedToStockConfirmedDomainEvent(Id)); } else { @@ -117,10 +138,36 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O var itemsStockNotConfirmedDescription = string.Join(", ", itemsStockNotConfirmedProductNames); _description = $"The product items don't have stock: ({itemsStockNotConfirmedDescription})."; } + } + + public void SetPaidStatus() + { + if (_orderStatusId != OrderStatus.StockConfirmed.Id) + { + StatusChangeException(); + } + + _orderStatusId = OrderStatus.Paid.Id; + _description = "The payment was performed at a simulated \"American Bank checking bank account endinf on XX35071\""; + + AddDomainEvent(new OrderStatusChangedToPaidDomainEvent(Id, OrderItems)); + } + + public void SetShippedStatus() + { + if (_orderStatusId != OrderStatus.Paid.Id) + { + StatusChangeException(); + } - AddDomainEvent(new OrderStockConfirmedDomainEvent(Id, OrderStatus)); + _orderStatusId = OrderStatus.Shipped.Id; + _description = ""; + + //Call Domain Event } + #endregion + private void AddOrderStartedDomainEvent(string userId, int cardTypeId, string cardNumber, string cardSecurityNumber, string cardHolderName, DateTime cardExpiration) { @@ -130,6 +177,11 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O this.AddDomainEvent(orderStartedDomainEvent); } + + private void StatusChangeException() + { + throw new OrderingDomainException("Not able to process order event. Reason: no valid order status change"); + } } } diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs index 73178cbe5..02891fb58 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderStatus.cs @@ -12,7 +12,7 @@ { public static OrderStatus Submited = new OrderStatus(1, nameof(Submited).ToLowerInvariant()); public static OrderStatus AwaitingValidation = new OrderStatus(2, nameof(AwaitingValidation).ToLowerInvariant()); - public static OrderStatus StockValidated = new OrderStatus(3, nameof(StockValidated).ToLowerInvariant()); + public static OrderStatus StockConfirmed = new OrderStatus(3, nameof(StockConfirmed).ToLowerInvariant()); public static OrderStatus Paid = new OrderStatus(4, nameof(Paid).ToLowerInvariant()); public static OrderStatus Shipped = new OrderStatus(5, nameof(Shipped).ToLowerInvariant()); public static OrderStatus Cancelled = new OrderStatus(6, nameof(Cancelled).ToLowerInvariant()); @@ -27,7 +27,7 @@ } public static IEnumerable List() => - new[] { Submited, AwaitingValidation, StockValidated, Paid, Shipped, Cancelled }; + new[] { Submited, AwaitingValidation, StockConfirmed, Paid, Shipped, Cancelled }; public static OrderStatus FromName(string name) { diff --git a/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToAwaitingValidationDomainEvent.cs b/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToAwaitingValidationDomainEvent.cs new file mode 100644 index 000000000..e324ecfa0 --- /dev/null +++ b/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToAwaitingValidationDomainEvent.cs @@ -0,0 +1,23 @@ +namespace Ordering.Domain.Events +{ + using MediatR; + using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; + using System.Collections.Generic; + + /// + /// Event used when the grace period order is confirmed + /// + public class OrderStatusChangedToAwaitingValidationDomainEvent + : IAsyncNotification + { + public int OrderId { get; } + public IEnumerable OrderItems { get; } + + public OrderStatusChangedToAwaitingValidationDomainEvent(int orderId, + IEnumerable orderItems) + { + OrderId = orderId; + OrderItems = orderItems; + } + } +} \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToPaidDomainEvent.cs b/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToPaidDomainEvent.cs new file mode 100644 index 000000000..743770507 --- /dev/null +++ b/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToPaidDomainEvent.cs @@ -0,0 +1,23 @@ +namespace Ordering.Domain.Events +{ + using MediatR; + using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; + using System.Collections.Generic; + + /// + /// Event used when the order is paid + /// + public class OrderStatusChangedToPaidDomainEvent + : IAsyncNotification + { + public int OrderId { get; } + public IEnumerable OrderItems { get; } + + public OrderStatusChangedToPaidDomainEvent(int orderId, + IEnumerable orderItems) + { + OrderId = orderId; + OrderItems = orderItems; + } + } +} \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToStockConfirmedDomainEvent.cs b/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToStockConfirmedDomainEvent.cs new file mode 100644 index 000000000..2e9b2bab5 --- /dev/null +++ b/src/Services/Ordering/Ordering.Domain/Events/OrderStatusChangedToStockConfirmedDomainEvent.cs @@ -0,0 +1,16 @@ +namespace Ordering.Domain.Events +{ + using MediatR; + + /// + /// Event used when the order stock items are confirmed + /// + public class OrderStatusChangedToStockConfirmedDomainEvent + : IAsyncNotification + { + public int OrderId { get; } + + public OrderStatusChangedToStockConfirmedDomainEvent(int orderId) + => OrderId = orderId; + } +} \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.Domain/Events/OrderStockMethodVerifiedDomainEvent.cs b/src/Services/Ordering/Ordering.Domain/Events/OrderStockMethodVerifiedDomainEvent.cs deleted file mode 100644 index 86f9c34d4..000000000 --- a/src/Services/Ordering/Ordering.Domain/Events/OrderStockMethodVerifiedDomainEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; - -namespace Ordering.Domain.Events -{ - using MediatR; - using System.Collections.Generic; - - /// - /// Event used when the order stock items are verified - /// - public class OrderStockConfirmedDomainEvent - : IAsyncNotification - { - public int OrderId { get; } - public OrderStatus OrderStatus { get; } - - public OrderStockConfirmedDomainEvent(int orderId, - OrderStatus orderStatus) - { - OrderId = orderId; - OrderStatus = orderStatus; - } - } -} \ No newline at end of file