using ErsatzTV.Core.Api.Search; using ErsatzTV.Core.Interfaces.Search; namespace ErsatzTV.Application.Search.Queries; public class GetSearchFieldValuesHandler(ISearchIndex searchIndex) : IRequestHandler> { private const int DefaultLimit = 50; private const int MaxLimit = 50; public async Task> Handle( GetSearchFieldValues request, CancellationToken cancellationToken) { SearchFieldResponseModel field = SearchFieldCatalog.Fields .FirstOrDefault(f => f.Name == request.Name); if (field is null || field.Type != "text") { return Option.None; } int limit = request.Limit <= 0 ? DefaultLimit : Math.Clamp(request.Limit, 1, MaxLimit); List values = await searchIndex.GetFieldValues(request.Name, request.Query, limit); return new SearchFieldValuesResponseModel(values); } }