using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Domain.Entities.Members; /// /// 회원 팔로우 관계 (Follower → Followee) /// public sealed class MemberFollow { [ForeignKey(nameof(FollowerMemberID))] public Member Follower { get; private set; } = null!; [ForeignKey(nameof(FolloweeMemberID))] public Member Followee { get; private set; } = null!; [Key] public int ID { get; private set; } public int FollowerMemberID { get; private set; } public int FolloweeMemberID { get; private set; } public bool NotifyOnPost { get; private set; } = true; public bool IsMuted { get; private set; } = false; public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; private MemberFollow() { } private MemberFollow(int followerMemberID, int followeeMemberID) { if (followerMemberID <= 0) { throw new ArgumentOutOfRangeException(nameof(followerMemberID)); } if (followeeMemberID <= 0) { throw new ArgumentOutOfRangeException(nameof(followeeMemberID)); } if (followerMemberID == followeeMemberID) { throw new ArgumentException("자기 자신을 팔로우할 수 없습니다.", nameof(followeeMemberID)); } FollowerMemberID = followerMemberID; FolloweeMemberID = followeeMemberID; CreatedAt = DateTime.UtcNow; } public static MemberFollow Create(int followerMemberID, int followeeMemberID) { return new(followerMemberID, followeeMemberID); } public void SetNotifyOnPost(bool notify) { NotifyOnPost = notify; } public void SetMuted(bool muted) { IsMuted = muted; } }