MemberFollow.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. namespace Domain.Entities.Members;
  4. /// <summary>
  5. /// 회원 팔로우 관계 (Follower → Followee)
  6. /// </summary>
  7. public sealed class MemberFollow
  8. {
  9. [ForeignKey(nameof(FollowerMemberID))]
  10. public Member Follower { get; private set; } = null!;
  11. [ForeignKey(nameof(FolloweeMemberID))]
  12. public Member Followee { get; private set; } = null!;
  13. [Key]
  14. public int ID { get; private set; }
  15. public int FollowerMemberID { get; private set; }
  16. public int FolloweeMemberID { get; private set; }
  17. public bool NotifyOnPost { get; private set; } = true;
  18. public bool IsMuted { get; private set; } = false;
  19. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  20. private MemberFollow() { }
  21. private MemberFollow(int followerMemberID, int followeeMemberID)
  22. {
  23. if (followerMemberID <= 0)
  24. {
  25. throw new ArgumentOutOfRangeException(nameof(followerMemberID));
  26. }
  27. if (followeeMemberID <= 0)
  28. {
  29. throw new ArgumentOutOfRangeException(nameof(followeeMemberID));
  30. }
  31. if (followerMemberID == followeeMemberID)
  32. {
  33. throw new ArgumentException("자기 자신을 팔로우할 수 없습니다.", nameof(followeeMemberID));
  34. }
  35. FollowerMemberID = followerMemberID;
  36. FolloweeMemberID = followeeMemberID;
  37. CreatedAt = DateTime.UtcNow;
  38. }
  39. public static MemberFollow Create(int followerMemberID, int followeeMemberID)
  40. {
  41. return new(followerMemberID, followeeMemberID);
  42. }
  43. public void SetNotifyOnPost(bool notify)
  44. {
  45. NotifyOnPost = notify;
  46. }
  47. public void SetMuted(bool muted)
  48. {
  49. IsMuted = muted;
  50. }
  51. }