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); var finalResult = new SubmitShopBuyOrderResponseDto() { Id = newOrder.Id, PaymentMethod = newOrder.PaymentMethod, PaymentStatus = newOrder.PaymentStatus, TotalAmount = newOrder.Amount, UserAddressText = user.UserAddresss.First(f => f.IsDefault).Address, PaymentDate = newOrder.PaymentDate, FactorDetails = factorDetailsList.Select(s => new SubmitShopBuyOrderFactorDetail() { Count = s.Count, UnitPrice = s.UnitPrice, ProductId = s.ProductId, ProductThumbnailPath = user.UserCartss.First(f => f.ProductId == s.ProductId).Product.ThumbnailPath, ProductTitle = user.UserCartss.First(f => f.ProductId == s.ProductId).Product.Title, UnitDiscountPrice = 0, }).ToList() }; user.UserCartss.Clear(); await _context.SaveChangesAsync(cancellationToken); return finalResult; } }