namespace ROLAC.API.Entities; public class RefreshToken { public int Id { get; set; } public string UserId { get; set; } = null!; public AppUser User { get; set; } = null!; /// SHA-256 hex of the raw token sent to the client. Never store raw tokens. public string TokenHash { get; set; } = null!; public DateTime ExpiresAt { get; set; } public DateTime CreatedAt { get; set; } /// Set when this token is revoked (logout or rotation). public DateTime? RevokedAt { get; set; } /// Points to the hash of the token that replaced this one during rotation. public string? ReplacedByHash { get; set; } public string? DeviceInfo { get; set; } public string? IpAddress { get; set; } // Computed helpers — NOT mapped to DB columns (ignored in OnModelCreating) public bool IsExpired => DateTime.UtcNow >= ExpiresAt; public bool IsRevoked => RevokedAt.HasValue; public bool IsActive => !IsRevoked && !IsExpired; }