refactoring the code.
This commit is contained in:
@ -12,6 +12,8 @@ namespace Oqtane.Managers.Search
|
||||
{
|
||||
public class ModuleSearchIndexManager : SearchIndexManagerBase
|
||||
{
|
||||
public const int ModuleSearchIndexManagerPriority = 200;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ILogger<ModuleSearchIndexManager> _logger;
|
||||
private readonly IPageModuleRepository _pageModuleRepostory;
|
||||
@ -30,35 +32,41 @@ namespace Oqtane.Managers.Search
|
||||
_pageRepository = pageRepository;
|
||||
}
|
||||
|
||||
public override string Name => Constants.ModuleSearchIndexManagerName;
|
||||
public override string Name => EntityNames.Module;
|
||||
|
||||
public override int Priority => Constants.ModuleSearchIndexManagerPriority;
|
||||
public override int Priority => ModuleSearchIndexManagerPriority;
|
||||
|
||||
public override int IndexDocuments(int siteId, DateTime? startTime, Action<IList<SearchDocument>> processSearchDocuments, Action<string> handleError)
|
||||
public override int IndexContent(int siteId, DateTime? startTime, Action<IList<SearchContent>> processSearchContent, Action<string> handleError)
|
||||
{
|
||||
var pageModules = _pageModuleRepostory.GetPageModules(siteId).DistinctBy(i => i.ModuleId);
|
||||
var searchDocuments = new List<SearchDocument>();
|
||||
var searchContentList = new List<SearchContent>();
|
||||
|
||||
foreach(var pageModule in pageModules)
|
||||
{
|
||||
var page = _pageRepository.GetPage(pageModule.PageId);
|
||||
if(page == null || SearchUtils.IsSystemPage(page))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var module = pageModule.Module;
|
||||
if (module.ModuleDefinition.ServerManagerType != "")
|
||||
{
|
||||
_logger.LogDebug($"Search: Begin index module {module.ModuleId}.");
|
||||
var type = Type.GetType(module.ModuleDefinition.ServerManagerType);
|
||||
if (type?.GetInterface("IModuleSearch") != null)
|
||||
if (type?.GetInterface(nameof(ISearchable)) != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var moduleSearch = (IModuleSearch)ActivatorUtilities.CreateInstance(_serviceProvider, type);
|
||||
var documents = moduleSearch.GetSearchDocuments(module, startTime.GetValueOrDefault(DateTime.MinValue));
|
||||
if(documents != null)
|
||||
var moduleSearch = (ISearchable)ActivatorUtilities.CreateInstance(_serviceProvider, type);
|
||||
var contentList = moduleSearch.GetSearchContentList(module, startTime.GetValueOrDefault(DateTime.MinValue));
|
||||
if(contentList != null)
|
||||
{
|
||||
foreach(var document in documents)
|
||||
foreach(var searchContent in contentList)
|
||||
{
|
||||
SaveModuleMetaData(document, pageModule);
|
||||
SaveModuleMetaData(searchContent, pageModule);
|
||||
|
||||
searchDocuments.Add(document);
|
||||
searchContentList.Add(searchContent);
|
||||
}
|
||||
}
|
||||
|
||||
@ -73,54 +81,65 @@ namespace Oqtane.Managers.Search
|
||||
}
|
||||
}
|
||||
|
||||
processSearchDocuments(searchDocuments);
|
||||
processSearchContent(searchContentList);
|
||||
|
||||
return searchDocuments.Count;
|
||||
return searchContentList.Count;
|
||||
}
|
||||
|
||||
private void SaveModuleMetaData(SearchDocument document, PageModule pageModule)
|
||||
private void SaveModuleMetaData(SearchContent searchContent, PageModule pageModule)
|
||||
{
|
||||
|
||||
document.EntryId = pageModule.ModuleId;
|
||||
document.IndexerName = Name;
|
||||
document.SiteId = pageModule.Module.SiteId;
|
||||
document.LanguageCode = string.Empty;
|
||||
searchContent.SiteId = pageModule.Module.SiteId;
|
||||
|
||||
if(document.ModifiedTime == DateTime.MinValue)
|
||||
if(string.IsNullOrEmpty(searchContent.EntityName))
|
||||
{
|
||||
document.ModifiedTime = pageModule.ModifiedOn;
|
||||
searchContent.EntityName = EntityNames.Module;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(document.AdditionalContent))
|
||||
if(searchContent.EntityId == 0)
|
||||
{
|
||||
document.AdditionalContent = string.Empty;
|
||||
searchContent.EntityId = pageModule.ModuleId;
|
||||
}
|
||||
|
||||
if (searchContent.IsActive)
|
||||
{
|
||||
searchContent.IsActive = !pageModule.Module.IsDeleted;
|
||||
}
|
||||
|
||||
if (searchContent.ModifiedTime == DateTime.MinValue)
|
||||
{
|
||||
searchContent.ModifiedTime = pageModule.ModifiedOn;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(searchContent.AdditionalContent))
|
||||
{
|
||||
searchContent.AdditionalContent = string.Empty;
|
||||
}
|
||||
|
||||
var page = _pageRepository.GetPage(pageModule.PageId);
|
||||
|
||||
if (string.IsNullOrEmpty(document.Url) && page != null)
|
||||
if (string.IsNullOrEmpty(searchContent.Url) && page != null)
|
||||
{
|
||||
document.Url = page.Url;
|
||||
searchContent.Url = $"{(!string.IsNullOrEmpty(page.Path) && !page.Path.StartsWith("/") ? "/" : "")}{page.Path}";
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(document.Title) && page != null)
|
||||
if (string.IsNullOrEmpty(searchContent.Title) && page != null)
|
||||
{
|
||||
document.Title = !string.IsNullOrEmpty(page.Title) ? page.Title : page.Name;
|
||||
searchContent.Title = !string.IsNullOrEmpty(page.Title) ? page.Title : page.Name;
|
||||
}
|
||||
|
||||
if (document.Properties == null)
|
||||
if (searchContent.Properties == null)
|
||||
{
|
||||
document.Properties = new List<SearchDocumentProperty>();
|
||||
searchContent.Properties = new List<SearchContentProperty>();
|
||||
}
|
||||
|
||||
if(!document.Properties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
||||
if(!searchContent.Properties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
||||
{
|
||||
document.Properties.Add(new SearchDocumentProperty { Name = Constants.SearchPageIdPropertyName, Value = pageModule.PageId.ToString() });
|
||||
searchContent.Properties.Add(new SearchContentProperty { Name = Constants.SearchPageIdPropertyName, Value = pageModule.PageId.ToString() });
|
||||
}
|
||||
|
||||
if (!document.Properties.Any(i => i.Name == Constants.SearchModuleIdPropertyName))
|
||||
if (!searchContent.Properties.Any(i => i.Name == Constants.SearchModuleIdPropertyName))
|
||||
{
|
||||
document.Properties.Add(new SearchDocumentProperty { Name = Constants.SearchModuleIdPropertyName, Value = pageModule.ModuleId.ToString() });
|
||||
searchContent.Properties.Add(new SearchContentProperty { Name = Constants.SearchModuleIdPropertyName, Value = pageModule.ModuleId.ToString() });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ namespace Oqtane.Managers.Search
|
||||
{
|
||||
public class ModuleSearchResultManager : ISearchResultManager
|
||||
{
|
||||
public string Name => Constants.ModuleSearchIndexManagerName;
|
||||
public string Name => EntityNames.Module;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
@ -37,26 +37,17 @@ namespace Oqtane.Managers.Search
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public bool Visible(SearchDocument searchResult, SearchQuery searchQuery)
|
||||
public bool Visible(SearchContent searchResult, SearchQuery searchQuery)
|
||||
{
|
||||
var pageIdValue = searchResult.Properties?.FirstOrDefault(i => i.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
||||
var moduleIdValue = searchResult.Properties?.FirstOrDefault(i => i.Name == Constants.SearchModuleIdPropertyName)?.Value ?? string.Empty;
|
||||
if (!string.IsNullOrEmpty(pageIdValue) && int.TryParse(pageIdValue, out int pageId)
|
||||
&& !string.IsNullOrEmpty(moduleIdValue) && int.TryParse(moduleIdValue, out int moduleId))
|
||||
if (!string.IsNullOrEmpty(pageIdValue) && int.TryParse(pageIdValue, out int pageId))
|
||||
{
|
||||
return CanViewPage(pageId, searchQuery.User) && CanViewModule(moduleId, searchQuery.User);
|
||||
return CanViewPage(pageId, searchQuery.User);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool CanViewModule(int moduleId, User user)
|
||||
{
|
||||
var moduleRepository = _serviceProvider.GetRequiredService<IModuleRepository>();
|
||||
var module = moduleRepository.GetModule(moduleId);
|
||||
return module != null && !module.IsDeleted && UserSecurity.IsAuthorized(user, PermissionNames.View, module.PermissionList);
|
||||
}
|
||||
|
||||
private bool CanViewPage(int pageId, User user)
|
||||
{
|
||||
var pageRepository = _serviceProvider.GetRequiredService<IPageRepository>();
|
||||
|
@ -14,6 +14,8 @@ namespace Oqtane.Managers.Search
|
||||
{
|
||||
public class PageSearchIndexManager : SearchIndexManagerBase
|
||||
{
|
||||
private const int PageSearchIndexManagerPriority = 100;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly ILogger<ModuleSearchIndexManager> _logger;
|
||||
private readonly IPageRepository _pageRepository;
|
||||
@ -29,50 +31,50 @@ namespace Oqtane.Managers.Search
|
||||
_pageRepository = pageRepository;
|
||||
}
|
||||
|
||||
public override string Name => Constants.PageSearchIndexManagerName;
|
||||
public override string Name => EntityNames.Page;
|
||||
|
||||
public override int Priority => Constants.PageSearchIndexManagerPriority;
|
||||
public override int Priority => PageSearchIndexManagerPriority;
|
||||
|
||||
public override int IndexDocuments(int siteId, DateTime? startTime, Action<IList<SearchDocument>> processSearchDocuments, Action<string> handleError)
|
||||
public override int IndexContent(int siteId, DateTime? startTime, Action<IList<SearchContent>> processSearchContent, Action<string> handleError)
|
||||
{
|
||||
var startTimeValue = startTime.GetValueOrDefault(DateTime.MinValue);
|
||||
var pages = _pageRepository.GetPages(siteId).Where(i => i.ModifiedOn >= startTimeValue);
|
||||
var searchDocuments = new List<SearchDocument>();
|
||||
var searchContentList = new List<SearchContent>();
|
||||
|
||||
foreach(var page in pages)
|
||||
{
|
||||
try
|
||||
{
|
||||
if(IsSystemPage(page))
|
||||
if(SearchUtils.IsSystemPage(page))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var document = new SearchDocument
|
||||
var searchContent = new SearchContent
|
||||
{
|
||||
EntryId = page.PageId,
|
||||
IndexerName = Name,
|
||||
EntityName = EntityNames.Page,
|
||||
EntityId = page.PageId,
|
||||
SiteId = page.SiteId,
|
||||
LanguageCode = string.Empty,
|
||||
ModifiedTime = page.ModifiedOn,
|
||||
AdditionalContent = string.Empty,
|
||||
Url = page.Url ?? string.Empty,
|
||||
Url = $"{(!string.IsNullOrEmpty(page.Path) && !page.Path.StartsWith("/") ? "/" : "")}{page.Path}",
|
||||
Title = !string.IsNullOrEmpty(page.Title) ? page.Title : page.Name,
|
||||
Description = string.Empty,
|
||||
Body = $"{page.Name} {page.Title}"
|
||||
Body = $"{page.Name} {page.Title}",
|
||||
IsActive = !page.IsDeleted && Utilities.IsPageModuleVisible(page.EffectiveDate, page.ExpiryDate)
|
||||
};
|
||||
|
||||
if (document.Properties == null)
|
||||
if (searchContent.Properties == null)
|
||||
{
|
||||
document.Properties = new List<SearchDocumentProperty>();
|
||||
searchContent.Properties = new List<SearchContentProperty>();
|
||||
}
|
||||
|
||||
if (!document.Properties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
||||
if (!searchContent.Properties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
||||
{
|
||||
document.Properties.Add(new SearchDocumentProperty { Name = Constants.SearchPageIdPropertyName, Value = page.PageId.ToString() });
|
||||
searchContent.Properties.Add(new SearchContentProperty { Name = Constants.SearchPageIdPropertyName, Value = page.PageId.ToString() });
|
||||
}
|
||||
|
||||
searchDocuments.Add(document);
|
||||
searchContentList.Add(searchContent);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
@ -81,14 +83,9 @@ namespace Oqtane.Managers.Search
|
||||
}
|
||||
}
|
||||
|
||||
processSearchDocuments(searchDocuments);
|
||||
processSearchContent(searchContentList);
|
||||
|
||||
return searchDocuments.Count;
|
||||
}
|
||||
|
||||
private bool IsSystemPage(Models.Page page)
|
||||
{
|
||||
return page.Path.Contains("admin") || page.Path == "login" || page.Path == "register" || page.Path == "profile";
|
||||
return searchContentList.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,46 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Oqtane.Models;
|
||||
using Oqtane.Repository;
|
||||
using Oqtane.Security;
|
||||
using Oqtane.Services;
|
||||
using Oqtane.Shared;
|
||||
|
||||
namespace Oqtane.Managers.Search
|
||||
{
|
||||
public class PageSearchResultManager : ISearchResultManager
|
||||
{
|
||||
public string Name => Constants.PageSearchIndexManagerName;
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public PageSearchResultManager(
|
||||
IServiceProvider serviceProvider)
|
||||
{
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public string GetUrl(SearchResult searchResult, SearchQuery searchQuery)
|
||||
{
|
||||
var pageRepository = _serviceProvider.GetRequiredService<IPageRepository>();
|
||||
var page = pageRepository.GetPage(searchResult.EntryId);
|
||||
if (page != null)
|
||||
{
|
||||
return $"{searchQuery.Alias.Protocol}{searchQuery.Alias.Name}{(!string.IsNullOrEmpty(page.Path) && !page.Path.StartsWith("/") ? "/" : "")}{page.Path}";
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public bool Visible(SearchDocument searchResult, SearchQuery searchQuery)
|
||||
{
|
||||
var pageRepository = _serviceProvider.GetRequiredService<IPageRepository>();
|
||||
var page = pageRepository.GetPage(searchResult.EntryId);
|
||||
|
||||
return page != null && !page.IsDeleted
|
||||
&& UserSecurity.IsAuthorized(searchQuery.User, PermissionNames.View, page.PermissionList)
|
||||
&& (Utilities.IsPageModuleVisible(page.EffectiveDate, page.ExpiryDate) || UserSecurity.IsAuthorized(searchQuery.User, PermissionNames.Edit, page.PermissionList));
|
||||
}
|
||||
}
|
||||
}
|
@ -10,6 +10,8 @@ namespace Oqtane.Managers.Search
|
||||
{
|
||||
public abstract class SearchIndexManagerBase : ISearchIndexManager
|
||||
{
|
||||
private const string SearchIndexManagerEnabledSettingFormat = "SearchIndexManager_{0}_Enabled";
|
||||
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public SearchIndexManagerBase(IServiceProvider serviceProvider)
|
||||
@ -21,11 +23,11 @@ namespace Oqtane.Managers.Search
|
||||
|
||||
public abstract string Name { get; }
|
||||
|
||||
public abstract int IndexDocuments(int siteId, DateTime? startDate, Action<IList<SearchDocument>> processSearchDocuments, Action<string> handleError);
|
||||
public abstract int IndexContent(int siteId, DateTime? startDate, Action<IList<SearchContent>> processSearchContent, Action<string> handleError);
|
||||
|
||||
public virtual bool IsIndexEnabled(int siteId)
|
||||
{
|
||||
var settingName = string.Format(Constants.SearchIndexManagerEnabledSettingFormat, Name);
|
||||
var settingName = string.Format(SearchIndexManagerEnabledSettingFormat, Name);
|
||||
var settingRepository = _serviceProvider.GetRequiredService<ISettingRepository>();
|
||||
var setting = settingRepository.GetSetting(EntityNames.Site, siteId, settingName);
|
||||
return setting == null || setting.SettingValue == "true";
|
||||
|
Reference in New Issue
Block a user