BoardMeta.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. using Microsoft.EntityFrameworkCore;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. using bitforum.Constants;
  6. namespace bitforum.Models.BBS
  7. {
  8. [Table("BoardMeta")]
  9. public class BoardMeta
  10. {
  11. [ForeignKey("BoardID")]
  12. public Board Board { get; set; } = null!;
  13. [Key]
  14. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  15. [DisplayName("PK")]
  16. [Comment("PK")]
  17. public int ID { get; set; }
  18. [Required]
  19. [DisplayName("게시판 ID")]
  20. [Comment("게시판 ID")]
  21. public int BoardID { get; set; }
  22. // 목록
  23. public BoardListMeta List { get; set; } = new BoardListMeta();
  24. // 권한
  25. public BoardPermissionMeta Permission { get; set; } = new BoardPermissionMeta();
  26. // 알람
  27. public BoardNotifyMeta Notify { get; set; } = new BoardNotifyMeta();
  28. // 경험치
  29. public BoardExpMeta Exp { get; set; } = new BoardExpMeta();
  30. }
  31. /// <summary>
  32. /// 게시판 목록 설정
  33. /// </summary>
  34. [Owned]
  35. public class BoardListMeta
  36. {
  37. [DisplayName("상단 내용")]
  38. [Comment("상단 내용")]
  39. public string? HeaderContent { get; set; } = null;
  40. [DisplayName("하단 내용")]
  41. [Comment("하단 내용")]
  42. public string? FooterContent { get; set; } = null;
  43. [DisplayName("게시판 종류")]
  44. [Comment("게시판 종류")]
  45. public BoardConst.Layout? Layout { get; set; }
  46. [DisplayName("기본 정렬")]
  47. [Comment("기본 정렬")]
  48. public BoardConst.OrderBy? OrderBy { get; set; }
  49. [DisplayName("목록 표시")]
  50. [Comment("목록 표시")]
  51. public byte PerPage { get; set; } = 0;
  52. [DisplayName("글쓰기 버튼 보이기")]
  53. [Comment("글쓰기 버튼 보이기")]
  54. public bool AlwaysShowWriteButton { get; set; } = false;
  55. [DisplayName("하단 목록 보이기")]
  56. [Comment("하단 목록 보이기")]
  57. public bool ShowFooterListView { get; set; } = false;
  58. [DisplayName("NEW 사용 여부")]
  59. [Comment("NEW 사용 여부")]
  60. public bool IsNewIcon { get; set; } = false;
  61. [DisplayName("HOT 사용 여부")]
  62. [Comment("HOT 사용 여부")]
  63. public bool IsHotIcon { get; set; } = false;
  64. [DisplayName("공지사항 제외 여부")]
  65. [Comment("공지사항 제외 여부")]
  66. public bool ExceptNotice { get; set; } = false;
  67. [DisplayName("전체공지 제외 여부")]
  68. [Comment("전체공지 제외 여부")]
  69. public bool ExceptSpeaker { get; set; } = false;
  70. }
  71. /// <summary>
  72. /// 게시판 권한 설정
  73. /// </summary>
  74. [Owned]
  75. public class BoardPermissionMeta
  76. {
  77. [DisplayName("게시판 접근")]
  78. [Comment("게시판 접근")]
  79. public BoardConst.Permission BoardAccess { get; set; }
  80. [DisplayName("글 열람")]
  81. [Comment("글 열람")]
  82. public BoardConst.Permission PostView { get; set; }
  83. [DisplayName("글 작성")]
  84. [Comment("글 작성")]
  85. public BoardConst.Permission PostWrite { get; set; }
  86. [DisplayName("댓글 목록")]
  87. [Comment("댓글 목록")]
  88. public BoardConst.Permission CommentView { get; set; }
  89. [DisplayName("댓글 작성")]
  90. [Comment("댓글 작성")]
  91. public BoardConst.Permission CommentWrite { get; set; }
  92. [DisplayName("답글 작성")]
  93. [Comment("답글 작성")]
  94. public BoardConst.Permission ReplyWrite { get; set; }
  95. [DisplayName("파일 업로드")]
  96. [Comment("파일 업로드")]
  97. public BoardConst.Permission FileUpload { get; set; }
  98. [DisplayName("파일 다운로드")]
  99. [Comment("파일 다운로드")]
  100. public BoardConst.Permission FileDownload { get; set; }
  101. }
  102. [Owned]
  103. public class BoardNotifyMeta
  104. {
  105. [DisplayName("게시글 작성 시")]
  106. [Comment("게시글 작성 시")]
  107. public BoardConst.Notify? PostWriteNotify { get; set; } = null;
  108. [DisplayName("댓글 작성 시")]
  109. [Comment("댓글 작성 시")]
  110. public BoardConst.Notify? CommentWriteNotify { get; set; } = null;
  111. [DisplayName("답글 작성 시")]
  112. [Comment("답글 작성 시")]
  113. public BoardConst.Notify? ReplyWriteNotify { get; set; } = null;
  114. }
  115. /// <summary>
  116. /// 게시판 경험치 설정
  117. /// </summary>
  118. [Owned]
  119. public class BoardExpMeta
  120. {
  121. [DisplayName("경험치 기능")]
  122. [Comment("경험치 기능")]
  123. public bool EnableExp { get; set; } = false;
  124. [DisplayName("경험치 안내")]
  125. [Comment("경험치 안내")]
  126. public bool ShowExpGuide { get; set; } = false;
  127. /*
  128. * 경험치 지급량 조절
  129. */
  130. [DisplayName("게시글 작성")]
  131. [Comment("게시글 작성")]
  132. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  133. public ushort PostWriteExp { get; set; } = 0;
  134. [DisplayName("댓글 작성")]
  135. [Comment("댓글 작성")]
  136. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  137. public ushort CommentWriteExp { get; set; } = 0;
  138. [DisplayName("파일 업로드")]
  139. [Comment("파일 업로드")]
  140. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  141. public ushort FileUploadExp { get; set; } = 0;
  142. [DisplayName("파일 다운로드")]
  143. [Comment("파일 다운로드")]
  144. [Range(-10000, 10000, ErrorMessage = "값은 -10,000 ~ 10,000 사이를 입력합니다.")]
  145. public short FileDownloadExp { get; set; } = 0;
  146. [DisplayName("게시글 읽기")]
  147. [Comment("게시글 읽기")]
  148. [Range(-10000, 10000, ErrorMessage = "값은 -10,000 ~ 10,000 사이를 입력합니다.")]
  149. public short OtherPostReadExp { get; set; } = 0;
  150. [DisplayName("게시글 좋아요")]
  151. [Comment("게시글 좋아요")]
  152. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  153. public ushort OtherPostLikeExp { get; set; } = 0;
  154. [DisplayName("게시글 싫어요")]
  155. [Comment("게시글 싫어요")]
  156. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  157. public ushort OtherPostDisLikeExp { get; set; } = 0;
  158. [DisplayName("댓글 좋아요")]
  159. [Comment("댓글 좋아요")]
  160. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  161. public ushort OtherCommentLikeExp { get; set; } = 0;
  162. [DisplayName("댓글 싫어요")]
  163. [Comment("댓글 싫어요")]
  164. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  165. public ushort OtherCommentDisLikeExp { get; set; } = 0;
  166. [DisplayName("내 게시글 읽힘")]
  167. [Comment("내 게시글 읽힘")]
  168. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  169. public ushort OwnPostReadExp { get; set; } = 0;
  170. [DisplayName("내 게시글 좋아요")]
  171. [Comment("내 게시글 좋아요")]
  172. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  173. public ushort OwnPostLikeExp { get; set; } = 0;
  174. [DisplayName("내 게시글 싫어요")]
  175. [Comment("내 게시글 싫어요")]
  176. [Range(-10000, 10000, ErrorMessage = "값은 -10,000 ~ 10,000 사이를 입력합니다.")]
  177. public short OwnPostDisLikeExp { get; set; } = 0;
  178. [DisplayName("내 댓글 좋아요")]
  179. [Comment("내 댓글 좋아요")]
  180. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  181. public ushort OwnCommentLikeExp { get; set; } = 0;
  182. [DisplayName("내 댓글 싫어요")]
  183. [Comment("내 댓글 싫어요")]
  184. [Range(-10000, 10000, ErrorMessage = "값은 -10,000 ~ 10,000 사이를 입력합니다.")]
  185. public short OwnCommentDisLikeExp { get; set; } = 0;
  186. /*
  187. * 경험치 회수량 조절 (항상 음수 계산)
  188. */
  189. [DisplayName("게시글 작성 취소")]
  190. [Comment("게시글 작성 취소")]
  191. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  192. public ushort PostWriteUndoExp { get; set; } = 0;
  193. [DisplayName("댓글 작성 취소")]
  194. [Comment("댓글 작성 취소")]
  195. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  196. public ushort CommentWriteUndoExp { get; set; } = 0;
  197. [DisplayName("파일 업로드 취소")]
  198. [Comment("파일 업로드 취소")]
  199. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  200. public ushort FileUploadUndoExp { get; set; } = 0;
  201. [DisplayName("게시글 읽기 취소")]
  202. [Comment("게시글 읽기 취소")]
  203. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  204. public ushort OtherPostReadUndoExp { get; set; } = 0;
  205. [DisplayName("게시글 좋아요 취소")]
  206. [Comment("게시글 좋아요 취소")]
  207. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  208. public ushort OtherPostLikeUndoExp { get; set; } = 0;
  209. [DisplayName("게시글 싫어요 취소")]
  210. [Comment("게시글 싫어요 취소")]
  211. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  212. public ushort OtherPostDisLikeUndoExp { get; set; } = 0;
  213. [DisplayName("댓글 좋아요 취소")]
  214. [Comment("댓글 좋아요 취소")]
  215. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  216. public ushort OtherCommentLikeUndoExp { get; set; } = 0;
  217. [DisplayName("댓글 싫어요 취소")]
  218. [Comment("댓글 싫어요 취소")]
  219. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  220. public ushort OtherCommentDisLikeUndoExp { get; set; } = 0;
  221. [DisplayName("내 게시글 읽힘 취소")]
  222. [Comment("내 게시글 읽힘 취소")]
  223. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  224. public ushort OwnPostReadUndoExp { get; set; } = 0;
  225. [DisplayName("내 게시글 좋아요 취소")]
  226. [Comment("내 게시글 좋아요 취소")]
  227. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  228. public ushort OwnPostLikeUndoExp { get; set; } = 0;
  229. [DisplayName("내 게시글 싫어요 취소")]
  230. [Comment("내 게시글 싫어요 취소")]
  231. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  232. public ushort OwnPostDisLikeUndoExp { get; set; } = 0;
  233. [DisplayName("내 댓글 좋아요 취소")]
  234. [Comment("내 댓글 좋아요 취소")]
  235. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  236. public ushort OwnCommentLikeUndoExp { get; set; } = 0;
  237. [DisplayName("내 댓글 싫어요 취소")]
  238. [Comment("내 댓글 싫어요 취소")]
  239. [Range(0, 10000, ErrorMessage = "값은 0 ~ 10,000 사이를 입력합니다.")]
  240. public ushort OwnCommentDisLikeUndoExp { get; set; } = 0;
  241. /*
  242. * 경험치 지급 기한
  243. */
  244. [DisplayName("게시글 작성 기한")]
  245. [Comment("게시글 작성 기한")]
  246. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  247. public ushort PostWriteExpWithinDays { get; set; } = 0;
  248. [DisplayName("댓글 작성 기한")]
  249. [Comment("댓글 작성 기한")]
  250. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  251. public ushort CommentWriteExpWithinDays { get; set; } = 0;
  252. [DisplayName("파일 업로드 기한")]
  253. [Comment("파일 업로드 기한")]
  254. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  255. public ushort FileUploadExpWithinDays { get; set; } = 0;
  256. [DisplayName("게시글 읽기 기한")]
  257. [Comment("게시글 읽기 기한")]
  258. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  259. public ushort OtherPostReadExpWithinDays { get; set; } = 0;
  260. [DisplayName("게시글 좋아요 기한")]
  261. [Comment("게시글 좋아요 기한")]
  262. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  263. public ushort OtherPostLikeExpWithinDays { get; set; } = 0;
  264. [DisplayName("게시글 싫어요 기한")]
  265. [Comment("게시글 싫어요 기한")]
  266. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  267. public ushort OtherPostDisLikeExpWithinDays { get; set; } = 0;
  268. [DisplayName("댓글 좋아요 기한")]
  269. [Comment("댓글 좋아요 기한")]
  270. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  271. public ushort OtherCommentLikeExpWithinDays { get; set; } = 0;
  272. [DisplayName("댓글 싫어요 기한")]
  273. [Comment("댓글 싫어요 기한")]
  274. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  275. public ushort OtherCommentDisLikeExpWithinDays { get; set; } = 0;
  276. [DisplayName("내 게시글 읽힘 기한")]
  277. [Comment("내 게시글 읽힘 기한")]
  278. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  279. public ushort OwnPostReadExpWithinDays { get; set; } = 0;
  280. [DisplayName("내 게시글 좋아요 기한")]
  281. [Comment("내 게시글 좋아요 기한")]
  282. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  283. public ushort OwnPostLikeExpWithinDays { get; set; } = 0;
  284. [DisplayName("내 게시글 싫어요 기한")]
  285. [Comment("내 게시글 싫어요 기한")]
  286. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  287. public ushort OwnPostDisLikeExpWithinDays { get; set; } = 0;
  288. [DisplayName("내 댓글 좋아요 기한")]
  289. [Comment("내 댓글 좋아요 기한")]
  290. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  291. public ushort OwnCommentLikeExpWithinDays { get; set; } = 0;
  292. [DisplayName("내 댓글 싫어요 기한")]
  293. [Comment("내 댓글 싫어요 기한")]
  294. [Range(0, 365, ErrorMessage = "값은 0 ~ 365 사이를 입력합니다.")]
  295. public ushort OwnCommentDisLikeExpWithinDays { get; set; } = 0;
  296. }
  297. /// <summary>
  298. /// 게시판 알림 양식
  299. /// </summary>
  300. [Owned]
  301. public class BoardNotifyTemplateMeta
  302. {
  303. [DisplayName("이메일 제목 - 게시글 작성 시")]
  304. [Comment("이메일 제목 - 게시글 작성 시")]
  305. public string? PostWriteEmailNotifySubject { get; set; } = null;
  306. [DisplayName("이메일 내용 - 게시글 작성 시")]
  307. [Comment("이메일 내용 - 게시글 작성 시")]
  308. public string? PostWriteEmailNotifyContent { get; set; } = null;
  309. [DisplayName("이메일 제목 - 댓글 작성 시")]
  310. [Comment("이메일 제목 - 댓글 작성 시")]
  311. public string? CommentWriteEmailNotifySubject { get; set; } = null;
  312. [DisplayName("이메일 내용 - 댓글 작성 시")]
  313. [Comment("이메일 내용 - 댓글 작성 시")]
  314. public string? CommentWriteEmailNotifyContent { get; set; } = null;
  315. [DisplayName("이메일 제목 - 답글 작성 시")]
  316. [Comment("이메일 제목 - 답글 작성 시")]
  317. public string? ReplyWriteEmailNotifySubject { get; set; } = null;
  318. [DisplayName("이메일 내용 - 답글 작성 시")]
  319. [Comment("이메일 내용 - 답글 작성 시")]
  320. public string? ReplyWriteEmailNotifyContent { get; set; } = null;
  321. }
  322. }