public virtual async Task LoadOrCreateNewTransientCartAsync(string cartName, Store store, User user, Language language, Currency currency, string type = null) { var cacheKey = CacheKey.With(GetType(), "LoadOrCreateNewTransientCart", store.Id, cartName, user.Id, currency.Code, type); var needReevaluate = false; Cart = await _memoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { needReevaluate = true; var cartSearchCriteria = CreateCartSearchCriteria(cartName, store, user, language, currency, type); var cartSearchResult = await _cartService.SearchCartsAsync(cartSearchCriteria); var cart = cartSearchResult.FirstOrDefault() ?? CreateCart(cartName, store, user, language, currency, type); //Load cart dependencies await PrepareCartAsync(cart, store); //Add expiration token for concrete cart instance cacheEntry.AddExpirationToken(CartCacheRegion.CreateChangeToken(cart)); return(cart); }); if (needReevaluate) { await EvaluatePromotionsAsync(); await EvaluateTaxesAsync(); } }
public virtual async Task LoadOrCreateNewTransientCartAsync(string cartName, Store store, User user, Language language, Currency currency) { var cacheKey = CacheKey.With(GetType(), store.Id, cartName, user.Id, currency.Code); var needReevaluate = false; Cart = await _memoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { needReevaluate = true; var cartSearchCriteria = CreateCartSearchCriteria(cartName, store, user, language, currency); var cartSearchResult = await _cartApi.SearchAsync(cartSearchCriteria); var cartDto = cartSearchResult.Results.FirstOrDefault(); var cart = cartDto?.ToShoppingCart(currency, language, user) ?? CreateCart(cartName, store, user, language, currency); //Load cart payment plan with have same id if (store.SubscriptionEnabled) { var productsIds = cart.Items.Select(x => x.ProductId).Distinct().ToArray(); var products = await _catalogService.GetProductsAsync(productsIds, ItemResponseGroup.ItemWithPrices | ItemResponseGroup.ItemWithDiscounts | ItemResponseGroup.Inventory); var paymentPlanIds = new[] { cart.Id }.Concat(cart.Items.Select(x => x.ProductId).Distinct()).ToArray(); var paymentPlans = await _subscriptionService.GetPaymentPlansByIdsAsync(paymentPlanIds); cart.PaymentPlan = paymentPlans.FirstOrDefault(x => x.Id == cart.Id); //Realize this code whith dictionary foreach (var lineItem in cart.Items) { lineItem.Product = products.FirstOrDefault(x => x.Id == lineItem.ProductId); lineItem.PaymentPlan = paymentPlans.FirstOrDefault(x => x.Id == lineItem.ProductId); } } cart.Customer = user; //Add expiration token for concrete cart instance cacheEntry.AddExpirationToken(CartCacheRegion.CreateChangeToken(cart)); return(cart); }); if (needReevaluate) { await EvaluatePromotionsAsync(); await EvaluateTaxesAsync(); } }