91 lines
2.8 KiB
C#
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();
|
|
}
|
|
}
|
|
} |