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.UserWallets) .ThenInclude(i => i.UserWalletChangeLogs) .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("مبلغ سفارش با مجموع سبد خرید مطابقت ندارد."); var userWallet = user.UserWallets.FirstOrDefault(); if (userWallet == null) throw new Exception("کیف پول کاربر یافت نشد."); if (userWallet.Balance<=0 || userWallet.Balance f.IsDefault).Id, TransactionId = newTransaction.Id }; await _context.UserOrders.AddAsync(newOrder, cancellationToken); await _context.SaveChangesAsync(cancellationToken); var factorDetailsList = user.UserCartss.Select(s => new FactorDetails() { ProductId = s.ProductId, Count = s.Count, UnitPrice = s.Product.Price, OrderId = newOrder.Id }); await _context.FactorDetailss.AddRangeAsync(factorDetailsList, cancellationToken); user.UserCartss.Clear(); await _context.SaveChangesAsync(cancellationToken); var finalResult = new SubmitShopBuyOrderResponseDto() { Id = newOrder.Id, }; return finalResult; } }