using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using FrameworkDAL.CustomCode.User; using FrameworkDAL.CustomCode.UserLogin; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ServerConfig; using GB5Shared.Resource.Response; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace FrameworkBLL.UserLogin { public class LoggedInUsersBLL : ILoggedInUsersBLL { private readonly ILoggedInUsersDAL _dal; private readonly IUserDAL _userDAL; private readonly ILogger _logger; public LoggedInUsersBLL(ILoggedInUsersDAL dal, IUserDAL userDAL, ILogger logger) { _dal = dal; _userDAL = userDAL; _logger = logger; } /// /// GB4 parity for the Type parameter (GB4: SyncDAL.LogedInUsersChecking Type branch): /// 1 = order by UserCode, 2 = current user's own sessions only, /// 3 = admin sees all, non-admin sees only their own sessions. /// public async Task GetLoggedInUsersForDashboardAsync(LoginDTO login, int type, CancellationToken ct = default) { var users = await _dal.GetLoggedInUsersAsync(ct).ConfigureAwait(false); switch (type) { case 1: users = users.OrderBy(u => u.UserCode); break; case 2: users = users.Where(u => u.UserCode == login.UserCode); break; case 3: var serverConfig = new ServerConfigDTO { ClientId = login.ClientId }; int isAdmin = await _userDAL.CheckAdminRights(login, serverConfig).ConfigureAwait(false); if (isAdmin == 0) users = users.Where(u => u.UserCode == login.UserCode); break; } return JsonConvert.SerializeObject(users); } public async Task ForceLogoutAsync(List loginEventLogIds, LoginDTO login, CancellationToken ct = default) { if (loginEventLogIds is null || loginEventLogIds.Count == 0) throw new ArgumentException("At least one session ID is required.", nameof(loginEventLogIds)); if (login is null) throw new ArgumentNullException(nameof(login), "Admin login context is required to perform force logout."); foreach (int loginEventLogId in loginEventLogIds) { await _dal.ForceLogoutAsync(loginEventLogId, login.ServerConfigId, ct).ConfigureAwait(false); _logger.LogInformation( "Force logout | LoginEventLogId={LoginEventLogId} by AdminUserId={UserId}", loginEventLogId, login.UserId); } return SuccessResponse.DeleteSuccessMessage; } } }