コード例 #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 RemoveCartAsync()
 {
     EnsureCartExists();
     //Evict cart from cache
     CartCacheRegion.ExpireCart(Cart);
     await _cartService.DeleteCartByIdAsync(Cart.Id);
 }
コード例 #3
0
        public virtual async Task SaveAsync()
        {
            EnsureCartExists();

            await EvaluatePromotionsAsync();
            await EvaluateTaxesAsync();

            var cartDto = Cart.ToShoppingCartDto();

            if (string.IsNullOrEmpty(cartDto.Id))
            {
                cartDto = await _cartApi.CreateAsync(cartDto);
            }
            else
            {
                await _cartApi.UpdateAsync(cartDto);
            }

            //Evict cart from cache
            CartCacheRegion.ExpireCart(Cart);

            cartDto = await _cartApi.GetCartByIdAsync(cartDto.Id);

            var cart = cartDto.ToShoppingCart(Cart.Currency, Cart.Language, Cart.Customer);

            await TakeCartAsync(cart);
        }
コード例 #4
0
        public virtual async Task RemoveCartAsync()
        {
            EnsureCartExists();
            //Evict cart from cache
            CartCacheRegion.ExpireCart(Cart);

            await _cartApi.DeleteCartsAsync(new List <string> {
                Cart.Id
            });
        }
コード例 #5
0
        public virtual async Task SaveAsync()
        {
            EnsureCartExists();

            await EvaluatePromotionsAsync();
            await EvaluateTaxesAsync();

            var cart = await _cartService.SaveChanges(Cart);
            //Evict cart from cache
            CartCacheRegion.ExpireCart(Cart);

            await TakeCartAsync(cart);
        }
コード例 #6
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();
            }
        }