diff --git a/src/UmbNav.Core/Models/UmbNavItem.cs b/src/UmbNav.Core/Models/UmbNavItem.cs index 5c4e7f3..2d71e89 100644 --- a/src/UmbNav.Core/Models/UmbNavItem.cs +++ b/src/UmbNav.Core/Models/UmbNavItem.cs @@ -9,6 +9,9 @@ namespace UmbNav.Core.Models { public class UmbNavItem { + [JsonProperty("url")] + public string Url { get; set; } + [JsonProperty("udi")] public GuidUdi Udi { get; set; } @@ -63,9 +66,6 @@ public class UmbNavItem [JsonProperty("hideLoggedOut")] internal bool HideLoggedOut { get; set; } - [JsonProperty("url")] - internal string Url { get; set; } - [JsonProperty("includeChildNodes")] internal bool IncludeChildNodes { get; set; } diff --git a/src/UmbNav.Core/ValueConverters/UmbNavValueConverter.cs b/src/UmbNav.Core/ValueConverters/UmbNavValueConverter.cs index 8f372c2..2efc896 100644 --- a/src/UmbNav.Core/ValueConverters/UmbNavValueConverter.cs +++ b/src/UmbNav.Core/ValueConverters/UmbNavValueConverter.cs @@ -1,18 +1,139 @@ -using System; +using Newtonsoft.Json; +using Serilog; +using System; using System.Collections.Generic; using System.Linq; -using Newtonsoft.Json; using UmbNav.Core.Interfaces; using UmbNav.Core.Models; using UmbNav.Core.PropertyEditors; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.PropertyEditors; -using Serilog; namespace UmbNav.Core.ValueConverters { +#if NET8_0_OR_GREATER +#nullable enable + + using Umbraco.Cms.Core.DeliveryApi; + using Umbraco.Cms.Core.PropertyEditors.DeliveryApi; + using Umbraco.Cms.Core.PublishedCache; + + public class CustomUmbNavValueConverter : PropertyValueConverterBase, IDeliveryApiPropertyValueConverter + { + private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; + private readonly IApiContentRouteBuilder _apiContentRouteBuilder; + private readonly ILogger _logger; + private readonly IUmbNavMenuBuilderService _umbNavMenuBuilderService; + + public CustomUmbNavValueConverter( + IPublishedSnapshotAccessor publishedSnapshotAccessor, + IApiContentRouteBuilder apiContentRouteBuilder, + ILogger logger, + IUmbNavMenuBuilderService umbNavMenuBuilderService) + { + _publishedSnapshotAccessor = publishedSnapshotAccessor; + _apiContentRouteBuilder = apiContentRouteBuilder; + _logger = logger; + _umbNavMenuBuilderService = umbNavMenuBuilderService; + } + + public override bool IsConverter(IPublishedPropertyType propertyType) + => propertyType.EditorAlias.Equals("AaronSadler.UmbNav"); + + public override Type GetPropertyValueType(IPublishedPropertyType propertyType) + => typeof(IEnumerable); + + public PropertyCacheLevel GetDeliveryApiPropertyCacheLevel(IPublishedPropertyType propertyType) + => PropertyCacheLevel.Elements; + + public PropertyCacheLevel GetDeliveryApiPropertyCacheLevelForExpansion(IPublishedPropertyType propertyType) + => PropertyCacheLevel.Snapshot; + + public Type GetDeliveryApiPropertyValueType(IPublishedPropertyType propertyType) + => typeof(IEnumerable); + + public override object? ConvertIntermediateToObject( + IPublishedElement owner, + IPublishedPropertyType propertyType, + PropertyCacheLevel referenceCacheLevel, + object? inter, + bool preview) + { + if (inter is null) + { + _logger.Warning("No intermediate value found for property {PropertyAlias}.", propertyType.Alias); + return Enumerable.Empty(); + } + + try + { + var items = JsonConvert.DeserializeObject>(inter.ToString() ?? string.Empty); + if (items == null) + { + _logger.Warning("Failed to deserialize UmbNav items for property {PropertyAlias}.", propertyType.Alias); + return Enumerable.Empty(); + } + + // Build the menu using the UmbNavMenuBuilderService + var configuration = propertyType.DataType.ConfigurationAs(); + if (configuration != null) + { + return _umbNavMenuBuilderService.BuildMenu( + items, + 0, + configuration.RemoveNaviHideItems, + configuration.HideNoopener, + configuration.HideNoreferrer, + configuration.HideIncludeChildren, + configuration.AllowMenuItemDescriptions); + } + + return items; + } + catch (Exception ex) + { + _logger.Error(ex, "Error converting UmbNav intermediate value for property {PropertyAlias}.", propertyType.Alias); + return Enumerable.Empty(); + } + } + + public object? ConvertIntermediateToDeliveryApiObject( + IPublishedElement owner, + IPublishedPropertyType propertyType, + PropertyCacheLevel referenceCacheLevel, + object? inter, + bool preview, + bool expanding) + { + if (inter is null) + { + _logger.Warning("No intermediate value found for Delivery API conversion on property {PropertyAlias}.", propertyType.Alias); + return null; + } + + try + { + var items = JsonConvert.DeserializeObject>(inter.ToString() ?? string.Empty); + if (items == null) + { + _logger.Warning("Failed to deserialize UmbNav items for Delivery API on property {PropertyAlias}.", propertyType.Alias); + return null; + } + + return items; + } + catch (Exception ex) + { + _logger.Error(ex, "Error converting UmbNav intermediate value for Delivery API on property {PropertyAlias}.", propertyType.Alias); + return null; + } + } + } + #else public class UmbNavValueConverter : PropertyValueConverterBase { + + private readonly IUmbNavMenuBuilderService _umbNavMenuBuilderService; private readonly ILogger _logger; @@ -67,4 +188,5 @@ public override object ConvertIntermediateToObject(IPublishedElement owner, IPub return Enumerable.Empty(); } } + #endif } \ No newline at end of file