NotFoundPage(IUnitOfWork unitOfWork, ISiteContext siteContext)
        {
            var notFoundPage =
                this
                .PageVersionQuery(unitOfWork, siteContext)
                .Where(o => o.Page.Node.Type == "NotFoundErrorPage")
                .Select(o => o.Value)
                .FirstOrDefault();

            if (notFoundPage == null)
            {
                LogHelper.For(this).Warn("NotFoundErrorPage is not found");
            }

            var errorResult =
                new RetrievePageResult {
                StatusCode = HttpStatusCode.NotFound,
                Page       =
                    notFoundPage != null
                            ? JsonConvert
                    .DeserializeObject <PageModel>(notFoundPage)
                            : null
            };

            return(errorResult);
        }
Esempio n. 2
0
        private RetrievePageResult CreateResult(string pageJson, IUnitOfWork unitOfWork, ISiteContext siteContext, string url)
        {
            var result = new RetrievePageResult();

            if (pageJson == null)
            {
                return(this.NotFoundPage(unitOfWork, siteContext));
            }

            result.Page = JsonConvert.DeserializeObject <PageModel>(pageJson);
            if (result.Page.Type.EqualsIgnoreCase("UnhandledErrorPage"))
            {
                result.StatusCode = HttpStatusCode.InternalServerError;
            }

            if (this.contentModeProvider.BypassFilters)
            {
                return(result);
            }

            var parameter = new NavigationFilterParameter
            {
                SiteContext   = siteContext,
                Url           = url,
                Type          = NavigationFilterType.RetrievingPage,
                Page          = result.Page,
                SignInPageUrl = new Lazy <string>(() => GetSignInPageUrl(this, unitOfWork, siteContext))
            };

            var filterResult = this.navigationFilterService.ApplyFilters(result.Page.Type, parameter);

            if (filterResult == null)
            {
                return(result);
            }

            if (filterResult.StatusCode == HttpStatusCode.NotFound)
            {
                return(this.NotFoundPage(unitOfWork, siteContext));
            }

            result.Page       = null;
            result.StatusCode = filterResult.StatusCode;
            result.RedirectTo = filterResult.RedirectTo;

            return(result);
        }
        GetCatalogNodeId(
            IUnitOfWork unitOfWork,
            ISiteContext siteContext,
            string url,
            bool isSwitchingLanguage,
            out RetrievePageResult retrievePageResult
            )
        {
            var relativeUrlNoQuery =
                url.Contains("?")
                    ? url
                .Substring(
                    0,
                    url.IndexOf("?", StringComparison.Ordinal))
                    : url;
            var urlParts = relativeUrlNoQuery.Trim('/', ' ').Split('/');
            var result   =
                this
                .catalogService
                .GetCatalogPage(
                    new GetCatalogPageParameter(
                        relativeUrlNoQuery)
            {
                GetSubCategories = true
            });
            var activeLanguage = siteContext.LanguageDto.Id;

            retrievePageResult = null;

            if (
                result?.RedirectUrl != null && urlParts.Length > 0 // URL requested doesn't match the active language.
                )
            {
                if (isSwitchingLanguage)
                {
                    retrievePageResult =
                        new RetrievePageResult {
                        StatusCode = HttpStatusCode.Found,
                        RedirectTo = result.RedirectUrl
                    };
                    return(null);
                }
                else
                {
                    var languageIds =
                        this
                        .catalogPathFinder
                        .Value
                        .GetLanguageIdsForCatalogUrlPath(
                            siteContext.WebsiteDto.Id,
                            urlParts[0]);
                    if (
                        languageIds.Count != 0 &&
                        !languageIds.Contains(activeLanguage)
                        )
                    {
                        this
                        .siteContextService
                        .SetLanguage(languageIds.First());
                        retrievePageResult =
                            new RetrievePageResult {
                            StatusCode = HttpStatusCode.Found,
                            RedirectTo = url
                        };
                        return(null);
                    }
                }
            }

            if (result?.Product != null)
            {
                return(GetNodeIdByType(
                           unitOfWork,
                           siteContext,
                           "ProductDetailsPage"));
            }

            if (
                result?.Category != null &&
                result?.SubCategories != null &&
                result.SubCategories.Any()
                )
            {
                return(GetNodeIdByType(
                           unitOfWork,
                           siteContext,
                           "CategoryDetailsPage"));
            }

            // url with brand root and brand url segment is brand detail page
            if (
                urlParts.Length == 2 &&
                urlParts[0]
                .EqualsIgnoreCase(
                    this.catalogPathBuilder.GetBrandRootPath())
                )
            {
                return(GetNodeIdByType(
                           unitOfWork,
                           siteContext,
                           "BrandDetailsPage"));
            }

            var brandsLanguageIds =
                this
                .catalogPathFinder
                .Value
                .GetLanguageIdsForBrandPath(
                    siteContext.WebsiteDto.Id,
                    urlParts[0]);

            if (
                brandsLanguageIds.Count != 0 &&
                !brandsLanguageIds.Contains(activeLanguage)
                )
            {
                if (isSwitchingLanguage)
                {
                    retrievePageResult =
                        new RetrievePageResult {
                        StatusCode = HttpStatusCode.Found,
                        RedirectTo =
                            $"/{this
                                    .catalogPathBuilder
                                    .GetBrandRootPath()}/{string
                                    .Join("/", urlParts.Skip(1))}"
                    };
                    return(null);
                }
                else
                {
                    this
                    .siteContextService
                    .SetLanguage(brandsLanguageIds.First());
                    retrievePageResult =
                        new RetrievePageResult {
                        StatusCode = HttpStatusCode.Found,
                        RedirectTo = url
                    };
                    return(null);
                }
            }

            if (
                result?.ResultCode == ResultCode.Error &&
                result?.SubCode == SubCode.NotFound
                )
            {
                return(null);
            }

            if (
                result?.Category != null ||
                result?.Brand != null ||
                result?.ProductLine != null ||
                (urlParts.Length == 1 && urlParts[0].EqualsIgnoreCase("search"))
                )
            {
                return(GetNodeIdByType(
                           unitOfWork,
                           siteContext,
                           "ProductListPage"));
            }

            return(null);
        }