@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
116 lines (112 loc) • 4.85 kB
JavaScript
;
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