diff --git a/Marechai.App/Services/Caching/FlagCache.cs b/Marechai.App/Services/Caching/FlagCache.cs new file mode 100644 index 00000000..b2107be4 --- /dev/null +++ b/Marechai.App/Services/Caching/FlagCache.cs @@ -0,0 +1,64 @@ +using System; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; +using Windows.Storage; +using Microsoft.Extensions.Configuration; + +namespace Marechai.App.Services.Caching; + +public sealed class FlagCache +{ + readonly IConfiguration _configuration; + StorageFolder _flagsFolder; + + public FlagCache(IConfiguration configuration) + { + _configuration = configuration; + _ = EnsureFolderExistAsync(); + } + + async Task EnsureFolderExistAsync() + { + StorageFolder localFolder = ApplicationData.Current.LocalCacheFolder; + _flagsFolder = await localFolder.CreateFolderAsync("flags", CreationCollisionOption.OpenIfExists); + } + + public async Task GetFlagAsync(short countryCode) + { + var filename = $"{countryCode}.svg"; + + Stream retStream; + + if(await _flagsFolder.TryGetItemAsync(filename) is StorageFile file) + { + retStream = await file.OpenStreamForReadAsync(); + + return retStream; + } + + await CacheFlagAsync(countryCode); + + file = await _flagsFolder.GetFileAsync(filename); + + retStream = await file.OpenStreamForReadAsync(); + + return retStream; + } + + async Task CacheFlagAsync(short countryCode) + { + var filename = $"{countryCode}.svg"; + string baseUrl = _configuration.GetSection("ApiClient:Url").Value; + string flagUrl = baseUrl + $"/assets/flags/{filename}"; + using var httpClient = new HttpClient(); + using HttpResponseMessage response = await httpClient.GetAsync(flagUrl); + response.EnsureSuccessStatusCode(); + + using Stream stream = await response.Content.ReadAsStreamAsync(); + StorageFile file = await _flagsFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); + + using Stream fileStream = await file.OpenStreamForWriteAsync(); + await stream.CopyToAsync(fileStream); + } +} \ No newline at end of file