using Examine; using System; using System.Text; using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Web; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Extensions; using static Umbraco.Cms.Core.Constants; namespace Website.Core.Components { public class ExamineComponent : IComponent { private readonly IUmbracoContextFactory _umbracoContextFactory; private readonly IExamineManager _examineManager; private readonly ILogger _logger; public ExamineComponent(IUmbracoContextFactory umbracoContextFactory, IExamineManager examineManager, ILogger logger) { _umbracoContextFactory = umbracoContextFactory; _examineManager = examineManager ?? throw new ArgumentNullException(nameof(examineManager)); _logger = logger; } public void Initialize() { try { if (!_examineManager.TryGetIndex(UmbracoIndexes.ExternalIndexName, out IIndex index)) throw new InvalidOperationException($"No index found by name {UmbracoIndexes.ExternalIndexName}"); if (!(index is BaseIndexProvider indexProvider)) throw new InvalidOperationException("Could not cast"); indexProvider.TransformingIndexValues += IndexProviderTransformingIndexValues; } catch (Exception e) { _logger.LogError(e, "Initialize: Exception: {0} | Message: {1} | Stack Trace: {2}", e.InnerException != null ? e.InnerException.ToString() : "", e.Message != null ? e.Message.ToString() : "", e.StackTrace); } } private void IndexProviderTransformingIndexValues(object sender, IndexingItemEventArgs args) { try { if (int.TryParse(args.ValueSet.Id, out var pageId)) { if (args.ValueSet.ItemType == "blogDetailsPage") { using (UmbracoContextReference umbracoContextReference = _umbracoContextFactory.EnsureUmbracoContext()) { var contentNode = umbracoContextReference.UmbracoContext.Content.GetById(pageId); if (contentNode != null) args = SetSearchableValues(args, contentNode); } } } } catch (Exception e) { _logger.LogError(e, "IndexProviderTransformingIndexValues: Exception: {0} | Message: {1} | Stack Trace: {2}", e.InnerException != null ? e.InnerException.ToString() : "", e.Message != null ? e.Message.ToString() : "", e.StackTrace); } } private IndexingItemEventArgs SetSearchableValues(IndexingItemEventArgs args, IPublishedContent contentNode) { try { var combinedFields = new StringBuilder(); foreach (var fieldValues in args.ValueSet.Values) { foreach (var value in fieldValues.Value) { if (value != null) combinedFields.AppendLine(value.ToString()); } } args.ValueSet.Add("searchHomepageKey", contentNode.AncestorOrSelf("homePage").Key.ToString()); args.ValueSet.Add("searchParentKey", contentNode.Parent.Key.ToString()); args.ValueSet.Set("searchCurrentKey", contentNode.Key.ToString()); args.ValueSet.Add("searchableKeywords", combinedFields.ToString().ToLower()); args.ValueSet.Set("sortableDate", contentNode.CreateDate.ToString("yyyyMMddHHmmss")); if (args.ValueSet.ItemType == "blogDetailsPage") { var publishedDate = contentNode.Value("publishedDate"); args.ValueSet.Set("sortableDate", publishedDate.ToString("yyyyMMddHHmmss")); } } catch (Exception e) { _logger.LogError(e, "SetSearchableValues: Exception: {0} | Message: {1} | Stack Trace: {2}", e.InnerException != null ? e.InnerException.ToString() : "", e.Message != null ? e.Message.ToString() : "", e.StackTrace); } return args; } public void Terminate() { } } }