namespace HrynCo.Common.Caching; using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; public sealed class InMemorySessionPromptStore : ISessionPromptStore { private readonly IMemoryCache _cache; public InMemorySessionPromptStore(IMemoryCache cache) { _cache = cache; } public Task GetAsync(Guid userId, string provider, CancellationToken cancellationToken = default) { _ = cancellationToken; _cache.TryGetValue(BuildKey(userId, provider), out string? prompt); return Task.FromResult(prompt); } public Task RemoveAsync(Guid userId, string provider, CancellationToken cancellationToken = default) { _ = cancellationToken; _cache.Remove(BuildKey(userId, provider)); return Task.CompletedTask; } public Task SaveAsync( Guid userId, string provider, string prompt, TimeSpan ttl, CancellationToken cancellationToken = default) { _ = cancellationToken; _cache.Set( BuildKey(userId, provider), prompt, new MemoryCacheEntryOptions { AbsoluteExpirationRelativeToNow = ttl, SlidingExpiration = TimeSpan.FromMinutes(30) }); return Task.CompletedTask; } private static string BuildKey(Guid userId, string provider) { return $"ai-session-prompt:{provider}:{userId:N}"; } }