58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
import Base from './base.js';
|
|
import permissionCatalog from '../helpers/permission-catalog.ee.js';
|
|
|
|
class Permission extends Base {
|
|
static tableName = 'permissions';
|
|
|
|
static jsonSchema = {
|
|
type: 'object',
|
|
required: ['roleId', 'action', 'subject'],
|
|
|
|
properties: {
|
|
id: { type: 'string', format: 'uuid' },
|
|
roleId: { type: 'string', format: 'uuid' },
|
|
action: { type: 'string', minLength: 1 },
|
|
subject: { type: 'string', minLength: 1 },
|
|
conditions: { type: 'array', items: { type: 'string' } },
|
|
createdAt: { type: 'string' },
|
|
updatedAt: { type: 'string' },
|
|
},
|
|
};
|
|
|
|
static filter(permissions) {
|
|
const sanitizedPermissions = permissions.filter((permission) => {
|
|
const { action, subject, conditions } = permission;
|
|
|
|
const relevantAction = this.findAction(action);
|
|
const validSubject = this.isSubjectValid(subject, relevantAction);
|
|
const validConditions = this.areConditionsValid(conditions);
|
|
|
|
return relevantAction && validSubject && validConditions;
|
|
});
|
|
|
|
return sanitizedPermissions;
|
|
}
|
|
|
|
static findAction(action) {
|
|
return permissionCatalog.actions.find(
|
|
(actionCatalogItem) => actionCatalogItem.key === action
|
|
);
|
|
}
|
|
|
|
static isSubjectValid(subject, action) {
|
|
return action && action.subjects.includes(subject);
|
|
}
|
|
|
|
static areConditionsValid(conditions) {
|
|
return conditions.every((condition) => this.isConditionValid(condition));
|
|
}
|
|
|
|
static isConditionValid(condition) {
|
|
return !!permissionCatalog.conditions.find(
|
|
(conditionCatalogItem) => conditionCatalogItem.key === condition
|
|
);
|
|
}
|
|
}
|
|
|
|
export default Permission;
|