using Chtn.CSharp.SDK.Core; using Chtn.CSharp.SDK.Models.Session; using Chtn.CSharpSDK.Interfaces; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Chtn.CSharp.SDK.Services { public interface ISessionManager { void AddSession(Session session); List LoadSessions(); Task ValidateSessions(IAuthService authService); Session GetPreferredUser(); void SetPreferredUser(string userId); } public class SessionManagerProvider : ISessionManager { private readonly IDatabaseAPI _database; private readonly IKeyringAPI _keyring; private const string SESSION_KEY = "active_sessions"; private const string PREFERRED_USER_KEY = "preferred_user_id"; public SessionManagerProvider(IDatabaseAPI database, IKeyringAPI keyring) { _database = database ?? throw new ArgumentNullException(nameof(database)); _keyring = keyring ?? throw new ArgumentNullException(nameof(keyring)); } public void AddSession(Session session) { var sessions = LoadSessions(); if (!sessions.Any(s => s.UserData.UserId == session.UserData.UserId)) { sessions.Add(session); SaveSessions(sessions); } } public List LoadSessions() { var data = _database.Get("system", SESSION_KEY); if (string.IsNullOrEmpty(data)) return new List(); try { return JsonConvert.DeserializeObject>(data); } catch { return new List(); } } public async Task ValidateSessions(IAuthService authService) { var current = GetPreferredUser(); if (current == null || string.IsNullOrEmpty(current.Token)) return false; var req = new ValidateSessionReq { Token = current.Token }; var resp = await authService.ValidateSession(req); return resp != null && resp.ValidationOk; } public Session GetPreferredUser() { var userId = _keyring.Get(PREFERRED_USER_KEY); if (string.IsNullOrEmpty(userId)) return null; return LoadSessions().FirstOrDefault(s => s.UserData.UserId == userId); } public void SetPreferredUser(string userId) { _keyring.Set(PREFERRED_USER_KEY, userId); } private void SaveSessions(List sessions) { var json = JsonConvert.SerializeObject(sessions); _database.Set("system", SESSION_KEY, json); _database.Flush(); } } }