public override async Task <Basket> Query(CreateOrGetUnconfirmedBasketCommand command)
        {
            var user = await _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User);

            if (user == null)
            {
                return(null);
            }

            var basket = await DbContext.Baskets
                         .Include(o => o.BasketItems)
                         .Where(o => o.UserId == user.Id && !o.IsConfirmed)
                         .FirstOrDefaultAsync();

            if (basket == null)
            {
                basket = new Basket()
                {
                    UserId = user.Id
                };
                DbContext.AddOrUpdate(basket);
                await DbContext.SaveChangesAsync();
            }
            else if (basket.BasketItems.Any(o => !o.ProductId.HasValue))
            {
                foreach (var basketItem in basket.BasketItems.Where(o => !o.ProductId.HasValue))
                {
                    DbContext.ActionByEntityState(basketItem, EntityState.Deleted);
                }

                await DbContext.SaveChangesAsync();
            }

            return(basket);
        }
        public override async Task <Category> Query(DeleteCategoryCommand command)
        {
            var category = await DbContext.Categories.Include(o => o.Route).FirstOrDefaultAsync(o => o.Id == command.CategoryId);

            if (category == null)
            {
                return(null);
            }

            DbContext.ActionByEntityState(category.Route, EntityState.Deleted);
            await DbContext.SaveChangesAsync();

            var routes = await _listRoutesQuery.Query(new ListRoutesCommand());

            foreach (var route in routes.Where(o => o.Category == null && o.Product == null))
            {
                DbContext.ActionByEntityState(route, EntityState.Deleted);
            }
            await DbContext.SaveChangesAsync();

            _cache.ClearRegion(CacheRegions.Category);
            _cache.ClearRegion(CacheRegions.Product);

            return(category);
        }
        public override async Task <Product> Query(DeleteProductCommand command)
        {
            var product = await DbContext.Products.Include(o => o.Route).FirstOrDefaultAsync(o => o.Id == command.ProductId);

            if (product == null)
            {
                return(null);
            }

            DbContext.ActionByEntityState(product.Route, EntityState.Deleted);
            await DbContext.SaveChangesAsync();

            _cache.ClearRegion(CacheRegions.Product);

            return(product);
        }
        public override async Task <BasketItem> Query(DeleteBasketItemCommand command)
        {
            var basket = await _createOrGetUnconfirmedBasketQuery.Query(new CreateOrGetUnconfirmedBasketCommand());

            if (basket == null)
            {
                return(null);
            }

            var basketItem = basket.BasketItems.FirstOrDefault(o => o.Id == command.BasketItemId);

            if (basketItem != null)
            {
                DbContext.ActionByEntityState(basketItem, EntityState.Deleted);
                await DbContext.SaveChangesAsync();
            }

            return(basketItem);
        }