BoardPermissionService.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Forum;
  3. using Domain.Entities.Forum.Boards;
  4. using Domain.Entities.Members;
  5. using Microsoft.EntityFrameworkCore;
  6. namespace Infrastructure.Forum;
  7. public sealed class BoardPermissionService(IAppDbContext db) : IBoardPermissionService
  8. {
  9. public async Task<short> GetMemberPermissionLevelAsync(Member member, int boardID, CancellationToken ct)
  10. {
  11. // 최고관리자인가?
  12. if (member.IsAdmin)
  13. {
  14. return 1000;
  15. }
  16. // 게시판 매니저인가?
  17. var isManager = await db.BoardManager.AsNoTracking().AnyAsync(x => x.BoardID == boardID && x.MemberID == member.ID, ct);
  18. if (isManager)
  19. {
  20. return 99;
  21. }
  22. // 회원 등급이 높은가 ?
  23. if (member.MemberGradeID.HasValue)
  24. {
  25. var grade = await db.MemberGrade.AsNoTracking().FirstOrDefaultAsync(x => x.ID == member.MemberGradeID.Value, ct);
  26. if (grade != null)
  27. {
  28. if (!grade.IsActive)
  29. {
  30. return -2; // 비활성 등급은 차단
  31. }
  32. }
  33. return grade?.Order ?? 0;
  34. }
  35. return 0;
  36. }
  37. public async Task<bool> HasPermissionAsync(Member member, int boardID, short requiredPermission, CancellationToken ct)
  38. {
  39. // 비회원 허용
  40. if (requiredPermission <= -1)
  41. {
  42. return true;
  43. }
  44. var level = await GetMemberPermissionLevelAsync(member, boardID, ct);
  45. return level >= requiredPermission;
  46. }
  47. public async Task<BoardManager?> GetBoardManagerAsync(int boardID, int memberID, CancellationToken ct)
  48. {
  49. return await db.BoardManager.AsNoTracking().FirstOrDefaultAsync(x => x.BoardID == boardID && x.MemberID == memberID, ct);
  50. }
  51. }