Files
SDK-CSharp/Services/SessionManagerMethods.cs

91 lines
2.8 KiB
C#

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<Session> LoadSessions();
Task<bool> 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<Session> LoadSessions()
{
var data = _database.Get("system", SESSION_KEY);
if (string.IsNullOrEmpty(data)) return new List<Session>();
try
{
return JsonConvert.DeserializeObject<List<Session>>(data);
}
catch
{
return new List<Session>();
}
}
public async Task<bool> 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<Session> sessions)
{
var json = JsonConvert.SerializeObject(sessions);
_database.Set("system", SESSION_KEY, json);
_database.Flush();
}
}
}