Comment.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using Domain.Entities.Forum.ValueObject;
  2. using Domain.Entities.Forum.Boards;
  3. using Domain.Entities.Forum.Posts;
  4. using Domain.Entities.Members;
  5. using Microsoft.EntityFrameworkCore;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.ComponentModel.DataAnnotations.Schema;
  8. namespace Domain.Entities.Forum.Comments
  9. {
  10. [Table(nameof(Comment))]
  11. [Index(nameof(BoardID))]
  12. [Index(nameof(PostID))]
  13. [Index(nameof(MemberID))]
  14. [Index(nameof(ParentID))]
  15. // 루트 댓글 페이징 & 정렬용
  16. [Index(nameof(PostID), nameof(IsDeleted), nameof(ParentID), nameof(CreatedAt), IsDescending = new[] { false, false, false, true })]
  17. [Index(nameof(PostID), nameof(IsDeleted), nameof(ParentID), nameof(Score), nameof(ID), IsDescending = new[] { false, false, false, true, true })]
  18. [Index(nameof(PostID), nameof(MemberID), nameof(IsDeleted), nameof(ParentID), nameof(CreatedAt), IsDescending = new[] { false, false, false, false, true })]
  19. [Index(nameof(PostID), nameof(MemberID), nameof(IsDeleted), nameof(ParentID), nameof(Score), nameof(ID), IsDescending = new[] { false, false, false, false, true, true })]
  20. // 자식 댓글(답글) 등록순
  21. [Index(nameof(PostID), nameof(IsDeleted), nameof(ParentID), nameof(CreatedAt))]
  22. [Index(nameof(PostID), nameof(MemberID), nameof(IsDeleted), nameof(ParentID), nameof(CreatedAt))]
  23. public class Comment
  24. {
  25. [ForeignKey(nameof(BoardID))]
  26. public virtual Board Board { get; set; } = null!;
  27. [ForeignKey(nameof(PostID))]
  28. public virtual Post Post { get; set; } = null!;
  29. [ForeignKey(nameof(MemberID))]
  30. public virtual Member Member { get; set; } = null!;
  31. [ForeignKey(nameof(MentionMemberID))]
  32. public virtual Member? MentionMember { get; set; }
  33. public virtual Comment? Parent { get; set; }
  34. public virtual ICollection<Comment> Children { get; set; } = [];
  35. // 댓글 이미지
  36. public virtual List<CommentImage> CommentImage { get; set; } = [];
  37. // 댓글 미디어
  38. public virtual List<CommentMedia> CommentMedia { get; set; } = [];
  39. // 댓글 파일
  40. public virtual List<CommentFile> CommentFile { get; set; } = [];
  41. // 댓글 링크
  42. public virtual List<CommentLink> CommentLink { get; set; } = [];
  43. // 댓글 좋아요/싫어요
  44. public virtual List<CommentReaction> CommentReaction { get; set; } = [];
  45. // 댓글 신고
  46. public virtual List<CommentReport> CommentReport { get; set; } = [];
  47. // 댓글 파일 다운로드 기록
  48. public virtual List<CommentFileDownLog> CommentFileDownLog { get; set; } = [];
  49. // 댓글 링크 클릭 기록
  50. public virtual List<CommentLinkClickLog> CommentLinkClickLog { get; set; } = [];
  51. // 댓글 변경 기록
  52. public virtual List<CommentUpdateLog> CommentUpdateLog { get; set; } = [];
  53. // 답글 언급
  54. public virtual CommentMention? CommentMention { get; set; }
  55. [Key]
  56. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  57. [Comment("PK")]
  58. public int ID { get; set; }
  59. [Comment("게시판 ID")]
  60. public int BoardID { get; set; }
  61. [Comment("게시글 ID")]
  62. public int PostID { get; set; }
  63. [Comment("회원 ID")]
  64. public int MemberID { get; set; }
  65. [Comment("부모 댓글 ID")]
  66. public int? ParentID { get; set; }
  67. [Comment("언급 대상 회원 ID")]
  68. public int? MentionMemberID { get; set; }
  69. [Comment("댓글 깊이")]
  70. public sbyte Depth { get; set; } = 0;
  71. [Comment("댓글 내용")]
  72. [StringLength(4000, MinimumLength = 1)]
  73. public string Content { get; set; } = default!;
  74. [Comment("회원 SID")]
  75. [StringLength(20, MinimumLength = 1)]
  76. public string SID { get; set; } = default!;
  77. [Comment("회원 이메일")]
  78. [StringLength(60, MinimumLength = 1)]
  79. public string Email { get; set; } = default!;
  80. [Comment("회원 이름")]
  81. [StringLength(20)]
  82. public string? Name { get; set; }
  83. [Comment("1:1문의 답변 여부")]
  84. public bool IsReply { get; set; } = false;
  85. [Comment("비밀글 여부")]
  86. public bool IsSecret { get; set; } = false;
  87. [Comment("삭제 여부")]
  88. public bool IsDeleted { get; set; } = false;
  89. [Comment("좋아요")]
  90. public int Likes { get; set; } = 0;
  91. [Comment("싫어요")]
  92. public int Dislikes { get; set; } = 0;
  93. [Comment("신고 수")]
  94. public int Reports { get; set; } = 0;
  95. [Comment("답글 수")]
  96. public int Replies { get; set; } = 0;
  97. [Comment("인기 순위")]
  98. public int Score { get; set; } = 0; // 정렬을 위한
  99. [Comment("이미지 수")]
  100. public int Images { get; set; } = 0;
  101. [Comment("미디어 수")]
  102. public byte Medias { get; set; } = 0;
  103. [Comment("파일 수")]
  104. public byte Files { get; set; } = 0;
  105. [Comment("IP Address")]
  106. [MaxLength(50)]
  107. public string? IpAddress { get; set; }
  108. [Comment("User-Agent")]
  109. [MaxLength(255)]
  110. public string? UserAgent { get; set; }
  111. [Comment("상태")]
  112. [EnumDataType(typeof(DisplayStatus), ErrorMessage = "올바른 상태를 입력해주세요.")]
  113. public DisplayStatus Status { get; set; } = DisplayStatus.Normal;
  114. [Comment("삭제 일시")]
  115. public DateTime? DeletedAt { get; set; }
  116. [Comment("수정 일시")]
  117. public DateTime? UpdatedAt { get; set; }
  118. [Comment("등록 일시")]
  119. public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
  120. }
  121. }