mirror of
https://github.com/Govor-team/Govor.git
synced 2026-07-21 19:54:55 +00:00
UserSessionRevoker
This commit is contained in:
@@ -89,6 +89,7 @@ public static class ConfigurationProgramExtensions
|
||||
services.AddScoped<IHubUserAccessor, HubUserAccessor>();
|
||||
|
||||
services.AddScoped<IUserSessionReader, UserSessionReader>();
|
||||
services.AddScoped<IUserSessionRevoker, UserSessionRevoker>();
|
||||
}
|
||||
|
||||
public static void AddRepositories(this IServiceCollection services)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"AllowedHosts": "govor-team-govor-88b3.twc1.net;localhost;localhost:7155",
|
||||
"JwtAccessOption": {
|
||||
"SecretKey": "Q89eY7zP7C4+TqLmHF4kw9xkF1E8Ru4Zpg+up9wFt9g=",
|
||||
"Minutes": 25
|
||||
"Minutes": 5
|
||||
},
|
||||
"JwtRefreshOption": {
|
||||
"RefreshTokenLifetimeDays": 30
|
||||
|
||||
@@ -23,11 +23,12 @@ public class UserSessionReader : IUserSessionReader
|
||||
{
|
||||
_logger.LogInformation($"Getting all sessions for user {userId}");
|
||||
var sessions = await _repository.GetByUserIdAsync(userId);
|
||||
return sessions;
|
||||
|
||||
return sessions.Where(f => !f.IsRevoked).ToList() ?? [];
|
||||
}
|
||||
catch (NotFoundByKeyException<Guid> ex)
|
||||
{
|
||||
_logger.LogWarning("The user has no active sessions.");
|
||||
_logger.LogWarning("The user has no sessions.");
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
using Govor.Application.Interfaces.UserSession;
|
||||
using Govor.Core.Repositories.UserSessionsRepository;
|
||||
using Govor.Data.Repositories.Exceptions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Govor.Application.Services.UserSessions;
|
||||
|
||||
public class UserSessionRevoker : IUserSessionRevoker
|
||||
{
|
||||
private readonly IUserSessionsRepository _sessionsRepository;
|
||||
private readonly ILogger<UserSessionRevoker> _logger;
|
||||
|
||||
public UserSessionRevoker(IUserSessionsRepository sessionsRepository, ILogger<UserSessionRevoker> logger)
|
||||
{
|
||||
_sessionsRepository = sessionsRepository;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task CloseSessionByIdAsync(Guid sessionId, Guid userId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var session = await _sessionsRepository.GetByIdAsync(sessionId);
|
||||
|
||||
if (session.UserId != userId)
|
||||
{
|
||||
_logger.LogWarning("User {userId} does not belong to this session {sessionId}", userId, sessionId);
|
||||
throw new UnauthorizedAccessException($"User {userId} does not belong to this session {sessionId}");
|
||||
}
|
||||
|
||||
if(session.IsRevoked) return;
|
||||
|
||||
session.IsRevoked = true;
|
||||
await _sessionsRepository.UpdateAsync(session);
|
||||
}
|
||||
catch (NotFoundByKeyException<Guid> ex)
|
||||
{
|
||||
_logger.LogWarning("User {userId} tried close unreal session!", userId);
|
||||
throw new NotFoundException("Session not found", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task CloseAllSessionsAsync(Guid userId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var sessions = await _sessionsRepository.GetByUserIdAsync(userId);
|
||||
|
||||
foreach (var session in sessions)
|
||||
{
|
||||
if(session.IsRevoked) continue;
|
||||
|
||||
session.IsRevoked = true;
|
||||
await _sessionsRepository.UpdateAsync(session);
|
||||
}
|
||||
}
|
||||
catch (NotFoundByKeyException<Guid> ex)
|
||||
{
|
||||
_logger.LogWarning("User {userId} has not sessions", userId);
|
||||
throw new NotFoundException("Session not found", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user