refactor(core): enhance User and RefreshToken domain models

This commit is contained in:
Stevan Freeborn
2026-02-03 21:04:25 -06:00
parent 3fbd9402c3
commit ce5fd1fd45
3 changed files with 38 additions and 2 deletions
+25 -1
View File
@@ -5,7 +5,8 @@ public sealed class RefreshToken : Entity
public string Token { get; init; } = string.Empty; public string Token { get; init; } = string.Empty;
public DateTimeOffset ExpiresAt { get; init; } public DateTimeOffset ExpiresAt { get; init; }
public Guid UserId { 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() private RefreshToken()
{ {
@@ -20,4 +21,27 @@ public sealed class RefreshToken : Entity
ExpiresAt = expiresAt, 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;
}
} }
+10 -1
View File
@@ -2,10 +2,12 @@ namespace FiscalOS.Core.Identity;
public sealed class User : Entity public sealed class User : Entity
{ {
private readonly List<RefreshToken> _refreshTokens = [];
public string Username { get; init; } = string.Empty; public string Username { get; init; } = string.Empty;
public string HashedPassword { get; init; } = string.Empty; public string HashedPassword { get; init; } = string.Empty;
public ICollection<RefreshToken> RefreshTokens { get; init; } = []; public IEnumerable<RefreshToken> RefreshTokens => _refreshTokens;
private User() private User()
{ {
@@ -24,4 +26,11 @@ public sealed class User : Entity
HashedPassword = hashedPassword, HashedPassword = hashedPassword,
}; };
} }
public void AddRefreshToken(RefreshToken refreshToken)
{
ArgumentNullException.ThrowIfNull(refreshToken);
_refreshTokens.Add(refreshToken);
}
} }
@@ -29,6 +29,9 @@ namespace FiscalOS.Infra.Migrations
b.Property<DateTimeOffset>("ExpiresAt") b.Property<DateTimeOffset>("ExpiresAt")
.HasColumnType("TEXT"); .HasColumnType("TEXT");
b.Property<bool>("Revoked")
.HasColumnType("INTEGER");
b.Property<string>("Token") b.Property<string>("Token")
.IsRequired() .IsRequired()
.HasColumnType("TEXT"); .HasColumnType("TEXT");