public ProductsController(ILogger <ProductsController> logger, IOptionsSnapshot <WingtipToysProductServiceOptions> options, GetProductCommand cmd1, GetProductsCommand cmd2,
                           [FromServices] IDistributedCache cache)
 {
     _logger             = logger;
     _options            = options;
     _cache              = cache;
     _getProductCommand  = cmd1;
     _getProductsCommand = cmd2;
 }
Ejemplo n.º 2
0
        public async Task <IActionResult> Get(int sku)
        {
            var command = new GetProductCommand
            {
                sku = sku
            };

            return(Ok(await _mediator.Send(command)));
        }
Ejemplo n.º 3
0
        public async Task ShouldGetProduct()
        {
            // Arrange
            var getProductCommand = new GetProductCommand(2, WorkContext.WorkingLanguageId);

            // Act
            var result = await _getProductQueryHandler.Handle(getProductCommand);

            // Assert
            Assert.IsNotNull(result?.Object);
        }
Ejemplo n.º 4
0
        public async Task <IQueryable <ProductQuery> > Handle(GetProductCommand request, CancellationToken cancellationToken)
        {
            #region Persistence

            var contragentsDomain = await _ProductRepository.Get(request.GraphFilters);

            var response = contragentsDomain.Select(item =>
                                                    item.ToQueryModel <ProductQuery>(_Mapper));

            #endregion

            return(response);
        }
Ejemplo n.º 5
0
        private async Task <IActionResult> CreateProduct(GetProductCommand command)
        {
            var productDtoResult = await QueryProcessor.GetQueryHandler <GetProductCommand, ProductDto>(command);

            if (productDtoResult.Failure)
            {
                return(BadRequest(productDtoResult.ErrorMessages));
            }

            var productDto = productDtoResult.Object;

            return(Ok(productDto));
        }
Ejemplo n.º 6
0
        public async Task <IEnumerable <Infrastructure.Database.Query.Model.Product> > GetProducts(
            Dictionary <string, GraphFilter> filters,
            [Service] IServiceProvider serviceProvider,
            CancellationToken cancellationToken)
        {
            var getProductCommand = new GetProductCommand
            {
                GraphFilters = filters
            };

            using (var scope = serviceProvider.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();
                return((await mediator.Send(getProductCommand, cancellationToken)).ToList());
            }
        }
Ejemplo n.º 7
0
        public ActionResult <ProductAvailabilityReadDto> GetProductFromWareHouse(GetProductCommand getProductCommand)
        {
            var productAvailabilityJson = _kubernetesClient.GetNamespacedCustomObject(
                ProductAvailabilityEntity.CrdGroup,
                ProductAvailabilityEntity.CrdApiVersion, Namespace,
                ProductAvailabilityEntity.CrdPluralName, getProductCommand.ProductId) as JObject;
            var productAvailability = productAvailabilityJson.ToObject <ProductAvailabilityEntity>();

            if (productAvailability.Spec.AvailableQuantity >= getProductCommand.Quantity)
            {
                var x = new ProductAvailabilityEntity
                {
                    ApiVersion = ProductAvailabilityEntity.CrdGroup + "/" + ProductAvailabilityEntity.CrdApiVersion,
                    Kind       = ProductAvailabilityEntity.CrdKind,
                    Metadata   =
                    {
                        Name            = getProductCommand.ProductId,
                        ResourceVersion = productAvailability.Metadata.ResourceVersion
                    },
                    Spec =
                    {
                        LastUpdateTimeStamp = DateTime.UtcNow,
                        AvailableQuantity   = productAvailability.Spec.AvailableQuantity - getProductCommand.Quantity
                    }
                };
                var body = JObject.FromObject(x, _camelCaseSerializer);

                productAvailabilityJson = _kubernetesClient.ReplaceNamespacedCustomObject(body, ProductAvailabilityEntity.CrdGroup, ProductAvailabilityEntity.CrdApiVersion
                                                                                          , Namespace, ProductAvailabilityEntity.CrdPluralName, getProductCommand.ProductId) as JObject;
                productAvailability = productAvailabilityJson.ToObject <ProductAvailabilityEntity>();

                return(new ProductAvailabilityReadDto
                {
                    AvailableQuantity = productAvailability.Spec.AvailableQuantity,
                    Id = productAvailability.Metadata.Name
                });
            }

            return(BadRequest(new
            {
                Error =
                    $"There are only {productAvailability.Spec.AvailableQuantity} items for product {getProductCommand.ProductId}, {getProductCommand.Quantity} items cannot be requested"
            }));
        }
