示例#1
0
        public ActionResult GetProduct(int id, string format = "json", string instanceId = null)
        {
            var locator = new ProductLocator()
            {
                QueryFormat = format, InstanceId = instanceId
            };

            ApplyOptions(locator);

            var data = DpcService.GetProductData(locator, id);

            if (data == null)
            {
                _logger.Error()
                .Message("Product {productId} is not found", id)
                .Property("locator", locator)
                .Write();

                return(BadRequest($"Product {id} is not found"));
            }

            ControllerContext.HttpContext.Response.Headers.Add("Last-Modified", data.Updated.ToUniversalTime().ToString("R"));
            return((locator.Format == "json")
                ? Content(data.Product, JsonHeader)
                : Content(data.Product, XmlHeader));
        }
示例#2
0
        public ActionResult GetProductIds(
            DateTime?filterDate = null,
            string format       = "json",
            string instanceId   = null,
            int page            = 0,
            int pageSize        = Int32.MaxValue
            )
        {
            var locator = new ProductLocator()
            {
                QueryFormat = format, InstanceId = instanceId
            };

            ApplyOptions(locator);

            var ints = (filterDate == null)
                ? DpcService.GetAllProductId(locator, page, pageSize)
                : DpcService.GetLastProductId(locator, page, pageSize, filterDate.Value);

            if (locator.Format == "json")
            {
                return(Json(ints));
            }

            var ints2 = String.Join("", ints.Select(n => $"<id>{n}</id>").ToList());

            return(Content($"<ids>{ints2}</ids>", XmlHeader));
        }
示例#3
0
        public ActionResult GetProductVersion(int id, DateTime filterDate, string format = "json", string instanceId = null)
        {
            var locator = new ProductLocator()
            {
                QueryFormat = format, InstanceId = instanceId
            };

            ApplyOptions(locator);
            var data = DpcService.GetProductVersionData(locator, id, filterDate);

            if (data == null)
            {
                _logger.Error()
                .Message("Product version {versionId} is not found", id)
                .Property("locator", locator)
                .Write();

                return(BadRequest($"Product version {id} is not found"));
            }


            return((locator.Format == "json")
                ? Content(data.Product, JsonHeader)
                : Content(data.Product, XmlHeader));
        }
示例#4
0
        public ActionResult DeleteProduct([FromBody] string data, string format = "json", string instanceId = null)
        {
            var locator = new ProductLocator()
            {
                QueryFormat = format, InstanceId = instanceId
            };

            ApplyOptions(locator);

            if (!ValidateInstanceInternal(locator.InstanceId, Options.InstanceId))
            {
                return(InstanceError(locator.InstanceId, Options.InstanceId));
            }

            // ReSharper disable once InconsistentlySynchronizedField
            var res1 = ProductService.Parse(locator, data);

            if (res1.IsSucceeded && res1.Result?.Products != null)
            {
                _logger.Info("Message parsed, deleting products... ");

                try
                {
                    foreach (var p in res1.Result.Products)
                    {
                        _logger.Info()
                        .Message("Deleting product {productId}...", p.Id)
                        .Property("locator", locator)
                        .Write();

                        var res2 = ProductService.DeleteProduct(locator, p.Id, data);
                        if (!res2.IsSucceeded)
                        {
                            throw new ProductException(
                                      "Error while deleting product", res2.Error.Message, p.Id, locator
                                      );
                        }

                        _logger.Info()
                        .Message("Product {productId} successfully deleted", p.Id)
                        .Property("locator", locator)
                        .Write();
                    }
                }
                catch (ProductException pex)
                {
                    return(ProcessProductException(pex));
                }
                catch (Exception e)
                {
                    _logger.Error().Exception(e).Write();
                    return(BadRequest(e.Message));
                }

                return(Ok());
            }

            return(ProceedParseError(data, res1));
        }
示例#5
0
 public void FillProduct(ProductLocator locator, Product product)
 {
     product.Format   = locator.Format;
     product.IsLive   = locator.IsLive;
     product.Language = locator.Language;
     product.Slug     = !string.IsNullOrEmpty(locator.Slug) ? locator.Slug : null;
     product.Version  = locator.Version;
 }
示例#6
0
        public bool ValidateInstance(string format = "json", string instanceId = null)
        {
            var locator = new ProductLocator()
            {
                QueryFormat = format, InstanceId = instanceId
            };

            ApplyOptions(locator);
            return(ValidateInstanceInternal(locator.InstanceId, Options.InstanceId));
        }
示例#7
0
        public Product GetProduct(ProductLocator locator, int id)
        {
            var p = GetProducts(locator).FirstOrDefault(m => id == m.DpcId);

            if (p != null)
            {
                p.ProductRegions = GetProductRegions(p).ToList();
            }
            return(p);
        }
示例#8
0
        public IQueryable <Product> GetProducts(ProductLocator locator)
        {
            var products = Products.Where(m =>
                                          m.IsLive == locator.IsLive &&
                                          m.Language == locator.Language &&
                                          m.Format == locator.Format &&
                                          m.Version == locator.Version
                                          );

            return((string.IsNullOrEmpty(locator.Slug))
                ? products.Where(m => String.IsNullOrEmpty(m.Slug))
                : products.Where(m => m.Slug == locator.Slug));
        }
