RedisChatConnectionTracker.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. }
  46. }