@@ -5,59 +5,76 @@ namespace CodeBeam.UltimateAuth.Core.Contracts;
55
66public sealed record RefreshTokenValidationResult
77{
8- public bool IsValid { get ; init ; }
9- public bool IsReuseDetected { get ; init ; }
8+ public RefreshTokenValidationState State { get ; init ; }
9+
10+ public bool IsValid => State == RefreshTokenValidationState . Valid ;
1011
1112 public string ? TokenHash { get ; init ; }
1213
1314 public TenantKey Tenant { get ; init ; }
15+
1416 public UserKey ? UserKey { get ; init ; }
17+
1518 public AuthSessionId ? SessionId { get ; init ; }
19+
1620 public SessionChainId ? ChainId { get ; init ; }
1721
1822 public DateTimeOffset ? ExpiresAt { get ; init ; }
23+ public DateTimeOffset ? ConsumedAt { get ; init ; }
1924
25+ public string ? ReplacedByTokenHash { get ; init ; }
2026
21- private RefreshTokenValidationResult ( ) { }
27+ private RefreshTokenValidationResult ( )
28+ {
29+ }
2230
2331 public static RefreshTokenValidationResult Invalid ( )
2432 => new ( )
2533 {
26- IsValid = false ,
27- IsReuseDetected = false
34+ State = RefreshTokenValidationState . Invalid
2835 } ;
2936
30- public static RefreshTokenValidationResult ReuseDetected (
31- TenantKey tenant ,
32- AuthSessionId ? sessionId = null ,
33- string ? tokenHash = null ,
34- SessionChainId ? chainId = null ,
35- UserKey ? userKey = default )
36- => new ( )
37- {
38- IsValid = false ,
39- IsReuseDetected = true ,
40- Tenant = tenant ,
41- SessionId = sessionId ,
42- TokenHash = tokenHash ,
43- ChainId = chainId ,
44- UserKey = userKey ,
45- } ;
46-
47- public static RefreshTokenValidationResult Valid (
48- TenantKey tenant ,
49- UserKey userKey ,
50- AuthSessionId sessionId ,
51- string ? tokenHash ,
52- SessionChainId ? chainId = null )
53- => new ( )
54- {
55- IsValid = true ,
56- IsReuseDetected = false ,
57- Tenant = tenant ,
58- UserKey = userKey ,
59- SessionId = sessionId ,
60- ChainId = chainId ,
61- TokenHash = tokenHash
62- } ;
63- }
37+ public static RefreshTokenValidationResult NotFound ( )
38+ => new ( )
39+ {
40+ State = RefreshTokenValidationState . NotFound
41+ } ;
42+
43+ public static RefreshTokenValidationResult Expired ( RefreshToken token )
44+ => FromToken ( token , RefreshTokenValidationState . Expired ) ;
45+
46+ public static RefreshTokenValidationResult Consumed ( RefreshToken token )
47+ => FromToken ( token , RefreshTokenValidationState . Consumed ) ;
48+
49+ public static RefreshTokenValidationResult Valid ( RefreshToken token , string tokenHash )
50+ => new ( )
51+ {
52+ State = RefreshTokenValidationState . Valid ,
53+
54+ Tenant = token . Tenant ,
55+ UserKey = token . UserKey ,
56+ SessionId = token . SessionId ,
57+ ChainId = token . ChainId ,
58+
59+ TokenHash = tokenHash ,
60+ ExpiresAt = token . ExpiresAt ,
61+ ReplacedByTokenHash = token . ReplacedByTokenHash
62+ } ;
63+
64+ private static RefreshTokenValidationResult FromToken ( RefreshToken token , RefreshTokenValidationState state )
65+ => new ( )
66+ {
67+ State = state ,
68+
69+ Tenant = token . Tenant ,
70+ UserKey = token . UserKey ,
71+ SessionId = token . SessionId ,
72+ ChainId = token . ChainId ,
73+
74+ TokenHash = token . TokenHash ,
75+ ExpiresAt = token . ExpiresAt ,
76+ ReplacedByTokenHash = token . ReplacedByTokenHash ,
77+
78+ ConsumedAt = token . RevokedAt
79+ } ;
80+ }
0 commit comments