CompleteOrderAsyn action is added.
This commit is contained in:
parent
06d5164532
commit
abf4fc5fe7
@ -0,0 +1,16 @@
|
|||||||
|
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
|
||||||
|
|
||||||
|
public class CompleteOrderCommand : IRequest<bool>
|
||||||
|
{
|
||||||
|
|
||||||
|
[DataMember]
|
||||||
|
public int OrderNumber { get; set; }
|
||||||
|
public CompleteOrderCommand()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public CompleteOrderCommand(int orderNumber)
|
||||||
|
{
|
||||||
|
OrderNumber = orderNumber;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
|
||||||
|
|
||||||
|
// Regular CommandHandler
|
||||||
|
public class CompleteOrderCommandHandler : IRequestHandler<CompleteOrderCommand, bool>
|
||||||
|
{
|
||||||
|
private readonly IOrderRepository _orderRepository;
|
||||||
|
|
||||||
|
public CompleteOrderCommandHandler(IOrderRepository orderRepository)
|
||||||
|
{
|
||||||
|
_orderRepository = orderRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler which processes the command when
|
||||||
|
/// customer executes complete order from app
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<bool> Handle(CompleteOrderCommand command, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var orderToUpdate = await _orderRepository.GetAsync(command.OrderNumber);
|
||||||
|
if (orderToUpdate == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
orderToUpdate.SetCompletedStatus();
|
||||||
|
return await _orderRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Use for Idempotency in Command process
|
||||||
|
public class CompleteOrderIdentifiedCommandHandler : IdentifiedCommandHandler<CompleteOrderCommand, bool>
|
||||||
|
{
|
||||||
|
public CompleteOrderIdentifiedCommandHandler(
|
||||||
|
IMediator mediator,
|
||||||
|
IRequestManager requestManager,
|
||||||
|
ILogger<IdentifiedCommandHandler<CompleteOrderCommand, bool>> logger)
|
||||||
|
: base(mediator, requestManager, logger)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool CreateResultForDuplicateRequest()
|
||||||
|
{
|
||||||
|
return true; // Ignore duplicate requests for processing order.
|
||||||
|
}
|
||||||
|
}
|
@ -55,6 +55,36 @@ public class OrdersController : ControllerBase
|
|||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Route("complete")]
|
||||||
|
[HttpPut]
|
||||||
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||||
|
public async Task<IActionResult> CompleteOrderAsync([FromBody] CompleteOrderCommand command, [FromHeader(Name = "x-requestid")] string requestId)
|
||||||
|
{
|
||||||
|
bool commandResult = false;
|
||||||
|
|
||||||
|
if (Guid.TryParse(requestId, out Guid guid) && guid != Guid.Empty)
|
||||||
|
{
|
||||||
|
var requestCompleteOrder = new IdentifiedCommand<CompleteOrderCommand, bool>(command, guid);
|
||||||
|
|
||||||
|
_logger.LogInformation(
|
||||||
|
"Sending command: {CommandName} - {IdProperty}: {CommandId} ({@Command})",
|
||||||
|
requestCompleteOrder.GetGenericTypeName(),
|
||||||
|
nameof(requestCompleteOrder.Command.OrderNumber),
|
||||||
|
requestCompleteOrder.Command.OrderNumber,
|
||||||
|
requestCompleteOrder);
|
||||||
|
|
||||||
|
commandResult = await _mediator.Send(requestCompleteOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!commandResult)
|
||||||
|
{
|
||||||
|
return BadRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
[Route("ship")]
|
[Route("ship")]
|
||||||
[HttpPut]
|
[HttpPut]
|
||||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
@ -156,6 +156,20 @@ public class Order
|
|||||||
AddDomainEvent(new OrderCancelledDomainEvent(this));
|
AddDomainEvent(new OrderCancelledDomainEvent(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetCompletedStatus()
|
||||||
|
{
|
||||||
|
// make sure it is shipped and paid before completing
|
||||||
|
if (_orderStatusId == OrderStatus.Paid.Id ||
|
||||||
|
_orderStatusId == OrderStatus.Shipped.Id)
|
||||||
|
{
|
||||||
|
StatusChangeException(OrderStatus.Completed);
|
||||||
|
}
|
||||||
|
|
||||||
|
_orderStatusId = OrderStatus.Completed.Id;
|
||||||
|
_description = $"The order is completed.";
|
||||||
|
AddDomainEvent(new OrderCompletedDomainEvent(this)); // a postponed way to raise domain events
|
||||||
|
}
|
||||||
|
|
||||||
public void SetCancelledStatusWhenStockIsRejected(IEnumerable<int> orderStockRejectedItems)
|
public void SetCancelledStatusWhenStockIsRejected(IEnumerable<int> orderStockRejectedItems)
|
||||||
{
|
{
|
||||||
if (_orderStatusId == OrderStatus.AwaitingValidation.Id)
|
if (_orderStatusId == OrderStatus.AwaitingValidation.Id)
|
||||||
|
@ -11,6 +11,7 @@ public class OrderStatus
|
|||||||
public static OrderStatus Paid = new OrderStatus(4, nameof(Paid).ToLowerInvariant());
|
public static OrderStatus Paid = new OrderStatus(4, nameof(Paid).ToLowerInvariant());
|
||||||
public static OrderStatus Shipped = new OrderStatus(5, nameof(Shipped).ToLowerInvariant());
|
public static OrderStatus Shipped = new OrderStatus(5, nameof(Shipped).ToLowerInvariant());
|
||||||
public static OrderStatus Cancelled = new OrderStatus(6, nameof(Cancelled).ToLowerInvariant());
|
public static OrderStatus Cancelled = new OrderStatus(6, nameof(Cancelled).ToLowerInvariant());
|
||||||
|
public static OrderStatus Completed = new OrderStatus(7, nameof(Completed).ToLowerInvariant());
|
||||||
|
|
||||||
public OrderStatus(int id, string name)
|
public OrderStatus(int id, string name)
|
||||||
: base(id, name)
|
: base(id, name)
|
||||||
@ -18,7 +19,7 @@ public class OrderStatus
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<OrderStatus> List() =>
|
public static IEnumerable<OrderStatus> List() =>
|
||||||
new[] { Submitted, AwaitingValidation, StockConfirmed, Paid, Shipped, Cancelled };
|
new[] { Submitted, AwaitingValidation, StockConfirmed, Paid, Shipped, Cancelled, Completed };
|
||||||
|
|
||||||
public static OrderStatus FromName(string name)
|
public static OrderStatus FromName(string name)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.Events;
|
||||||
|
|
||||||
|
public class OrderCompletedDomainEvent : INotification
|
||||||
|
{
|
||||||
|
public Order Order { get; }
|
||||||
|
|
||||||
|
public OrderCompletedDomainEvent(Order order)
|
||||||
|
{
|
||||||
|
Order = order;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user