permissions.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. * Role-Based Access Control (RBAC) helpers.
  3. *
  4. * @typedef {Object} Session
  5. * @property {"branch"|"admin"|"dev"|string} role
  6. * @property {string=} branchId
  7. */
  8. /**
  9. * Returns true if the given session is allowed to access the requested branch.
  10. *
  11. * Rules:
  12. * - No session => not allowed (caller should return 401)
  13. * - role "branch" => allowed only for session.branchId === branchId
  14. * - role "admin" / "dev" => allowed for any branch
  15. *
  16. * @param {Session|null} session
  17. * @param {string} branchId
  18. * @returns {boolean}
  19. */
  20. export function canAccessBranch(session, branchId) {
  21. if (!session) return false;
  22. if (!branchId) return false;
  23. if (session.role === "branch") {
  24. return session.branchId === branchId;
  25. }
  26. if (session.role === "admin" || session.role === "dev") {
  27. return true;
  28. }
  29. return false;
  30. }
  31. /**
  32. * Filters a list of branch IDs for a session.
  33. *
  34. * - No session => []
  35. * - role "branch" => [session.branchId] if present in branchIds, else []
  36. * - role "admin" / "dev" => all branchIds
  37. *
  38. * @param {Session|null} session
  39. * @param {string[]} branchIds
  40. * @returns {string[]}
  41. */
  42. export function filterBranchesForSession(session, branchIds) {
  43. if (!session) return [];
  44. if (!Array.isArray(branchIds)) return [];
  45. if (session.role === "branch") {
  46. const own = session.branchId;
  47. if (!own) return [];
  48. return branchIds.includes(own) ? [own] : [];
  49. }
  50. if (session.role === "admin" || session.role === "dev") {
  51. return branchIds;
  52. }
  53. return [];
  54. }