| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- using System.ComponentModel.DataAnnotations;
- namespace Domain.Entities.Chat;
- /// <summary>
- /// 채팅 제재 (개미투자 D2) — RoomKey NULL 은 전체 룸 제재, ExpiresAt NULL 은 무기한.
- /// 발언(SendMessage)만 차단하고 읽기는 허용한다.
- /// </summary>
- public class ChatBan
- {
- [Key]
- public int ID { get; private set; }
- /// <summary>제재 대상 회원 (FK Member)</summary>
- public int MemberID { get; private set; }
- /// <summary>제재 룸 키 — NULL 이면 전체 룸</summary>
- public string? RoomKey { get; private set; }
- /// <summary>제재 사유</summary>
- public string Reason { get; private set; } = default!;
- /// <summary>만료 일시 (UTC) — NULL 이면 무기한</summary>
- public DateTime? ExpiresAt { get; private set; }
- /// <summary>제재 등록자 (Admin 계정 표시명)</summary>
- public string CreatedBy { get; private set; } = default!;
- public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
- private ChatBan() { }
- public static ChatBan Create(int memberID, string? roomKey, string reason, DateTime? expiresAt, string createdBy)
- {
- if (memberID <= 0)
- {
- throw new ArgumentOutOfRangeException(nameof(memberID));
- }
- if (string.IsNullOrWhiteSpace(reason))
- {
- throw new ArgumentException("reason required", nameof(reason));
- }
- if (string.IsNullOrWhiteSpace(createdBy))
- {
- throw new ArgumentException("createdBy required", nameof(createdBy));
- }
- return new ChatBan
- {
- MemberID = memberID,
- RoomKey = string.IsNullOrWhiteSpace(roomKey) ? null : roomKey.Trim(),
- Reason = reason.Trim(),
- ExpiresAt = expiresAt,
- CreatedBy = createdBy.Trim()
- };
- }
- /// <summary>현재 시각 기준 유효한 제재인지</summary>
- public bool IsActiveAt(DateTime nowUtc) => ExpiresAt is null || ExpiresAt > nowUtc;
- /// <summary>제재 즉시 해제 — 만료 시각을 현재로 당김 (이력 보존)</summary>
- public void Lift(DateTime nowUtc)
- {
- if (!IsActiveAt(nowUtc))
- {
- return;
- }
- ExpiresAt = nowUtc;
- }
- }
|