From 761c76143de841d14f87dfbb81a90bad15ae2760 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 15 Apr 2025 16:20:31 +0200 Subject: [PATCH] Make the entity search service async (#19048) * Make the entity search service async * Update src/Umbraco.Core/Services/IIndexedEntitySearchService.cs --------- Co-authored-by: Andy Butland --- .../Document/Item/SearchDocumentItemController.cs | 6 +++--- .../Media/Item/SearchMediaItemController.cs | 6 +++--- .../Services/IIndexedEntitySearchService.cs | 11 +++++++++++ .../Implement/IndexedEntitySearchService.cs | 15 +++++++++++++-- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/SearchDocumentItemController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/SearchDocumentItemController.cs index 2c168b37e7..62e15d7e74 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/SearchDocumentItemController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/SearchDocumentItemController.cs @@ -24,7 +24,7 @@ public class SearchDocumentItemController : DocumentItemControllerBase [HttpGet("search")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PagedModel), StatusCodes.Status200OK)] - public Task SearchWithTrashed( + public async Task SearchWithTrashed( CancellationToken cancellationToken, string query, bool? trashed = null, @@ -33,13 +33,13 @@ public class SearchDocumentItemController : DocumentItemControllerBase Guid? parentId = null, [FromQuery] IEnumerable? allowedDocumentTypes = null) { - PagedModel searchResult = _indexedEntitySearchService.Search(UmbracoObjectTypes.Document, query, parentId, allowedDocumentTypes, trashed, skip, take); + PagedModel searchResult = await _indexedEntitySearchService.SearchAsync(UmbracoObjectTypes.Document, query, parentId, allowedDocumentTypes, trashed, skip, take); var result = new PagedModel { Items = searchResult.Items.OfType().Select(_documentPresentationFactory.CreateItemResponseModel), Total = searchResult.Total, }; - return Task.FromResult(Ok(result)); + return Ok(result); } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/SearchMediaItemController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/SearchMediaItemController.cs index 33ec2436bb..b5da421abe 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/SearchMediaItemController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/SearchMediaItemController.cs @@ -29,15 +29,15 @@ public class SearchMediaItemController : MediaItemControllerBase [HttpGet("search")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PagedModel), StatusCodes.Status200OK)] - public Task SearchFromParentWithAllowedTypes(CancellationToken cancellationToken, string query, bool? trashed = null, int skip = 0, int take = 100, Guid? parentId = null, [FromQuery]IEnumerable? allowedMediaTypes = null) + public async Task SearchFromParentWithAllowedTypes(CancellationToken cancellationToken, string query, bool? trashed = null, int skip = 0, int take = 100, Guid? parentId = null, [FromQuery]IEnumerable? allowedMediaTypes = null) { - PagedModel searchResult = _indexedEntitySearchService.Search(UmbracoObjectTypes.Media, query, parentId, allowedMediaTypes, trashed, skip, take); + PagedModel searchResult = await _indexedEntitySearchService.SearchAsync(UmbracoObjectTypes.Media, query, parentId, allowedMediaTypes, trashed, skip, take); var result = new PagedModel { Items = searchResult.Items.OfType().Select(_mediaPresentationFactory.CreateItemResponseModel), Total = searchResult.Total, }; - return Task.FromResult(Ok(result)); + return Ok(result); } } diff --git a/src/Umbraco.Core/Services/IIndexedEntitySearchService.cs b/src/Umbraco.Core/Services/IIndexedEntitySearchService.cs index 1404d3e946..06ff99c35c 100644 --- a/src/Umbraco.Core/Services/IIndexedEntitySearchService.cs +++ b/src/Umbraco.Core/Services/IIndexedEntitySearchService.cs @@ -25,6 +25,7 @@ public interface IIndexedEntitySearchService => Search(objectType,query, skip, take, ignoreUserStartNodes); // default implementation to avoid breaking changes falls back to old behaviour + [Obsolete("Please use the async version of this method, SearchAsync. Scheduled for removal in V17.")] PagedModel Search( UmbracoObjectTypes objectType, string query, @@ -35,4 +36,14 @@ public interface IIndexedEntitySearchService int take = 100, bool ignoreUserStartNodes = false) => Search(objectType,query, skip, take, ignoreUserStartNodes); + + Task> SearchAsync( + UmbracoObjectTypes objectType, + string query, + Guid? parentId, + IEnumerable? contentTypeIds, + bool? trashed, + int skip = 0, + int take = 100, + bool ignoreUserStartNodes = false); } diff --git a/src/Umbraco.Infrastructure/Services/Implement/IndexedEntitySearchService.cs b/src/Umbraco.Infrastructure/Services/Implement/IndexedEntitySearchService.cs index 43fe982df9..2febcc68c0 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/IndexedEntitySearchService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/IndexedEntitySearchService.cs @@ -73,6 +73,17 @@ internal sealed class IndexedEntitySearchService : IIndexedEntitySearchService int skip = 0, int take = 100, bool ignoreUserStartNodes = false) + => SearchAsync(objectType, query, parentId, contentTypeIds, trashed, skip, take, ignoreUserStartNodes).GetAwaiter().GetResult(); + + public Task> SearchAsync( + UmbracoObjectTypes objectType, + string query, + Guid? parentId, + IEnumerable? contentTypeIds, + bool? trashed, + int skip = 0, + int take = 100, + bool ignoreUserStartNodes = false) { UmbracoEntityTypes entityType = objectType switch { @@ -115,12 +126,12 @@ internal sealed class IndexedEntitySearchService : IIndexedEntitySearchService .Where(key => key != Guid.Empty) .ToArray(); - return new PagedModel + return Task.FromResult(new PagedModel { Items = keys.Any() ? _entityService.GetAll(objectType, keys) : Enumerable.Empty(), Total = totalFound - }; + }); } }