Skip to content

Commit db41124

Browse files
committed
Merge branch 'order-processflow-redesign' of https://github.com/dotnet-architecture/eShopOnContainers into order-processflow-redesign
# Conflicts: # src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs
2 parents 36ca700 + 374c1d5 commit db41124

53 files changed

Lines changed: 748 additions & 241 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Services/Basket/Basket.API/Controllers/BasketController.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,21 @@ public async Task<IActionResult> Post([FromBody]CustomerBasket value)
5252
}
5353

5454
[Route("checkout")]
55-
[HttpPut]
56-
public async Task<IActionResult> Checkout([FromBody]BasketCheckout value)
55+
[HttpPost]
56+
public async Task<IActionResult> Checkout([FromBody]BasketCheckout value, [FromHeader(Name = "x-requestid")] string requestId)
5757
{
5858
var userId = _identitySvc.GetUserIdentity();
59+
value.RequestId = (Guid.TryParse(requestId, out Guid guid) && guid != Guid.Empty) ?
60+
guid : value.RequestId;
61+
5962
var basket = await _repository.GetBasketAsync(userId);
6063
var eventMessage = new UserCheckoutAcceptedIntegrationEvent(userId, value.City, value.Street,
6164
value.State, value.Country, value.ZipCode, value.CardNumber, value.CardHolderName,
6265
value.CardExpiration, value.CardSecurityNumber, value.CardTypeId, value.Buyer, value.RequestId, basket);
6366

67+
// Once basket is checkout, sends an integration event to
68+
// ordering.api to convert basket to order and proceeds with
69+
// order creation process
6470
_eventBus.Publish(eventMessage);
6571

6672
if (basket == null)

src/Services/Catalog/Catalog.API/IntegrationCommands/CommandHandlers/DecrementOrderStockCommandMsgHandler.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,11 @@ public async Task Handle(DecrementOrderStockCommandMsg @event)
2323
foreach (var orderStockItem in @event.OrderStockItems)
2424
{
2525
var catalogItem = _catalogContext.CatalogItems.Find(orderStockItem.ProductId);
26-
CheckValidcatalogItemId(catalogItem);
2726

2827
catalogItem.RemoveStock(orderStockItem.Units);
2928
}
3029

3130
await _catalogContext.SaveChangesAsync();
3231
}
33-
34-
private void CheckValidcatalogItemId(CatalogItem catalogItem)
35-
{
36-
if (catalogItem is null)
37-
{
38-
throw new CatalogDomainException("Not able to process catalog event. Reason: no valid catalogItemId");
39-
}
40-
}
4132
}
4233
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using MediatR;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Runtime.Serialization;
6+
using System.Threading.Tasks;
7+
8+
namespace Ordering.API.Application.Commands
9+
{
10+
public class ShipOrderCommand : IAsyncRequest<bool>
11+
{
12+
13+
[DataMember]
14+
public int OrderNumber { get; private set; }
15+
16+
public ShipOrderCommand(int orderNumber)
17+
{
18+
OrderNumber = orderNumber;
19+
}
20+
}
21+
}

