From 19d55c8df0e6827a5c856f1f0d5d0b4ed76d13e5 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 28 Jul 2017 14:49:11 +0200 Subject: [PATCH] U4-2676 - fix --- src/Umbraco.Web/Editors/EntityController.cs | 2 +- src/Umbraco.Web/Search/ISearchableTree.cs | 3 +- src/Umbraco.Web/Search/UmbracoTreeSearcher.cs | 89 +++++++++++++------ .../Trees/ContentTreeController.cs | 4 +- .../Trees/ContentTypeTreeController.cs | 2 +- .../Trees/DataTypeTreeController.cs | 2 +- src/Umbraco.Web/Trees/MediaTreeController.cs | 4 +- .../Trees/MediaTypeTreeController.cs | 2 +- src/Umbraco.Web/Trees/MemberTreeController.cs | 4 +- .../Trees/TemplatesTreeController.cs | 2 +- 10 files changed, 73 insertions(+), 41 deletions(-) diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index ef475603eb..71864e8bf7 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -133,7 +133,7 @@ namespace Umbraco.Web.Editors result[treeAttribute.GetRootNodeDisplayName(Services.TextService)] = new TreeSearchResult { - Results = searchableTree.Value.SearchableTree.Search(query, 200, 0, out total), + Results = searchableTree.Value.SearchableTree.Search(Umbraco, query, 200, 0, out total), TreeAlias = searchableTree.Key, AppAlias = searchableTree.Value.AppAlias, JsFormatterService = searchableTreeAttribute == null ? "" : searchableTreeAttribute.ServiceName, diff --git a/src/Umbraco.Web/Search/ISearchableTree.cs b/src/Umbraco.Web/Search/ISearchableTree.cs index 616b8e5763..c5eaea2258 100644 --- a/src/Umbraco.Web/Search/ISearchableTree.cs +++ b/src/Umbraco.Web/Search/ISearchableTree.cs @@ -14,6 +14,7 @@ namespace Umbraco.Web.Search /// /// Searches for results based on the entity type /// + /// /// /// /// @@ -22,6 +23,6 @@ namespace Umbraco.Web.Search /// /// /// - IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null); + IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null); } } \ No newline at end of file diff --git a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs b/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs index 08c8fca2c2..843980e143 100644 --- a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs +++ b/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs @@ -7,6 +7,7 @@ using System.Text.RegularExpressions; using AutoMapper; using Examine; using Umbraco.Core; +using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Search @@ -28,9 +29,9 @@ namespace Umbraco.Web.Search /// public IEnumerable ExamineSearch( UmbracoHelper umbracoHelper, - string query, - UmbracoEntityTypes entityType, - int pageSize, + string query, + UmbracoEntityTypes entityType, + int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { var sb = new StringBuilder(); @@ -55,35 +56,13 @@ namespace Umbraco.Web.Search break; case UmbracoEntityTypes.Media: type = "media"; - - var mediaSearchFrom = int.MinValue; - - if (umbracoHelper.UmbracoContext.Security.CurrentUser.StartMediaId > 0 || - //if searchFrom is specified and it is greater than 0 - (searchFrom != null && int.TryParse(searchFrom, out mediaSearchFrom) && mediaSearchFrom > 0)) - { - sb.Append("+__Path: \\-1*\\,"); - sb.Append(mediaSearchFrom > 0 - ? mediaSearchFrom.ToString(CultureInfo.InvariantCulture) - : umbracoHelper.UmbracoContext.Security.CurrentUser.StartMediaId.ToString(CultureInfo.InvariantCulture)); - sb.Append("\\,* "); - } + var allMediaStartNodes = umbracoHelper.UmbracoContext.Security.CurrentUser.CalculateMediaStartNodeIds(ApplicationContext.Current.Services.EntityService); + AppendPath(sb, UmbracoObjectTypes.Media, allMediaStartNodes, searchFrom); break; case UmbracoEntityTypes.Document: type = "content"; - - var contentSearchFrom = int.MinValue; - - if (umbracoHelper.UmbracoContext.Security.CurrentUser.StartContentId > 0 || - //if searchFrom is specified and it is greater than 0 - (searchFrom != null && int.TryParse(searchFrom, out contentSearchFrom) && contentSearchFrom > 0)) - { - sb.Append("+__Path: \\-1*\\,"); - sb.Append(contentSearchFrom > 0 - ? contentSearchFrom.ToString(CultureInfo.InvariantCulture) - : umbracoHelper.UmbracoContext.Security.CurrentUser.StartContentId.ToString(CultureInfo.InvariantCulture)); - sb.Append("\\,* "); - } + var allContentStartNodes = umbracoHelper.UmbracoContext.Security.CurrentUser.CalculateContentStartNodeIds(ApplicationContext.Current.Services.EntityService); + AppendPath(sb, UmbracoObjectTypes.Document, allContentStartNodes, searchFrom); break; default: throw new NotSupportedException("The " + typeof(UmbracoTreeSearcher) + " currently does not support searching against object type " + entityType); @@ -220,6 +199,58 @@ namespace Umbraco.Web.Search } } + private void AppendPath(StringBuilder sb, UmbracoObjectTypes objectType, int[] startNodeIds, string searchFrom) + { + var entityService = ApplicationContext.Current.Services.EntityService; + + int searchFromId; + var entityPath = int.TryParse(searchFrom, out searchFromId) && searchFromId > 0 + ? entityService.GetAllPaths(objectType, searchFromId).FirstOrDefault() + : null; + if (entityPath != null) + { + // find... only what's underneath + sb.Append("+__Path:"); + AppendPath(sb, entityPath.Path, false); + sb.Append(" "); + } + else if (startNodeIds.Length == 0) + { + // make sure we don't find anything + sb.Append("+__Path:none "); + } + else if (startNodeIds.Contains(-1) == false) // -1 = no restriction + { + var entityPaths = entityService.GetAllPaths(objectType, startNodeIds); + + // for each start node, find the start node, and what's underneath + // +__Path:(-1*,1234 -1*,1234,* -1*,5678 -1*,5678,* ...) + sb.Append("+__Path:("); + var first = true; + foreach (var ep in entityPaths) + { + if (first) + first = false; + else + sb.Append(" "); + AppendPath(sb, ep.Path, true); + } + sb.Append(") "); + } + } + + private void AppendPath(StringBuilder sb, string path, bool includeThisNode) + { + path = path.Replace("-", "\\-").Replace(",", "\\,"); + if (includeThisNode) + { + sb.Append(path); + sb.Append(" "); + } + sb.Append(path); + sb.Append("\\,*"); + } + /// /// Returns a collection of entities for media based on search results /// diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs index 9b3a6e82f8..2fc1356f5d 100644 --- a/src/Umbraco.Web/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTreeController.cs @@ -259,9 +259,9 @@ namespace Umbraco.Web.Trees return menu; } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - return _treeSearcher.ExamineSearch(Umbraco, query, UmbracoEntityTypes.Document, pageSize, pageIndex, out totalFound, searchFrom); + return _treeSearcher.ExamineSearch(umbracoHelper, query, UmbracoEntityTypes.Document, pageSize, pageIndex, out totalFound, searchFrom); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 7f3a6dfddf..f6b3231f66 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -142,7 +142,7 @@ namespace Umbraco.Web.Trees return menu; } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.DocumentType, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index b19d79c817..e635e84fd1 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -127,7 +127,7 @@ namespace Umbraco.Web.Trees return menu; } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.DataType, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); diff --git a/src/Umbraco.Web/Trees/MediaTreeController.cs b/src/Umbraco.Web/Trees/MediaTreeController.cs index 679d4a2d6a..114aa9cf2f 100644 --- a/src/Umbraco.Web/Trees/MediaTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTreeController.cs @@ -173,9 +173,9 @@ namespace Umbraco.Web.Trees return Security.CurrentUser.HasPathAccess(media, Services.EntityService); } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - return _treeSearcher.ExamineSearch(Umbraco, query, UmbracoEntityTypes.Media, pageSize, pageIndex, out totalFound, searchFrom); + return _treeSearcher.ExamineSearch(umbracoHelper, query, UmbracoEntityTypes.Media, pageSize, pageIndex, out totalFound, searchFrom); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index e402b5d64b..4708b7d79c 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -129,7 +129,7 @@ namespace Umbraco.Web.Trees return menu; } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.MediaType, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index 68f12ef6ca..cc294b7fb3 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -184,9 +184,9 @@ namespace Umbraco.Web.Trees return menu; } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - return _treeSearcher.ExamineSearch(Umbraco, query, UmbracoEntityTypes.Member, pageSize, pageIndex, out totalFound, searchFrom); + return _treeSearcher.ExamineSearch(umbracoHelper, query, UmbracoEntityTypes.Member, pageSize, pageIndex, out totalFound, searchFrom); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index c5c3c3dc70..303d47f307 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -133,7 +133,7 @@ namespace Umbraco.Web.Trees : null; } - public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) + public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.Template, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results);