Files
Umbraco-CMS/src/Umbraco.Infrastructure/Services/Implement/IndexedEntitySearchService.cs
Sven Geusens 27108036b4 Support parentId in document/media item search endpoints (#16933)
* Updated search services to start searching from a guid based key.

* Solved api breaking changes with new minor version

* Ordering and formatting

* Changed interface default implementation to the new method...

* Consolidated version

* PR review cleanup and renaming
2024-08-27 15:18:25 +02:00

70 lines
2.6 KiB
C#

using Examine;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.ContentEditing;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Examine;
namespace Umbraco.Cms.Infrastructure.Services.Implement;
internal sealed class IndexedEntitySearchService : IIndexedEntitySearchService
{
private readonly IBackOfficeExamineSearcher _backOfficeExamineSearcher;
private readonly IEntityService _entityService;
public IndexedEntitySearchService(IBackOfficeExamineSearcher backOfficeExamineSearcher, IEntityService entityService)
{
_backOfficeExamineSearcher = backOfficeExamineSearcher;
_entityService = entityService;
}
public PagedModel<IEntitySlim> Search(UmbracoObjectTypes objectType, string query, int skip = 0, int take = 100, bool ignoreUserStartNodes = false)
=> Search(objectType, query, null, skip, take, ignoreUserStartNodes);
public PagedModel<IEntitySlim> Search(
UmbracoObjectTypes objectType,
string query,
Guid? parentId,
int skip = 0,
int take = 100,
bool ignoreUserStartNodes = false)
{
UmbracoEntityTypes entityType = objectType switch
{
UmbracoObjectTypes.Document => UmbracoEntityTypes.Document,
UmbracoObjectTypes.Media => UmbracoEntityTypes.Media,
UmbracoObjectTypes.Member => UmbracoEntityTypes.Member,
_ => throw new NotSupportedException("This service only supports searching for documents, media and members")
};
PaginationHelper.ConvertSkipTakeToPaging(skip, take, out var pageNumber, out var pageSize);
IEnumerable<ISearchResult> searchResults = _backOfficeExamineSearcher.Search(
query,
entityType,
pageSize,
pageNumber,
out var totalFound,
ignoreUserStartNodes: ignoreUserStartNodes,
searchFrom: parentId?.ToString());
Guid[] keys = searchResults.Select(
result =>
result.Values.TryGetValue(UmbracoExamineFieldNames.NodeKeyFieldName, out var keyValue) &&
Guid.TryParse(keyValue, out Guid key)
? key
: Guid.Empty)
.Where(key => key != Guid.Empty)
.ToArray();
return new PagedModel<IEntitySlim>
{
Items = keys.Any()
? _entityService.GetAll(objectType, keys)
: Enumerable.Empty<IEntitySlim>(),
Total = totalFound
};
}
}