UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

116 lines (112 loc) 4.85 kB
'use strict'; var base_class = require('../../subscriber/base.class.js'); require('../../../../enum/class/authorization/cache-mode.enum.js'); require('../../../../enum/class/authorization/decision-type.enum.js'); var effect_enum = require('../../../../enum/class/authorization/effect.enum.js'); require('../../../../enum/class/authorization/mode.enum.js'); var permissionMatch_enum = require('../../../../enum/class/authorization/permission-match.enum.js'); require('../../../../enum/class/authorization/policy/attachment-type.enum.js'); require('../../../../enum/class/authorization/policy/on-type.enum.js'); require('../../../../enum/class/authorization/policy/source-type.enum.js'); require('../../../../enum/class/authorization/policy/status.enum.js'); require('../../../../enum/class/authorization/principal-type.enum.js'); var setMatches_utility = require('../../../../utility/authorization/permission/set-matches.utility.js'); require('typeorm'); /** * Base class for all authorization policies. It mirrors ApiFunctionSubscriberBase * and provides helper methods to create allow/deny rules that are later executed by the policy executor. * @template E - Entity type extending IApiBaseEntity */ class ApiAuthorizationPolicyBase extends base_class.ApiSubscriberBase { allow(rule = {}) { return [ { effect: effect_enum.EApiPolicyEffect.ALLOW, ...rule, }, ]; } allowForPermissions(requiredPermissions, options = {}) { const permissionOptions = options; const matchMode = permissionOptions.match ?? permissionMatch_enum.EApiAuthorizationPermissionMatch.ANY; return [ { condition: async (context) => { if (!setMatches_utility.AuthorizationPermissionSetMatches(context.permissions, requiredPermissions, { match: matchMode })) { return false; } if (!permissionOptions.condition) { return true; } const result = await permissionOptions.condition(context); return result === true; }, description: permissionOptions.description, effect: effect_enum.EApiPolicyEffect.ALLOW, priority: permissionOptions.priority, resultTransform: permissionOptions.resultTransform, scope: permissionOptions.scope, }, ]; } allowForRoles(roles, rule = {}) { return [ { condition: ({ principal }) => roles.some((role) => principal.roles.includes(role)), effect: effect_enum.EApiPolicyEffect.ALLOW, ...rule, }, ]; } deny(rule = {}) { return [ { effect: effect_enum.EApiPolicyEffect.DENY, ...rule, }, ]; } denyForPermissions(requiredPermissions, options = {}) { const permissionOptions = options; const matchMode = permissionOptions.match ?? permissionMatch_enum.EApiAuthorizationPermissionMatch.ANY; return [ { condition: async (context) => { if (!setMatches_utility.AuthorizationPermissionSetMatches(context.permissions, requiredPermissions, { match: matchMode })) { return false; } if (!permissionOptions.condition) { return true; } const result = await permissionOptions.condition(context); return result === true; }, description: permissionOptions.description, effect: effect_enum.EApiPolicyEffect.DENY, priority: permissionOptions.priority, resultTransform: permissionOptions.resultTransform, scope: permissionOptions.scope, }, ]; } scopeToOwner(ownerField = "ownerId", rule = {}, options = {}) { const ownerFieldName = String(ownerField); const isRelation = options.isRelation ?? !ownerFieldName.endsWith("Id"); return [ { effect: effect_enum.EApiPolicyEffect.ALLOW, scope: ({ principal }) => { const ownerCondition = isRelation ? { id: principal.id } : principal.id; return { where: { [ownerFieldName]: ownerCondition, }, }; }, ...rule, }, ]; } } exports.ApiAuthorizationPolicyBase = ApiAuthorizationPolicyBase; //# sourceMappingURL=base.class.js.map