namespace PlotLine.Models; public sealed class AppUser { public int UserID { get; set; } public string Email { get; set; } = string.Empty; public string DisplayName { get; set; } = string.Empty; public string PasswordHash { get; set; } = string.Empty; public bool EmailConfirmed { get; set; } public bool IsLocked { get; set; } public int FailedLoginAttempts { get; set; } public DateTime? LockoutEndUtc { get; set; } public bool TwoFactorEnabled { get; set; } public DateTime CreatedUtc { get; set; } public DateTime UpdatedUtc { get; set; } public DateTime? LastLoginUtc { get; set; } } public sealed class UserEmailVerificationToken { public int TokenID { get; set; } public int UserID { get; set; } public Guid Token { get; set; } public DateTime ExpiryUtc { get; set; } public DateTime? UsedUtc { get; set; } } public sealed class UserPasswordResetToken { public int TokenID { get; set; } public int UserID { get; set; } public Guid Token { get; set; } public DateTime ExpiryUtc { get; set; } public DateTime? UsedUtc { get; set; } } public sealed class UserTwoFactor { public int UserID { get; set; } public string SecretKey { get; set; } = string.Empty; public string? RecoveryCodes { get; set; } public DateTime CreatedUtc { get; set; } } public sealed class UserLoginAudit { public long AuditID { get; set; } public int? UserID { get; set; } public string? EmailAttempted { get; set; } public string? IpAddress { get; set; } public string? UserAgent { get; set; } public bool WasSuccessful { get; set; } public string? Reason { get; set; } public DateTime CreatedUtc { get; set; } }