using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.Routing;
///
/// Used to determine the node to display when content is not found based on the configured error404 elements in
/// umbracoSettings.config
///
internal class NotFoundHandlerHelper
{
internal static int? GetCurrentNotFoundPageId(
ContentErrorPage[] error404Collection,
IEntityService entityService,
IPublishedContentQuery publishedContentQuery,
string? errorCulture,
int? domainContentId)
{
if (error404Collection.Length > 1)
{
// test if a 404 page exists with current culture thread
ContentErrorPage? cultureErr =
error404Collection.FirstOrDefault(x => x.Culture.InvariantEquals(errorCulture))
?? error404Collection.FirstOrDefault(x => x.Culture == "default"); // there should be a default one!
if (cultureErr != null)
{
return GetContentIdFromErrorPageConfig(cultureErr, entityService, publishedContentQuery, domainContentId);
}
}
else if (error404Collection.Length == 1)
{
return GetContentIdFromErrorPageConfig(error404Collection.First(), entityService, publishedContentQuery, domainContentId);
}
return null;
}
///
/// Returns the content id based on the configured ContentErrorPage section.
///
internal static int? GetContentIdFromErrorPageConfig(
ContentErrorPage errorPage,
IEntityService entityService,
IPublishedContentQuery publishedContentQuery,
int? domainContentId)
{
if (errorPage.HasContentId)
{
return errorPage.ContentId;
}
if (errorPage.HasContentKey)
{
// need to get the Id for the GUID
// TODO: When we start storing GUIDs into the IPublishedContent, then we won't have to look this up
// but until then we need to look it up in the db. For now we've implemented a cached service for
// converting Int -> Guid and vice versa.
Attempt found = entityService.GetId(errorPage.ContentKey, UmbracoObjectTypes.Document);
if (found.Success)
{
return found.Result;
}
return null;
}
return null;
}
}