From e0689684e124a11f867b46b421e38ed04dc9a4e9 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 15 Nov 2025 15:47:31 +0000 Subject: [PATCH] Add logo cache. --- Marechai.App/Services/Caching/LogoCache.cs | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Marechai.App/Services/Caching/LogoCache.cs diff --git a/Marechai.App/Services/Caching/LogoCache.cs b/Marechai.App/Services/Caching/LogoCache.cs new file mode 100644 index 00000000..500ec06f --- /dev/null +++ b/Marechai.App/Services/Caching/LogoCache.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 CompanyLogoCache +{ + readonly IConfiguration _configuration; + StorageFolder _flagsFolder; + + public CompanyLogoCache(IConfiguration configuration) + { + _configuration = configuration; + _ = EnsureFolderExistAsync(); + } + + async Task EnsureFolderExistAsync() + { + StorageFolder localFolder = ApplicationData.Current.LocalCacheFolder; + _flagsFolder = await localFolder.CreateFolderAsync("logos", CreationCollisionOption.OpenIfExists); + } + + public async Task GetFlagAsync(Guid companyLogoId) + { + var filename = $"{companyLogoId}.svg"; + + Stream retStream; + + if(await _flagsFolder.TryGetItemAsync(filename) is StorageFile file) + { + retStream = await file.OpenStreamForReadAsync(); + + return retStream; + } + + await CacheFlagAsync(companyLogoId); + + file = await _flagsFolder.GetFileAsync(filename); + + retStream = await file.OpenStreamForReadAsync(); + + return retStream; + } + + async Task CacheFlagAsync(Guid companyLogoId) + { + var filename = $"{companyLogoId}.svg"; + string baseUrl = _configuration.GetSection("ApiClient:Url").Value; + string flagUrl = baseUrl + $"/assets/logos/{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