BetterCms.Module.Pages.Services.DefaultUrlService.AddPageUrlPostfix C# (CSharp) Method

AddPageUrlPostfix() public method

Adds the postfix to the specified URL.
public AddPageUrlPostfix ( string url, string prefixPattern, List unsavedUrls = null ) : string
url string The page URL.
prefixPattern string The prefix pattern.
unsavedUrls List The list of not saved yet urls.
return string
        public string AddPageUrlPostfix(string url, string prefixPattern, List<string> unsavedUrls = null)
        {
            url = (url ?? string.Empty).Trim();
            var endsWithSlash = url.EndsWith("/", StringComparison.Ordinal);
            url = url.Trim('/');
            
            prefixPattern = (prefixPattern ?? string.Empty).Trim('/');
            if (string.IsNullOrWhiteSpace(prefixPattern) || prefixPattern.IndexOf("{0}", StringComparison.OrdinalIgnoreCase) == -1)
            {
                prefixPattern = "{0}";
            }

            var fullUrl = FixUrl(string.Format(prefixPattern + "/", url).Trim('/'));

            // Check, if such record exists
            var exists = PathExistsInDb(fullUrl) 
                || (unsavedUrls != null && PathExistsInUnsavedList(fullUrl, unsavedUrls));

            if (exists)
            {
                // Load all titles
                var urlToReplace = string.Format("/" + prefixPattern + "-", url);
                var urlToSearch = string.Format("{0}%", urlToReplace);
                Page alias = null;

                var paths = unitOfWork.Session
                    .QueryOver(() => alias)
                    .Where(p => !p.IsDeleted)
                    .Where(Restrictions.InsensitiveLike(Projections.Property(() => alias.PageUrl), urlToSearch))
                    .Select(p => p.PageUrl)
                    .List<string>();

                if (unsavedUrls != null)
                {
                    unsavedUrls
                        .Where(u => u.StartsWith(urlToReplace))
                        .ToList()
                        .ForEach(paths.Add);
                }

                int maxNr = 0;
                var recheckInDb = false;
                foreach (var path in paths)
                {
                    int pathNr;
                    var intStr = path.Replace(urlToReplace, null).Split('-')[0].Trim('/');

                    if (int.TryParse(intStr, out pathNr))
                    {
                        if (pathNr > maxNr)
                        {
                            maxNr = pathNr;
                        }
                    }
                    else
                    {
                        recheckInDb = true;
                    }
                }

                if (maxNr == int.MaxValue)
                {
                    recheckInDb = true;
                }
                else
                {
                    maxNr++;
                }

                if (string.IsNullOrWhiteSpace(url))
                {
                    fullUrl = string.Format(prefixPattern, "-");
                    recheckInDb = true;
                }
                else
                {
                    fullUrl = string.Format(prefixPattern + "-{1}/", url, maxNr);
                }

                if (recheckInDb)
                {
                    return AddPageUrlPostfix(fullUrl, null);
                }
            }

            // Restore trailing slash behavior if needed.
            if (configuration.UrlMode == TrailingSlashBehaviorType.Mixed)
            {
                if (endsWithSlash)
                {
                    if (!fullUrl.Trim().EndsWith("/", StringComparison.Ordinal))
                    {
                        fullUrl = string.Concat(fullUrl, "/");
                    }
                }
                else
                {
                    if (fullUrl.Trim().EndsWith("/", StringComparison.Ordinal))
                    {
                        fullUrl = fullUrl.TrimEnd('/').Trim();
                    }
                }
            }
            return FixUrl(fullUrl);
        }