using Microsoft.IdentityModel.JsonWebTokens; using PCUT.Entities; using System; namespace Http.Core.Contexts { public class UserContext : IDisposable { private UserContext() { } private static readonly object _instanceLock = new object(); private static UserContext _instance; public static UserContext Instance { get { if (_instance == null) { lock (_instanceLock) { if (_instance == null) _instance = new UserContext(); } } return _instance; } } public bool DebugFeaturesEnabled { get; set; } = false; public UserProfile Profile { get; private set; } public string AccessToken { get; private set; } public string RefreshToken { get; private set; } public DateTime? ExpiredTime { get; private set; } public string DeviceId { get; private set; } public string AppVersion { get; private set; } public bool IsPermittedEdit => Profile.Role == "admin" || (Profile.IsPermittedEdit ?? false); public void SetDeviceId(string deviceId) { if (DeviceId == null) { DeviceId = deviceId; } } public void SetAppVersion(string appVersion) { if (AppVersion == null) { AppVersion = appVersion; } } private readonly object _updateLock = new object(); internal void SetValue(string accessToken, string refreshToken, string userName = null) { lock(_updateLock) { AccessToken = accessToken; RefreshToken = refreshToken; try { var token = new JsonWebToken(AccessToken); ExpiredTime = token.ValidTo != DateTime.MinValue ? token.ValidTo : (DateTime?)null; } catch { } } } internal void SetProfile(UserProfile profile) { Profile = profile; } public void Dispose() { AccessToken = null; RefreshToken = null; DeviceId = null; ExpiredTime = null; Profile = null; _instance = null; } } }