test to make server

This commit is contained in:
Artemy
2026-02-08 22:30:29 +07:00
parent cc2921d257
commit 0a43e35797
56 changed files with 949 additions and 442 deletions
@@ -5,25 +5,68 @@ namespace Govor.Application.Services.UserOnlineStatus;
public class OnlineUserStore : IOnlineUserStore
{
private readonly ConcurrentDictionary<Guid, DateTime> _onlineUsers = new();
private readonly ConcurrentDictionary<Guid, HashSet<string>> _userConnections = new();
public void SetOnlineUser(Guid userId)
public bool AddConnection(Guid userId, string connectionId)
{
_onlineUsers[userId] = DateTime.UtcNow;
bool isFirstConnection = false;
_userConnections.AddOrUpdate(userId,
_ => {
isFirstConnection = true;
return new HashSet<string> { connectionId };
},
(_, connections) => {
lock (connections)
{
if (connections.Count == 0) isFirstConnection = true;
connections.Add(connectionId);
}
return connections;
});
return isFirstConnection;
}
public void SetOfflineUser(Guid userId)
public bool RemoveConnection(Guid userId, string connectionId)
{
_onlineUsers.TryRemove(userId, out _);
bool isLastConnection = false;
if (_userConnections.TryGetValue(userId, out var connections))
{
lock (connections)
{
connections.Remove(connectionId);
if (connections.Count == 0)
{
isLastConnection = true;
_userConnections.TryRemove(userId, out _);
}
}
}
return isLastConnection;
}
public IEnumerable<string> GetConnections(Guid userId)
{
if (_userConnections.TryGetValue(userId, out var connections))
{
lock (connections)
{
return connections.ToList();
}
}
return Enumerable.Empty<string>();
}
public bool IsOnline(Guid userId)
{
return _onlineUsers.ContainsKey(userId);
return _userConnections.TryGetValue(userId, out var connections) && connections.Count > 0;
}
public IReadOnlyCollection<Guid> GetAllOnlineUsers()
{
return _onlineUsers.Keys.ToList();
return _userConnections.Keys.ToList();
}
}
}
@@ -26,7 +26,7 @@ public class UserNotificationScopeService : IUserNotificationScopeService
}
catch (NotFoundByKeyException<Guid> ex)
{
_logger.LogError(ex, ex.Message);
_logger.LogWarning(ex, ex.Message);
throw new InvalidOperationException("User not found");
}
}