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 HandleAsync(SearchCreatorsRequest request, CancellationToken cancellationToken) { SearchOptions searchOptions = request.Options; string cacheKey = $"creator:{searchOptions.GetHashCode()}"; CreatorSearchResults? cachedResults = await cache.GetAsync(cacheKey, cancellationToken); if (cachedResults != null) return new SearchCreatorsResponse(cachedResults); SearchResult results = await searchProvider.SearchAsync(searchOptions, cancellationToken); CacheEntryOptions cacheEntryOptions = new() { SlidingExpiration = TimeSpan.FromMinutes(10) }; await cache.SetAsync(cacheKey, results, cacheEntryOptions, cancellationToken); return new SearchCreatorsResponse(results); } }