53 lines
2.4 KiB
C#
53 lines
2.4 KiB
C#
namespace Netina.Core.EntityServices.OrderBagHandlers;
|
|
|
|
public class SubmitOrderBagCommandHandler(
|
|
IMediator mediator,
|
|
IRepositoryWrapper repositoryWrapper,
|
|
ICurrentUserService currentUserService)
|
|
: IRequestHandler<SubmitOrderBagCommand, OrderSDto>
|
|
{
|
|
public async Task<OrderSDto> Handle(SubmitOrderBagCommand request, CancellationToken cancellationToken)
|
|
{
|
|
if (currentUserService.UserId == null)
|
|
throw new AppException("Customer id notfound", ApiResultStatusCode.BadRequest);
|
|
if (!Guid.TryParse(currentUserService.UserId, out Guid userId))
|
|
throw new AppException("Customer id wrong", ApiResultStatusCode.BadRequest);
|
|
|
|
var orderBag = await mediator.Send(new GetUserOrderBagQuery(), cancellationToken);
|
|
|
|
foreach (var requestDto in request.RequestDtos)
|
|
{
|
|
|
|
var product = await repositoryWrapper.SetRepository<Product>()
|
|
.TableNoTracking
|
|
.FirstOrDefaultAsync(p => p.Id == requestDto.ProductId, cancellationToken);
|
|
|
|
if (product == null)
|
|
throw new AppException("Product not found ", ApiResultStatusCode.NotFound);
|
|
if (!product.IsEnable)
|
|
throw new AppException("Product is not enable", ApiResultStatusCode.BadRequest);
|
|
|
|
var productSDto = product.AdaptToSDto();
|
|
await mediator.Send(new CalculateProductDiscountCommand(productSDto), cancellationToken);
|
|
|
|
orderBag.ChangeOrderBag(productSDto.Id, productSDto.Cost, productSDto.CostWithDiscount,
|
|
productSDto.HasDiscount, productSDto.PackingCost, productSDto.CategoryId,productSDto.BrandId, requestDto.Count);
|
|
}
|
|
foreach (var orderProduct in orderBag.OrderProducts.ToList())
|
|
{
|
|
if(request.RequestDtos.FirstOrDefault(op=>op.ProductId==orderProduct.ProductId)==null)
|
|
{
|
|
orderBag.OrderProducts.Remove(orderProduct);
|
|
repositoryWrapper.SetRepository<OrderProduct>().Delete(orderProduct);
|
|
await repositoryWrapper.SaveChangesAsync(cancellationToken);
|
|
}
|
|
}
|
|
|
|
repositoryWrapper.SetRepository<Order>().Update(orderBag);
|
|
await repositoryWrapper.SaveChangesAsync(cancellationToken);
|
|
|
|
var order = await mediator.Send(new CalculateOrderCommand(orderBag.Id), cancellationToken);
|
|
|
|
return order.AdaptToSDto();
|
|
}
|
|
} |