示例#1
0
        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();
            }
        }
示例#2
0
        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();
            }
        }