refactor(core): enhance User and RefreshToken domain models
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user