permission.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import BoardMeta from '@/types/forum/boardMeta';
  2. import BoardManager from '@/types/forum/boardManager';
  3. import { MemberResponse } from '@/types/response/account/member';
  4. import { BoardLayout } from '@/constants/forum';
  5. // 최고관리자 또는 게시판 관리자 여부 확인
  6. export function isBoardAdmin(
  7. boardManagers: BoardManager[],
  8. member: MemberResponse|null
  9. ): boolean {
  10. if (!member) {
  11. return false;
  12. }
  13. if (member.isAdmin) {
  14. return true;
  15. }
  16. return boardManagers ? boardManagers.some(m => m.user.email === member.email) : false;
  17. }
  18. type PermissionResult = {
  19. canAccessBoard: boolean;
  20. canViewPost: boolean;
  21. canWritePost: boolean;
  22. canViewComment: boolean;
  23. canWriteComment: boolean;
  24. canWriteReply: boolean;
  25. canUploadFile: boolean;
  26. canDownloadFile: boolean;
  27. };
  28. export function checkPermission(
  29. boardMeta: BoardMeta,
  30. boardManagers: BoardManager[],
  31. member: MemberResponse|null
  32. ): PermissionResult {
  33. const isQnABoard = boardMeta.list.layout === BoardLayout.QnA;
  34. const check = (permission: number, qnaRestricted = false): boolean =>
  35. {
  36. // 비회원은 항상 허용
  37. if (permission <= -1) {
  38. return true;
  39. }
  40. // 비로그인은 거부
  41. if (!member) {
  42. return false;
  43. }
  44. // 최고관리자는 항상 허용
  45. if (member.isAdmin) {
  46. return true;
  47. }
  48. // 게시판 관리자 여부
  49. const isBoardManager = boardManagers?.some(m => m.user.email === member.email) ?? false;
  50. // 1:1 게시판: 최고관리자/게시판 관리자만 허용 (일반 회원 거부)
  51. if (qnaRestricted && isQnABoard) {
  52. return isBoardManager;
  53. }
  54. // 유효 권한 레벨 계산 (매니저=99, 일반=memberGrade.order)
  55. const level = isBoardManager ? 99 : (member.memberGrade?.order ?? 0);
  56. return permission <= level;
  57. };
  58. return {
  59. canAccessBoard: check(boardMeta.permission.boardAccess),
  60. canViewPost: check(boardMeta.permission.postView),
  61. canWritePost: check(boardMeta.permission.postWrite),
  62. canViewComment: check(boardMeta.permission.commentView),
  63. canWriteComment: check(boardMeta.permission.commentWrite, true),
  64. canWriteReply: check(boardMeta.permission.replyWrite, true),
  65. canUploadFile: check(boardMeta.permission.fileUpload),
  66. canDownloadFile: check(boardMeta.permission.fileDownload)
  67. };
  68. }