Ejemplo n.º 8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="name"></param>
        /// <param name="cart"></param>
        /// <param name="getProductCommand"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        internal static decimal GetCartShippingRate(string name, Cart cart, GetProductCommand getProductCommand, CommercePipelineExecutionContext context)
        {
            var rates = GetCartShippingRates(cart, getProductCommand, context.GetPolicy <FedExClientPolicy>(), context.CommerceContext);

            if (rates == null || !rates.Any())
            {
                return(0m);
            }
            try
            {
                return(rates.FirstOrDefault(x => x.Key == name.ToLower()).Value);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return(0m);
        }
Ejemplo n.º 9
0
        public async Task <ActionResult> GetProduct(int id)
        {
            if (id < 0)
            {
                return(new BadRequestObjectResult("Invalid variable"));
            }

            var command = new GetProductCommand(id);

            var result = await this._mediator.Send(command);

            if (result.Status == CommandResultStatus.Success)
            {
                return(new OkObjectResult(result.Result));
            }

            else
            {
                return(new BadRequestObjectResult("Something went wrong"));
            }
        }
Ejemplo n.º 10
0
        public async Task <IActionResult> GetProductById([FromQuery(Name = "productId")] string productId)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(productId))
                {
                    throw new Exception("Product Id is not valid");
                }

                var client = _bus.CreateRequestClient <IGetProductCommand, IProductRetrievedEvent>(_serviceAddress,
                                                                                                   TimeSpan.FromSeconds(20));
                var getCompanyCommand = new GetProductCommand(productId);
                var response          = await client.Request(getCompanyCommand);

                return(Ok(response?.ProductDto));
            }
            catch (Exception e)
            {
                return(BadRequest($"Can't get the product: {e.Message}"));
            }
        }
Ejemplo n.º 11
0
        public async Task <Result <ProductDto> > Handle(GetProductCommand request, CancellationToken cancellationToken)
        {
            var cacheKey = $"Product-{request.Id}";
            var cache    = await _cacheService.GetStringAsync(cacheKey);

            ProductDto product;

            if (cache.TryGetValue <Product>(out var cachedProduct))
            {
                product = _mapper.Map <ProductDto>(cachedProduct);

                return(Result <ProductDto> .Success(product));
            }

            var productInDb = await _productRepository.GetAsync(p => p.Id == request.Id);

            productInDb.CheckForNull();
            await _cacheService.SetCacheAsync(cacheKey, productInDb, _productSettings);

            product = _mapper.Map <ProductDto>(productInDb);

            return(Result <ProductDto> .Success(product));
        }
Ejemplo n.º 12
0
        public void Must_return_product()
        {
            // Arrange

            CreateProduct();
            var product = CreateProduct(); // тестируемый продукт

            CreateProduct();
            Db.SaveChanges();

            // Act

            var cmd    = new GetProductCommand(Db);
            var result = cmd.Execute(product.Id);

            // Assert

            AssertSuccess(result);
            Assert.AreEqual(product.Id, result.Value.Id, "Возвратился продукт с неверным Id");
            Assert.IsNotNull(result.Value.Category, "Продукт вернулся без категории");
            Assert.AreEqual(product.Name, result.Value.Name, "Неверное имя продукта");
            Assert.IsNotNull(result.Value.Params, "Продукт вернулся без параметров");
            Assert.AreEqual(product.Params.Count, result.Value.Params.Count, "Проукт вернулся с неверным числом параметров");
        }
Ejemplo n.º 13
0
        public async Task <IActionResult> Create(string url)
        {
            url = url?.TrimStart('/') ?? "";
            var urlPath = url.Split('?').First();

            if (Regex.IsMatch(urlPath.Split('/').Last(), @"^\d+$"))
            {
                urlPath = urlPath.Substring(0, urlPath.LastIndexOf("/"));
            }

            var routeDtoResult = await QueryProcessor.GetQueryHandler <GetRouteByUrlCommand, RouteDto>(new GetRouteByUrlCommand(urlPath, WorkContext.WorkingLanguageId));

            if (routeDtoResult.Failure)
            {
                return(BadRequest(routeDtoResult.ErrorMessages));
            }

            var currentRouteDto = routeDtoResult.Object;

            if (currentRouteDto == null)
            {
                // TODO: 404
                return(NotFound());
            }

            if (currentRouteDto.AngularComponent != AngularComponents.ProductComponent)
            {
                var getCategoryCommand = new GetCategoryCommand(currentRouteDto.ItemId.Value, WorkContext.WorkingLanguageId);
                return(await CreateCategory(getCategoryCommand));
            }
            else
            {
                var getProductCommand = new GetProductCommand(currentRouteDto.ItemId.Value, WorkContext.WorkingLanguageId);
                return(await CreateProduct(getProductCommand));
            }
        }
