mirror of https://github.com/ErsatzTV/ErsatzTV.git
33 changed files with 188 additions and 70 deletions
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
namespace ErsatzTV.Core.Interfaces.Repositories.Caching; |
||||
|
||||
public interface ICachingSearchRepository : ISearchRepository |
||||
{ |
||||
} |
||||
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using ErsatzTV.Infrastructure.Data.Repositories.Caching; |
||||
using FluentAssertions; |
||||
using LanguageExt; |
||||
using Moq; |
||||
using NUnit.Framework; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Tests.Data.Repositories.Caching; |
||||
|
||||
[TestFixture] |
||||
public class CachingSearchRepositoryTests |
||||
{ |
||||
[Test] |
||||
public async Task GetAllLanguageCodes_Should_Cache_Languages_Separately() |
||||
{ |
||||
var englishMediaCodes = new List<string> { "eng" }; |
||||
var frenchMediaCodes = new List<string> { "fre" }; |
||||
var englishResult = new List<string> { "english_result" }; |
||||
var frenchResult = new List<string> { "french_result" }; |
||||
|
||||
var searchRepo = new Mock<ISearchRepository>(); |
||||
searchRepo.Setup(x => x.GetAllLanguageCodes(englishMediaCodes)).Returns(englishResult.AsTask()); |
||||
searchRepo.Setup(x => x.GetAllLanguageCodes(frenchMediaCodes)).Returns(frenchResult.AsTask()); |
||||
|
||||
var repo = new CachingSearchRepository(searchRepo.Object); |
||||
|
||||
List<string> result1 = await repo.GetAllLanguageCodes(englishMediaCodes); |
||||
result1.Should().BeEquivalentTo(englishResult); |
||||
|
||||
List<string> result2 = await repo.GetAllLanguageCodes(frenchMediaCodes); |
||||
result2.Should().BeEquivalentTo(frenchResult); |
||||
} |
||||
} |
||||
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
||||
<PropertyGroup> |
||||
<TargetFramework>net6.0</TargetFramework> |
||||
<ImplicitUsings>enable</ImplicitUsings> |
||||
<Nullable>enable</Nullable> |
||||
|
||||
<IsPackable>false</IsPackable> |
||||
</PropertyGroup> |
||||
|
||||
<ItemGroup> |
||||
<PackageReference Include="FluentAssertions" Version="6.7.0" /> |
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" /> |
||||
<PackageReference Include="Moq" Version="4.18.1" /> |
||||
<PackageReference Include="NUnit" Version="3.13.3" /> |
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" /> |
||||
<PackageReference Include="NUnit.Analyzers" Version="3.3.0" /> |
||||
<PackageReference Include="coverlet.collector" Version="3.1.2" /> |
||||
</ItemGroup> |
||||
|
||||
<ItemGroup> |
||||
<ProjectReference Include="..\ErsatzTV.Infrastructure\ErsatzTV.Infrastructure.csproj" /> |
||||
</ItemGroup> |
||||
|
||||
</Project> |
||||
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
using System.Collections.Concurrent; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Core.Interfaces.Repositories; |
||||
using ErsatzTV.Core.Interfaces.Repositories.Caching; |
||||
|
||||
namespace ErsatzTV.Infrastructure.Data.Repositories.Caching; |
||||
|
||||
public class CachingSearchRepository : ICachingSearchRepository |
||||
{ |
||||
private readonly ConcurrentDictionary<List<string>, List<string>> _cache = new(); |
||||
private readonly ISearchRepository _searchRepository; |
||||
private readonly SemaphoreSlim _slim = new(1, 1); |
||||
|
||||
public CachingSearchRepository(ISearchRepository searchRepository) => _searchRepository = searchRepository; |
||||
|
||||
public Task<Option<MediaItem>> GetItemToIndex(int id) => _searchRepository.GetItemToIndex(id); |
||||
|
||||
public Task<List<string>> GetLanguagesForShow(Show show) => _searchRepository.GetLanguagesForShow(show); |
||||
|
||||
public Task<List<string>> GetLanguagesForSeason(Season season) => _searchRepository.GetLanguagesForSeason(season); |
||||
|
||||
public Task<List<string>> GetLanguagesForArtist(Artist artist) => _searchRepository.GetLanguagesForArtist(artist); |
||||
|
||||
public async Task<List<string>> GetAllLanguageCodes(List<string> mediaCodes) |
||||
{ |
||||
if (!_cache.ContainsKey(mediaCodes)) |
||||
{ |
||||
await _slim.WaitAsync(); |
||||
try |
||||
{ |
||||
_cache.TryAdd(mediaCodes, await _searchRepository.GetAllLanguageCodes(mediaCodes)); |
||||
} |
||||
finally |
||||
{ |
||||
_slim.Release(); |
||||
} |
||||
} |
||||
|
||||
return _cache[mediaCodes]; |
||||
} |
||||
|
||||
public IAsyncEnumerable<MediaItem> GetAllMediaItems() => _searchRepository.GetAllMediaItems(); |
||||
} |
||||
Loading…
Reference in new issue