示例#9
0
        public static void Initialize(TestContext context)
        {
            var config = new TestConfig
            {
                ResetHttpContext = true
            };

            var ProductLocator        = new BaseIntegrationTest <ProductLocator, ProductLocatorResponse>(config);
            var ProductLocatorRequest = RequestBuilder.GetProductLocatorRequest();

            _result = (Response <ProductLocatorResponse>)ProductLocator.TestObject.Execute(ProductLocatorRequest);

            _testObject = ProductLocator.TestObject;
        }
示例#10
0
        public IQueryable <ProductVersion> GetProductVersions(ProductLocator locator, DateTime date)
        {
            var productVersions = ProductVersions.Where(m =>
                                                        m.IsLive == locator.IsLive &&
                                                        m.Language == locator.Language &&
                                                        m.Format == locator.Format &&
                                                        m.Version == locator.Version &&
                                                        m.Modification <= date
                                                        );

            return((string.IsNullOrEmpty(locator.Slug))
                ? productVersions.Where(m => String.IsNullOrEmpty(m.Slug))
                : productVersions.Where(m => m.Slug == locator.Slug));
        }
示例#11
0
        public ProductVersion GetProductVersion(ProductLocator locator, int id, DateTime date)
        {
            var productVersion = GetProductVersions(locator, date).OrderByDescending(m => m.Id).FirstOrDefault(m => id == m.DpcId);

            if (productVersion == null)
            {
                return(null);
            }
            if (productVersion.Deleted)
            {
                return(null);
            }
            else
            {
                return(productVersion);
            }
        }
示例#12
0
        private void ApplyOptions(ProductLocator locator)
        {
            locator.UseProductVersions = Options.UseProductVersions;

            var    language     = ControllerContext.RouteData.Values["language"];
            var    state        = ControllerContext.RouteData.Values["state"];
            string customerCode = ControllerContext.RouteData.Values.ContainsKey("customerCode")
                ? ControllerContext.RouteData.Values["customerCode"].ToString()
                : HttpContext.Request.Query["customerCode"].FirstOrDefault();

            locator.HeaderFormat = GetHeaderFormat(HttpContext.Request.ContentType);

            if (state != null)
            {
                locator.State = state.ToString();
            }

            if (language != null)
            {
                locator.Language = language.ToString();
            }

            var fixedConnectionString = Options.FixedConnectionString;

            if (String.IsNullOrEmpty(fixedConnectionString))
            {
                if (customerCode != null && customerCode != SingleCustomerCoreProvider.Key)
                {
                    locator.CustomerCode  = customerCode;
                    fixedConnectionString = DBConnector.GetConnectionString(customerCode);
                }
            }

            if (String.IsNullOrEmpty(fixedConnectionString))
            {
                throw new Exception("Customer code or connection string is not defined");
            }
        }
示例#13
0
        public ActionResult PutProduct([FromBody] string data,
                                       [FromQuery(Name = "UserId")] int userId, [FromQuery(Name = "UserName")] string userName,
                                       string format = "json", string instanceId = null
                                       )
        {
            var locator = new ProductLocator {
                QueryFormat = format, InstanceId = instanceId
            };

            if (!ValidateInstanceInternal(locator.InstanceId, Options.InstanceId))
            {
                return(InstanceError(locator.InstanceId, Options.InstanceId));
            }

            ApplyOptions(locator);

            // ReSharper disable once InconsistentlySynchronizedField
            var res1 = ProductService.Parse(locator, data);

            if (res1.IsSucceeded && res1.Result?.Products?.Any() == true)
            {
                _logger.Info("Message parsed, creating or updating products...  ");

                try
                {
                    foreach (var p in res1.Result.Products)
                    {
                        _logger.Info()
                        .Message("Check for creating or updating product {productId}", p.Id)
                        .Property("locator", locator)
                        .Write();


                        // ReSharper disable once InconsistentlySynchronizedField
                        var res2 = ProductService.HasProductChanged(locator, p.Id, data);
                        if (!res2.IsSucceeded)
                        {
                            throw new ProductException(
                                      "Error while checking product", res2.Error.Message, p.Id, locator
                                      );
                        }

                        if (!res2.Result)
                        {
                            _logger.Info()
                            .Message("Product {productId} doesn't require updating", p.Id)
                            .Property("locator", locator)
                            .Write();
                        }
                        else
                        {
                            _logger.Info()
                            .Message("Creating or updating product {productId}", p.Id)
                            .Property("locator", locator)
                            .Write();

                            var res3 = ProductService.UpdateProduct(locator, p, data, userName, userId);
                            if (!res3.IsSucceeded)
                            {
                                throw new ProductException(
                                          "Error while creating/updating product", res3.Error.Message, p.Id, locator
                                          );
                            }

                            _logger.Info()
                            .Message("Product {productId} successfully created/updated", p.Id)
                            .Property("locator", locator)
                            .Write();
                        }
                    }
                }
                catch (ProductException pex)
                {
                    return(ProcessProductException(pex));
                }
                catch (Exception e)
                {
                    _logger.Error().Exception(e).Write();
                    return(BadRequest(e.Message));
                }
                return(Ok());
            }

            return(ProceedParseError(data, res1));
        }
示例#14
0
 public ProductException(string message, string result, int productId, ProductLocator locator) : base(message)
 {
     ProductId = productId;
     Result    = result;
     Locator   = locator;
 }