Ejemplo n.º 14
0
        internal static List <KeyValuePair <string, decimal> > GetCartShippingRates(Cart cart,
                                                                                    GetProductCommand getProductCommand, FedExClientPolicy fedExClientPolicy, CommerceContext commerceContext)
        {
            var input = new FedexReqestInput();

            FedExClientPolicy = fedExClientPolicy;
            if (cart != null && cart.Lines.Any <CartLineComponent>() && cart.HasComponent <PhysicalFulfillmentComponent>())
            {
                var component = cart.GetComponent <PhysicalFulfillmentComponent>();

                var shippingParty = component?.ShippingParty;

                input.AddressLine1  = shippingParty.Address1;
                input.AddressLine2  = shippingParty.Address2;
                input.City          = shippingParty.City;
                input.CountryCode   = shippingParty.CountryCode;
                input.StateCode     = shippingParty.StateCode;
                input.ZipPostalCode = shippingParty.ZipPostalCode;

                input.PriceValue = cart.Totals.SubTotal.Amount;

                decimal height = 0.0M;
                decimal width  = 0.0M;
                decimal length = 0.0m;
                decimal weight = 0.0m;

                foreach (var cartLineComponent in cart.Lines)
                {
                    // get specific weight value
                    var productArgument = ProductArgument.FromItemId(cartLineComponent.ItemId);
                    if (!productArgument.IsValid())
                    {
                        continue;
                    }

                    var product = getProductCommand.Process(commerceContext, productArgument.CatalogName, productArgument.ProductId).Result;

                    decimal val = 0m;
                    if (product != null)
                    {
                        if (product.HasProperty(FedExClientPolicy.WeightFieldName) && product[FedExClientPolicy.WeightFieldName].ToString().Trim() != "")
                        {
                            val = GetFirstDecimalFromString(product[FedExClientPolicy.WeightFieldName].ToString());
                        }
                        else
                        {
                            val = GetFirstDecimalFromString(FedExClientPolicy.Weight);
                        }

                        if (val > 0)
                        {
                            weight += val;
                        }

                        val = product.HasProperty(FedExClientPolicy.HeightFieldName) && product[FedExClientPolicy.HeightFieldName].ToString().Trim() != ""
                            ? GetFirstDecimalFromString(product[FedExClientPolicy.HeightFieldName].ToString())
                            : GetFirstDecimalFromString(FedExClientPolicy.Height);

                        if (val > 0)
                        {
                            height += val;
                        }

                        val = product.HasProperty(FedExClientPolicy.WidthFieldName) && product[FedExClientPolicy.WidthFieldName].ToString().Trim() != ""
                            ? GetFirstDecimalFromString(product[FedExClientPolicy.WidthFieldName].ToString())
                            : GetFirstDecimalFromString(FedExClientPolicy.Width);

                        if (val > 0 && val > width)
                        {
                            width = val;
                        }

                        val = product.HasProperty(FedExClientPolicy.LengthFieldName) && product[FedExClientPolicy.LengthFieldName].ToString().Trim() != ""
                            ? GetFirstDecimalFromString(product[FedExClientPolicy.LengthFieldName].ToString())
                            : GetFirstDecimalFromString(FedExClientPolicy.Length);

                        if (val > 0 && val > length)
                        {
                            length = val;
                        }
                    }
                }

                input.Height = Math.Ceiling(height).ToString(CultureInfo.CurrentCulture);
                input.Width  = Math.Ceiling(width).ToString(CultureInfo.CurrentCulture);
                input.Length = Math.Ceiling(length).ToString(CultureInfo.CurrentCulture);
                input.Weight = Math.Ceiling(weight);
            }

            var rates = new List <KeyValuePair <string, decimal> >();

            if (input.CountryCode.ToLower() == "us")
            {
                rates = FedxUs.GetShippingRates(input, FedExClientPolicy);
            }
            else
            {
                rates = FedExInternational.GetShippingRates(input, FedExClientPolicy);
            }


            return(rates);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="getProductCommand"></param>
 public UpdateCartLinesFulfillmentChargeBlock(GetProductCommand getProductCommand)
 {
     _getProductCommand = getProductCommand;
 }