src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ public async Task Handle(OrderStartedDomainEvent orderStartedEvent)
2626
{
2727
var cardTypeId = (orderStartedEvent.CardTypeId != 0) ? orderStartedEvent.CardTypeId : 1;
2828

29-
//var userGuid = _identityService.GetUserIdentity();
30-
3129
var buyer = await _buyerRepository.FindAsync(orderStartedEvent.UserId);
3230
bool buyerOriginallyExisted = (buyer == null) ? false : true;
3331

src/Services/Ordering/Ordering.API/Application/IntegrationEvents/EventHandling/OrderPaymentFailedIntegrationEventHandler.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
44
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
55
using Ordering.API.Application.IntegrationEvents.Events;
6-
using Ordering.Domain.Exceptions;
76
using System.Threading.Tasks;
87

98
public class OrderPaymentFailedIntegrationEventHandler :

src/Services/Ordering/Ordering.API/Application/IntegrationEvents/EventHandling/OrderPaymentSuccededIntegrationEventHandler.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
44
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
55
using Ordering.API.Application.IntegrationEvents.Events;
6-
using Ordering.Domain.Exceptions;
76
using System.Threading.Tasks;
87

98
public class OrderPaymentSuccededIntegrationEventHandler :

src/Services/Ordering/Ordering.API/Application/IntegrationEvents/EventHandling/OrderStockConfirmedIntegrationEventHandler.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
using System.Threading.Tasks;
55
using Events;
66
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
7-
using Ordering.API.Application.IntegrationCommands.Commands;
8-
using Ordering.Domain.Exceptions;
97

108
public class OrderStockConfirmedIntegrationEventHandler :
119
IIntegrationEventHandler<OrderStockConfirmedIntegrationEvent>

src/Services/Ordering/Ordering.API/Application/IntegrationEvents/EventHandling/OrderStockNotConfirmedIntegrationEventHandler.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
namespace Ordering.API.Application.IntegrationEvents.EventHandling
55
{
66
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
7-
using System;
87
using System.Threading.Tasks;
98
using Events;
109
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
11-
using Domain.Exceptions;
1210

1311
public class OrderStockNotConfirmedIntegrationEventHandler : IIntegrationEventHandler<OrderStockNotConfirmedIntegrationEvent>
1412
{

src/Services/Ordering/Ordering.API/Application/Sagas/OrderProcessSaga.cs

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1-
using Autofac.Features.OwnedInstances;
2-
using MediatR;
1+
using MediatR;
32
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
43
using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
54
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
65
using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure;
76
using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure.Idempotency;
87
using Ordering.API.Application.Commands;
98
using Ordering.API.Application.IntegrationCommands.Commands;
9+
using Ordering.API.Application.IntegrationEvents;
1010
using Ordering.Domain.Exceptions;
11-
using System;
12-
using System.Linq;
1311
using System.Threading.Tasks;
14-
using Ordering.API.Application.IntegrationEvents;
1512

1613
namespace Ordering.API.Application.Sagas
1714
{
@@ -25,20 +22,14 @@ namespace Ordering.API.Application.Sagas
2522
/// </summary>
2623
public class OrderProcessSaga : OrderSaga,
2724
IIntegrationEventHandler<ConfirmGracePeriodCommandMsg>,
28-
IAsyncRequestHandler<CancelOrderCommand, bool>
25+
IAsyncRequestHandler<CancelOrderCommand, bool>,
26+
IAsyncRequestHandler<ShipOrderCommand, bool>
2927
{
30-
private readonly IMediator _mediator;
31-
private readonly Func<Owned<OrderingContext>> _dbContextFactory;
32-
private readonly IOrderingIntegrationEventService _orderingIntegrationEventService;
3328

3429
public OrderProcessSaga(
35-
Func<Owned<OrderingContext>> dbContextFactory, OrderingContext orderingContext,
36-
IMediator mediator, IOrderingIntegrationEventService orderingIntegrationEventService)
30+
OrderingContext orderingContext)
3731
: base(orderingContext)
3832
{
39-
_dbContextFactory = dbContextFactory;
40-
_mediator = mediator;
41-
_orderingIntegrationEventService = orderingIntegrationEventService;
4233
}
4334

4435
/// <summary>
@@ -73,12 +64,41 @@ public async Task Handle(ConfirmGracePeriodCommandMsg @event)
7364
/// <returns></returns>
7465
public async Task<bool> Handle(CancelOrderCommand command)
7566
{
67+
var result = false;
7668
var orderSaga = FindSagaById(command.OrderNumber);
7769
CheckValidSagaId(orderSaga);
7870

79-
// Set order status tu cancelled
71+
// Not possible to cancel order when
72+
// it has already been shipped
73+
if (orderSaga.GetOrderStatusId() != OrderStatus.Cancelled.Id
74+
|| orderSaga.GetOrderStatusId() != OrderStatus.Shipped.Id)
75+
{
76+
orderSaga.SetCancelStatus();
77+
result = await SaveChangesAsync();
78+
}
79+
return result;
80+
}
81+
82+
/// <summary>
83+
/// Handler which processes the command when
84+
/// administrator executes ship order from app
85+
/// </summary>
86+
/// <param name="command"></param>
87+
/// <returns></returns>
88+
public async Task<bool> Handle(ShipOrderCommand command)
89+
{
90+
var result = false;
91+
var orderSaga = FindSagaById(command.OrderNumber);
92+
CheckValidSagaId(orderSaga);
8093

81-
return true;
94+
// Only ship order when
95+
// its status is paid
96+
if (orderSaga.GetOrderStatusId() == OrderStatus.Paid.Id)
97+
{
98+
orderSaga.SetShippedStatus();
99+
result = await SaveChangesAsync();
100+
}
101+
return result;
82102
}
83103

84104
private void CheckValidSagaId(Order orderSaga)
@@ -103,6 +123,18 @@ protected override bool CreateResultForDuplicateRequest()
103123
}
104124
}
105125

126+
public class ShipOrderCommandIdentifiedHandler : IdentifierCommandHandler<ShipOrderCommand, bool>
127+
{
128+
public ShipOrderCommandIdentifiedHandler(IMediator mediator, IRequestManager requestManager) : base(mediator, requestManager)
129+
{
130+
}
131+
132+
protected override bool CreateResultForDuplicateRequest()
133+
{
134+
return true; // Ignore duplicate requests for processing order.
135+
}
136+
}
137+
106138
#endregion
107139
}
108140
}

src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public OrdersController(IMediator mediator, IOrderQueries orderQueries, IIdentit
2828
}
2929

3030
[Route("cancel")]
31-
[HttpPost]
31+
[HttpPut]
3232
public async Task<IActionResult> CancelOrder([FromBody]CancelOrderCommand command, [FromHeader(Name = "x-requestid")] string requestId)
3333
{
3434
bool commandResult = false;
@@ -42,6 +42,21 @@ public async Task<IActionResult> CancelOrder([FromBody]CancelOrderCommand comman
4242

4343
}
4444

45+
[Route("ship")]
46+
[HttpPut]
47+
public async Task<IActionResult> ShipOrder([FromBody]ShipOrderCommand command, [FromHeader(Name = "x-requestid")] string requestId)
48+
{
49+
bool commandResult = false;
50+
if (Guid.TryParse(requestId, out Guid guid) && guid != Guid.Empty)
51+
{
52+
var requestShipOrder = new IdentifiedCommand<ShipOrderCommand, bool>(command, guid);
53+
commandResult = await _mediator.SendAsync(requestShipOrder);
54+
}
55+
56+
return commandResult ? (IActionResult)Ok() : (IActionResult)BadRequest();
57+
58+
}
59+
4560
[Route("{orderId:int}")]
4661
[HttpGet]
4762
public async Task<IActionResult> GetOrder(int orderId)

0 commit comments

Comments
 (0)