using CMSMicroservice.Domain.Enums; using CMSMicroservice.Domain.Events; namespace CMSMicroservice.Application.UserOrderCQ.Commands.SubmitShopBuyOrder; public class SubmitShopBuyOrderCommandHandler : IRequestHandler { private readonly IApplicationDbContext _context; public SubmitShopBuyOrderCommandHandler(IApplicationDbContext context) { _context = context; } public async Task Handle(SubmitShopBuyOrderCommand request, CancellationToken cancellationToken) { var user = await _context.Users .Include(i => i.UserAddresss) .Include(i => i.UserCartss) .ThenInclude(i => i.Product) .FirstOrDefaultAsync(w => w.Id == request.UserId, cancellationToken: cancellationToken); if (user.UserCartss.Count == 0) throw new NotFoundException("UserCart", request.UserId); if (user.UserCartss.Sum(s => s.Count * s.Product.Price) != request.TotalAmount) throw new Exception("مبلغ سفارش با مجموع سبد خرید مطابقت ندارد."); await _context.UserOrders.AddAsync(new UserOrder() { Price = request.TotalAmount, PaymentStatus = PaymentStatus.Success, PaymentMethod = PaymentMethod.Wallet, PaymentDate =DateTime.Now, UserId = request.UserId, UserAddressId = user.UserAddresss.First(f=>f.IsDefault).Id }, cancellationToken); await _context.FactorDetailss.AddRangeAsync(user.UserCartss.Select(s => new FactorDetails() { ProductId = s.ProductId, Count = s.Count, UnitPrice = s.Product.Price, }), cancellationToken); return new SubmitShopBuyOrderResponseDto(); } }