/
RedisOnlineClientStore.cs
125 lines (106 loc) · 4.01 KB
/
RedisOnlineClientStore.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using Abp.Dependency;
using Abp.RealTime;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
namespace Abp.Runtime.Caching.Redis.RealTime
{
public class RedisOnlineClientStore : IOnlineClientStore, ISingletonDependency
{
private readonly IAbpRedisCacheDatabaseProvider _database;
private readonly string _clientStoreKey;
private readonly string _userStoreKey;
public RedisOnlineClientStore(
IAbpRedisCacheDatabaseProvider database,
AbpRedisCacheOptions options)
{
_database = database;
_clientStoreKey = options.OnlineClientsStoreKey + ".Clients";
_userStoreKey = options.OnlineClientsStoreKey + ".Users";
}
public async Task AddAsync(IOnlineClient client)
{
var database = GetDatabase();
await database.HashSetAsync(_clientStoreKey, new[]
{
new HashEntry(client.ConnectionId, client.ToString())
});
}
public async Task<bool> RemoveAsync(string connectionId)
{
var database = GetDatabase();
var clientValue = await database.HashGetAsync(_clientStoreKey, connectionId);
if (clientValue.IsNullOrEmpty)
{
return true;
}
await database.HashDeleteAsync(_clientStoreKey, connectionId);
return true;
}
public async Task<bool> TryRemoveAsync(string connectionId, Action<IOnlineClient> clientAction)
{
try
{
var database = GetDatabase();
var clientValue = await database.HashGetAsync(_clientStoreKey, connectionId);
if (clientValue.IsNullOrEmpty)
{
clientAction(null);
return true;
}
clientAction(JsonConvert.DeserializeObject<OnlineClient>(clientValue));
await database.HashDeleteAsync(_clientStoreKey, connectionId);
return true;
}
catch (Exception e)
{
Console.WriteLine(e);
clientAction(null);
return false;
}
}
public async Task<bool> TryGetAsync(string connectionId, Action<IOnlineClient> clientAction)
{
var database = GetDatabase();
var clientValue = await database.HashGetAsync(_clientStoreKey, connectionId);
if (clientValue.IsNullOrEmpty)
{
clientAction(null);
return false;
}
clientAction(JsonConvert.DeserializeObject<OnlineClient>(clientValue));
return true;
}
public async Task<IReadOnlyList<IOnlineClient>> GetAllAsync()
{
var database = GetDatabase();
var clientsEntries = await database.HashGetAllAsync(_clientStoreKey);
var clients = clientsEntries
.Select(entry => JsonConvert.DeserializeObject<OnlineClient>(entry.Value))
.Cast<IOnlineClient>()
.ToList();
return clients.ToImmutableList();
}
public async Task<IReadOnlyList<IOnlineClient>> GetAllByUserIdAsync(UserIdentifier userIdentifier)
{
var database = GetDatabase();
var clientsEntries = await database.HashGetAllAsync(_clientStoreKey);
var clients = new List<IOnlineClient>();
foreach (var entry in clientsEntries)
{
clients.Add(JsonConvert.DeserializeObject<OnlineClient>(entry.Value));
}
return clients
.Where(e => e.TenantId == userIdentifier.TenantId && e.UserId == userIdentifier.UserId)
.ToImmutableList();
}
private IDatabase GetDatabase()
{
return _database.GetDatabase();
}
}
}