Newer
Older
express-blog / src / utils / evaluateRules.js
// src/utils/evaluateRules.js

/**
 * Validates a single rule string against identity and groups.
 */
function checkRule(rule, identity, groups) {
  const [type, value] = rule.split(":");
  if (type === "group") return groups.includes(value);
  if (type === "user") return identity === value;
  return false;
}

/**
 * Evaluates access rules against the current identity context.
 * * Rules:
 * - Outer array: Logical OR (Success if any requirement block passes)
 * - Inner array: Logical AND (Success if all rules in the block pass)
 * * @param {Array<Array<string>>} rules - Nested rule set
 * @param {Object} auth - { isAuthenticated, user, groups }
 */
function evaluateRules(rules, session) {
  if (!rules || !rules.length) return true;

  // Map identity from standard OIDC claims (preferred_username/name)
  const identity = session.user || session.preferred_username || session.name;
  const groups = session.groups || [];

  return rules.some((requirement) =>
    requirement.every((rule) => checkRule(rule, identity, groups)),
  );
}
module.exports = { evaluateRules };