using Application.Abstractions.Cache; using Application.Abstractions.Chat; using StackExchange.Redis; using System.Text.Json; namespace Infrastructure.Chat; public class RedisChatMessageStore(IConnectionMultiplexer redis) : IChatMessageStore { private readonly IDatabase _db = redis.GetDatabase(); private static readonly JsonSerializerOptions _jsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = false }; public async Task AddMessageAsync(string channelSID, ChatMessage message) { var json = JsonSerializer.Serialize(message, _jsonOptions); var key = CacheKeys.ChatChannelMessages(channelSID); await _db.ListLeftPushAsync(key, json); await _db.ListTrimAsync(key, 0, ChatSettings.MaxMessages - 1); } public async Task> GetRecentMessagesAsync(string channelSID, int count) { var key = CacheKeys.ChatChannelMessages(channelSID); var values = await _db.ListRangeAsync(key, 0, count - 1); if (values.Length <= 0) { return []; } var messages = new List(values.Length); foreach (var row in values) { if (!row.IsNullOrEmpty) { var message = JsonSerializer.Deserialize((string)row!, _jsonOptions); if (message is not null) { messages.Add(message); } } } messages.Reverse(); return messages; } public async Task ClearChannelAsync(string channelSID) { await _db.KeyDeleteAsync(CacheKeys.ChatChannelMessages(channelSID)); } }