diff --git a/src/FiscalOS.Core/Identity/RefreshToken.cs b/src/FiscalOS.Core/Identity/RefreshToken.cs index 3459a30..55d9385 100644 --- a/src/FiscalOS.Core/Identity/RefreshToken.cs +++ b/src/FiscalOS.Core/Identity/RefreshToken.cs @@ -5,7 +5,8 @@ public sealed class RefreshToken : Entity public string Token { get; init; } = string.Empty; public DateTimeOffset ExpiresAt { get; init; } public Guid UserId { get; init; } - public User User { get; init; } = null!; + public User? User { get; init; } + public bool Revoked { get; set; } private RefreshToken() { @@ -20,4 +21,27 @@ public sealed class RefreshToken : Entity ExpiresAt = expiresAt, }; } + + public static RefreshToken From(User user, string token, DateTimeOffset expiresAt) + { + ArgumentNullException.ThrowIfNull(user); + + return new() + { + User = user, + UserId = user.Id, + Token = token, + ExpiresAt = expiresAt, + }; + } + + public void Revoke() + { + Revoked = true; + } + + public bool IsExpired(DateTimeOffset now) + { + return now >= ExpiresAt; + } } \ No newline at end of file diff --git a/src/FiscalOS.Core/Identity/User.cs b/src/FiscalOS.Core/Identity/User.cs index be80277..acd106c 100644 --- a/src/FiscalOS.Core/Identity/User.cs +++ b/src/FiscalOS.Core/Identity/User.cs @@ -2,10 +2,12 @@ namespace FiscalOS.Core.Identity; public sealed class User : Entity { + private readonly List _refreshTokens = []; + public string Username { get; init; } = string.Empty; public string HashedPassword { get; init; } = string.Empty; - public ICollection RefreshTokens { get; init; } = []; + public IEnumerable RefreshTokens => _refreshTokens; private User() { @@ -24,4 +26,11 @@ public sealed class User : Entity HashedPassword = hashedPassword, }; } + + public void AddRefreshToken(RefreshToken refreshToken) + { + ArgumentNullException.ThrowIfNull(refreshToken); + + _refreshTokens.Add(refreshToken); + } } \ No newline at end of file diff --git a/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs b/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs index 9228af1..e95436d 100644 --- a/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs +++ b/src/FiscalOS.Infra/Migrations/AppDbContextModelSnapshot.cs @@ -29,6 +29,9 @@ namespace FiscalOS.Infra.Migrations b.Property("ExpiresAt") .HasColumnType("TEXT"); + b.Property("Revoked") + .HasColumnType("INTEGER"); + b.Property("Token") .IsRequired() .HasColumnType("TEXT");