public async Task <Cart> Get(string userId)
        {
            IUserActor actor = GetActor(userId);

            Dictionary <Guid, int> products = await actor.GetCart();

            return(new Cart()
            {
                UserId = userId,
                Items = products.Select(
                    p => new CartItem {
                    ProductId = p.Key.ToString(), Quantity = p.Value
                }).ToArray()
            });
        }
        public async Task <CheckoutSummary> Checkout(string userId)
        {
            var result = new CheckoutSummary()
            {
                Date     = DateTime.UtcNow,
                Products = new List <CheckoutProduct>()
            };

            IUserActor actor = CreateUserActor(userId);
            var        cart  = await actor.GetCart();

            IProductCatalogService productCatalogService = GetProductCatalogService();
            var products = await productCatalogService.GetAllProducts();

            var totalCost = 0.0;

            foreach (var item in cart)
            {
                var productId = item.Key;
                var quantity  = item.Value;
                var product   = products.FirstOrDefault(p => p.Id == productId);
                if (product != null)
                {
                    result.Products.Add(new CheckoutProduct()
                    {
                        Product  = product,
                        Quantity = quantity,
                        Price    = product.Price * quantity
                    });
                    totalCost += (product.Price * quantity);
                }
            }
            result.TotalPrice = totalCost;

            //Clearing the cart since user has checkout all the products and add to history
            await actor.ClearCart();

            await AddToHistory(result);

            return(result);
        }
        public async Task <CartDto> GetCart([FromQuery] string userId)
        {
            try
            {
                CreateActor(userId);
                var cart = await _userActor.GetCart();

                return(new CartDto()
                {
                    UserId = userId,
                    Items = cart.Select(c => new CartItem()
                    {
                        ProductId = c.Key.ToString(),
                        Quantity = c.Value
                    }).ToArray()
                });
            }
            catch (Exception error)
            {
                throw error;
            }
        }