RedisChatConnectionTracker.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Application.Abstractions.Cache;
  2. using Application.Abstractions.Chat;
  3. using StackExchange.Redis;
  4. using System.Text.Json;
  5. namespace Infrastructure.Chat
  6. {
  7. public class RedisChatConnectionTracker(IConnectionMultiplexer redis) : IChatConnectionTracker
  8. {
  9. private readonly IDatabase _db = redis.GetDatabase();
  10. private static readonly JsonSerializerOptions _jsonOptions = new()
  11. {
  12. PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
  13. WriteIndented = false
  14. };
  15. public async Task AddAsync(ConnectedUser user)
  16. {
  17. var json = JsonSerializer.Serialize(user, _jsonOptions);
  18. await _db.HashSetAsync(CacheKeys.ChatConnections, user.ConnectionId, json);
  19. }
  20. public async Task RemoveAsync(string connectionId)
  21. {
  22. await _db.HashDeleteAsync(CacheKeys.ChatConnections, connectionId);
  23. }
  24. public async Task<IReadOnlyList<ConnectedUser>> GetAllAsync()
  25. {
  26. var entries = await _db.HashGetAllAsync(CacheKeys.ChatConnections);
  27. if (entries.Length <= 0)
  28. {
  29. return [];
  30. }
  31. var list = new List<ConnectedUser>(entries.Length);
  32. foreach (var entry in entries)
  33. {
  34. if (!entry.Value.IsNullOrEmpty)
  35. {
  36. var user = JsonSerializer.Deserialize<ConnectedUser>((string)entry.Value!, _jsonOptions);
  37. if (user is not null)
  38. {
  39. list.Add(user);
  40. }
  41. }
  42. }
  43. return list.AsReadOnly();
  44. }
  45. public async Task ClearAllAsync()
  46. {
  47. await _db.KeyDeleteAsync(CacheKeys.ChatConnections);
  48. }
  49. }
  50. }