ApiPersonalAccessToken.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using Domain.Entities.Members;
  4. namespace Domain.Entities.Developers;
  5. /// <summary>
  6. /// 개인 Access Token (PAT).
  7. /// 회원이 자기 자신을 대신해 API 호출용 — OAuth2 client_credentials 보다 간단한 인증.
  8. /// </summary>
  9. public class ApiPersonalAccessToken
  10. {
  11. [ForeignKey(nameof(OwnerMemberID))]
  12. public virtual Member? Owner { get; private set; }
  13. [Key]
  14. public long ID { get; private set; }
  15. public int OwnerMemberID { get; private set; }
  16. public string Name { get; private set; } = default!;
  17. public string TokenHash { get; private set; } = default!;
  18. public string TokenHint { get; private set; } = default!;
  19. public string ScopesCsv { get; private set; } = string.Empty;
  20. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  21. public DateTime? ExpiresAt { get; private set; }
  22. public DateTime? LastUsedAt { get; private set; }
  23. public DateTime? RevokedAt { get; private set; }
  24. private ApiPersonalAccessToken() { }
  25. public static ApiPersonalAccessToken Create(
  26. int ownerMemberID,
  27. string name,
  28. string tokenHash,
  29. string tokenHint,
  30. string scopesCsv,
  31. DateTime? expiresAt
  32. )
  33. {
  34. return new ApiPersonalAccessToken
  35. {
  36. OwnerMemberID = ownerMemberID,
  37. Name = name,
  38. TokenHash = tokenHash,
  39. TokenHint = tokenHint,
  40. ScopesCsv = scopesCsv,
  41. ExpiresAt = expiresAt
  42. };
  43. }
  44. public void Revoke()
  45. {
  46. RevokedAt = DateTime.UtcNow;
  47. }
  48. public void TouchLastUsed()
  49. {
  50. LastUsedAt = DateTime.UtcNow;
  51. }
  52. public bool IsRevoked => RevokedAt != null;
  53. public bool IsExpired => ExpiresAt.HasValue && DateTime.UtcNow >= ExpiresAt.Value;
  54. public bool IsActive => !IsRevoked && !IsExpired;
  55. }