订单的取消和发货命令
This commit is contained in:
parent
3cad5598b7
commit
923089b83b
@ -0,0 +1,9 @@
|
|||||||
|
// Copyright (c) HelloShop Corporation. All rights reserved.
|
||||||
|
// See the license file in the project root for more information.
|
||||||
|
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace HelloShop.OrderingService.Commands.Orders
|
||||||
|
{
|
||||||
|
public record CancelOrderCommand(int OrderNumber) : IRequest<bool>;
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (c) HelloShop Corporation. All rights reserved.
|
||||||
|
// See the license file in the project root for more information.
|
||||||
|
|
||||||
|
using HelloShop.OrderingService.Entities.Orders;
|
||||||
|
using HelloShop.OrderingService.Infrastructure;
|
||||||
|
using HelloShop.OrderingService.Services;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace HelloShop.OrderingService.Commands.Orders
|
||||||
|
{
|
||||||
|
public class CancelOrderCommandHandler(OrderingServiceDbContext dbContext) : IRequestHandler<CancelOrderCommand, bool>
|
||||||
|
{
|
||||||
|
public async Task<bool> Handle(CancelOrderCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var orderToUpdate = await dbContext.Set<Order>().FindAsync([request.OrderNumber], cancellationToken);
|
||||||
|
|
||||||
|
if (orderToUpdate == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
orderToUpdate.OrderStatus = OrderStatus.Cancelled;
|
||||||
|
|
||||||
|
return await dbContext.SaveChangesAsync(cancellationToken) > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CancelOrderIdentifiedCommandHandler(IMediator mediator, IClientRequestManager requestManager) : IdentifiedCommandHandler<CancelOrderCommand, bool>(mediator, requestManager)
|
||||||
|
{
|
||||||
|
protected override bool CreateResultForDuplicateRequest() => true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
// Copyright (c) HelloShop Corporation. All rights reserved.
|
||||||
|
// See the license file in the project root for more information.
|
||||||
|
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace HelloShop.OrderingService.Commands.Orders
|
||||||
|
{
|
||||||
|
public record ShipOrderCommand(int OrderNumber) : IRequest<bool>;
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (c) HelloShop Corporation. All rights reserved.
|
||||||
|
// See the license file in the project root for more information.
|
||||||
|
|
||||||
|
using HelloShop.OrderingService.Entities.Orders;
|
||||||
|
using HelloShop.OrderingService.Infrastructure;
|
||||||
|
using HelloShop.OrderingService.Services;
|
||||||
|
using MediatR;
|
||||||
|
|
||||||
|
namespace HelloShop.OrderingService.Commands.Orders
|
||||||
|
{
|
||||||
|
public class ShipOrderCommandHandler(OrderingServiceDbContext dbContext) : IRequestHandler<ShipOrderCommand, bool>
|
||||||
|
{
|
||||||
|
public async Task<bool> Handle(ShipOrderCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var orderToUpdate = await dbContext.Set<Order>().FindAsync([request.OrderNumber], cancellationToken: cancellationToken);
|
||||||
|
|
||||||
|
if (orderToUpdate == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
orderToUpdate.OrderStatus = OrderStatus.Shipped;
|
||||||
|
|
||||||
|
return await dbContext.SaveChangesAsync(cancellationToken) > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ShipOrderIdentifiedCommandHandler(IMediator mediator, IClientRequestManager requestManager) : IdentifiedCommandHandler<ShipOrderCommand, bool>(mediator, requestManager)
|
||||||
|
{
|
||||||
|
protected override bool CreateResultForDuplicateRequest() => true;
|
||||||
|
}
|
||||||
|
}
|
@ -7,12 +7,14 @@ using HelloShop.OrderingService.Commands.Orders;
|
|||||||
using HelloShop.OrderingService.Models.Orders;
|
using HelloShop.OrderingService.Models.Orders;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Components.Forms;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
|
||||||
namespace HelloShop.OrderingService.Controllers
|
namespace HelloShop.OrderingService.Controllers;
|
||||||
{
|
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
@ -61,5 +63,39 @@ namespace HelloShop.OrderingService.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[HttpPut("Cancel/{id}")]
|
||||||
|
public async Task<IActionResult> CancelOrder([FromHeader(Name = "x-request-id")] Guid requestId, int id)
|
||||||
|
{
|
||||||
|
CancelOrderCommand cancelOrderCommand = new(id);
|
||||||
|
|
||||||
|
var requestCancelOrder = new IdentifiedCommand<CancelOrderCommand, bool>(cancelOrderCommand, requestId);
|
||||||
|
|
||||||
|
var commandResult = await mediator.Send(requestCancelOrder);
|
||||||
|
|
||||||
|
if (!commandResult)
|
||||||
|
{
|
||||||
|
return Problem(detail: "Cancel order failed to process.", statusCode: 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPut("Ship/{id}")]
|
||||||
|
public async Task<IActionResult> ShipOrder([FromHeader(Name = "x-request-id")] Guid requestId, int id)
|
||||||
|
{
|
||||||
|
ShipOrderCommand shipOrderCommand = new(id);
|
||||||
|
|
||||||
|
var requestShipOrder = new IdentifiedCommand<ShipOrderCommand, bool>(shipOrderCommand, requestId);
|
||||||
|
|
||||||
|
var commandResult = await mediator.Send(requestShipOrder);
|
||||||
|
|
||||||
|
if (!commandResult)
|
||||||
|
{
|
||||||
|
return Problem(detail: "Ship order failed to process.", statusCode: 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,8 @@ namespace HelloShop.OrderingService.Extensions
|
|||||||
options.AddBehavior(typeof(LoggingBehavior<,>));
|
options.AddBehavior(typeof(LoggingBehavior<,>));
|
||||||
options.AddBehavior(typeof(ValidatorBehavior<,>));
|
options.AddBehavior(typeof(ValidatorBehavior<,>));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
builder.Services.AddModelMapper().AddModelValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static WebApplication MapApplicationEndpoints(this WebApplication app)
|
public static WebApplication MapApplicationEndpoints(this WebApplication app)
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
// Copyright (c) HelloShop Corporation. All rights reserved.
|
||||||
|
// See the license file in the project root for more information.
|
||||||
|
|
||||||
|
using FluentValidation;
|
||||||
|
using HelloShop.OrderingService.Commands.Orders;
|
||||||
|
|
||||||
|
namespace HelloShop.OrderingService.Validations.Commands
|
||||||
|
{
|
||||||
|
public class CancelOrderCommandValidator : AbstractValidator<CancelOrderCommand>
|
||||||
|
{
|
||||||
|
public CancelOrderCommandValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.OrderNumber).GreaterThan(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
// Copyright (c) HelloShop Corporation. All rights reserved.
|
||||||
|
// See the license file in the project root for more information.
|
||||||
|
|
||||||
|
using FluentValidation;
|
||||||
|
using HelloShop.OrderingService.Commands.Orders;
|
||||||
|
|
||||||
|
namespace HelloShop.OrderingService.Validations.Commands
|
||||||
|
{
|
||||||
|
public class ShipOrderCommandValidator : AbstractValidator<ShipOrderCommand>
|
||||||
|
{
|
||||||
|
public ShipOrderCommandValidator()
|
||||||
|
{
|
||||||
|
RuleFor(order => order.OrderNumber).GreaterThan(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user