#if NET using System.Text.Json; using Microsoft.Extensions.Caching.Distributed; using EnvelopeGenerator.Application.Common.Dto; using EnvelopeGenerator.Application.Common.Interfaces.Services; namespace EnvelopeGenerator.Infrastructure; /// /// Implements user preferences storage using the distributed cache (dbo.TBDD_CACHE). /// No DB schema changes required — uses the existing SQL Server distributed cache table. /// Cache key schema: "signflow.user-preferences:{username}" /// Expiration: indefinite (no TTL) — preferences persist until explicitly overwritten. /// public sealed class UserPreferencesService(IDistributedCache cache) : IUserPreferencesService { private const string KeyPrefix = "signflow.user-preferences:"; private static string BuildKey(string id) => $"{KeyPrefix}{id}"; /// public async Task GetOrCreateAsync(string id, CancellationToken ct = default) { var json = await cache.GetStringAsync(BuildKey(id), ct); if(json is not null && JsonSerializer.Deserialize(json) is UserPreferencesDto pref) { return pref; } else { // init new await SaveAsync(id, UserPreferencesDto.Default, ct); return UserPreferencesDto.Default; } } /// public async Task SaveAsync(string id, UserPreferencesDto preferences, CancellationToken ct = default) { var json = JsonSerializer.Serialize(preferences); // No expiration — preferences are stored indefinitely. await cache.SetStringAsync(BuildKey(id), json, new DistributedCacheEntryOptions(), ct); } } #endif