32 lines
1.2 KiB
C#
32 lines
1.2 KiB
C#
using JSMR.Application.Common.Caching;
|
|
using JSMR.Application.Common.Search;
|
|
using JSMR.Application.Creators.Queries.Search.Contracts;
|
|
using JSMR.Application.Creators.Queries.Search.Ports;
|
|
|
|
namespace JSMR.Application.Creators.Queries.Search;
|
|
|
|
public sealed class SearchCreatorsHandler(ICreatorSearchProvider searchProvider, ICache cache)
|
|
{
|
|
public async Task<SearchCreatorsResponse> HandleAsync(SearchCreatorsRequest request, CancellationToken cancellationToken)
|
|
{
|
|
SearchOptions<CreatorSearchCriteria, CreatorSortField> searchOptions = request.Options;
|
|
|
|
string cacheKey = $"creator:{searchOptions.GetHashCode()}";
|
|
|
|
CreatorSearchResults? cachedResults = await cache.GetAsync<CreatorSearchResults>(cacheKey, cancellationToken);
|
|
|
|
if (cachedResults != null)
|
|
return new SearchCreatorsResponse(cachedResults);
|
|
|
|
SearchResult<CreatorSearchItem> results = await searchProvider.SearchAsync(searchOptions, cancellationToken);
|
|
|
|
CacheEntryOptions cacheEntryOptions = new()
|
|
{
|
|
SlidingExpiration = TimeSpan.FromMinutes(10)
|
|
};
|
|
|
|
await cache.SetAsync(cacheKey, results, cacheEntryOptions, cancellationToken);
|
|
|
|
return new SearchCreatorsResponse(results);
|
|
}
|
|
} |