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);
}