using NetinaShop.Domain.Entities.Warehouses; namespace NetinaShop.Core.EntityServices.OrderBagHandlers; public class SubmitOrderDeliveryCommandHandler : IRequestHandler { private readonly IMediator _mediator; private readonly IRepositoryWrapper _repositoryWrapper; public SubmitOrderDeliveryCommandHandler(IMediator mediator, IRepositoryWrapper repositoryWrapper) { _mediator = mediator; _repositoryWrapper = repositoryWrapper; } public async Task Handle(SubmitOrderDeliveryCommand request, CancellationToken cancellationToken) { var order = await _mediator.Send(new GetOrderQuery(request.OrderId), cancellationToken); var shipping = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(s => s.Id == request.ShippingId, cancellationToken); if (shipping == null) throw new AppException("Shipping not found", ApiResultStatusCode.NotFound); if (order.OrderDeliveries.Count > 0) { foreach (var orderDelivery in order.OrderDeliveries) { var newEnt = OrderDelivery.Create(request.AddressId, shipping.DeliveryCost, request.ShippingId, request.OrderId); newEnt.CreatedAt = orderDelivery.CreatedAt; newEnt.CreatedBy = orderDelivery.CreatedBy; newEnt.Id = orderDelivery.Id; _repositoryWrapper.SetRepository() .Update(newEnt); await _repositoryWrapper.SaveChangesAsync(cancellationToken); } order.OrderDeliveries.Clear(); } else order.AddOrderDelivery(request.AddressId, shipping.DeliveryCost, request.ShippingId, request.OrderId); _repositoryWrapper.SetRepository().Update(order); await _repositoryWrapper.SaveChangesAsync(cancellationToken); var calculatedOrder = await _mediator.Send(new CalculateOrderCommand(order.Id), cancellationToken); return calculatedOrder.AdaptToSDto(); } }