using System; using System.Security.Cryptography; using System.Text; using Serilog; using SharpRSS.API.Contracts.DTOs; using SharpRSS.API.Contracts.DTOs.Sessions; namespace SharpRSS.API.Models { internal class DbSession { public DbSession() { } private DbSession(string uid, double expiresMinutes) { if (string.IsNullOrEmpty(uid) || string.IsNullOrWhiteSpace(uid)) { Log.Error("User id is null or empty cannot create session!"); throw new Exception("User id cannot be null!"); } Uid = uid; Created = DateTime.Now; Expires = Created.AddMinutes(expiresMinutes); using SHA1 sha1 = SHA1.Create(); string uidHash = Convert.ToHexString(sha1.ComputeHash(Encoding.UTF8.GetBytes(Uid))); Sid = $"{new DateTimeOffset(Created).ToUnixTimeMilliseconds()}.{uidHash}.{new DateTimeOffset(Expires).ToUnixTimeMilliseconds()}"; } public string Uid { get; set; } public string Sid { get; set; } = string.Empty; public DateTime Created { get; set; } public DateTime Expires { get; set; } public bool Expired => Expires < DateTime.Now; public static DbSession CreateSession(string uid, double expiresMinutes = 10080) { DbSession newSession = new DbSession(uid, expiresMinutes); return newSession; } } }