refactor(core): enhance User and RefreshToken domain models

This commit is contained in:
Stevan Freeborn
2026-02-03 11:06:54 -06:00
parent d1a4de8fdb
commit 7822088138
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 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;
}
}
+10 -1
View File
@@ -2,10 +2,12 @@ namespace FiscalOS.Core.Identity;
public sealed class User : Entity
{
private readonly List<RefreshToken> _refreshTokens = [];
public string Username { get; init; } = string.Empty;
public string HashedPassword { get; init; } = string.Empty;
public ICollection<RefreshToken> RefreshTokens { get; init; } = [];
public IEnumerable<RefreshToken> 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);
}
}
@@ -29,6 +29,9 @@ namespace FiscalOS.Infra.Migrations
b.Property<DateTimeOffset>("ExpiresAt")
.HasColumnType("TEXT");
b.Property<bool>("Revoked")
.HasColumnType("INTEGER");
b.Property<string>("Token")
.IsRequired()
.HasColumnType("TEXT");