#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 username) => $"{KeyPrefix}{username}";
///
public async Task GetAsync(string username, CancellationToken ct = default)
{
var json = await cache.GetStringAsync(BuildKey(username), ct);
if (json is null)
return new UserPreferencesDto();
return JsonSerializer.Deserialize(json) ?? new UserPreferencesDto();
}
///
public async Task SaveAsync(string username, UserPreferencesDto preferences, CancellationToken ct = default)
{
var json = JsonSerializer.Serialize(preferences);
// No expiration — preferences are stored indefinitely.
await cache.SetStringAsync(BuildKey(username), json, new DistributedCacheEntryOptions(), ct);
}
}
#endif