UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

106 lines 16.9 kB
import { Injectable } from '@angular/core'; import { AssignPolicy } from '../../task-content/model/policy'; import { PermissionType } from '../../process/permissions'; import * as i0 from "@angular/core"; import * as i1 from "../../user/services/user-comparator.service"; import * as i2 from "../../user/services/user.service"; export class PermissionService { userComparator; _userService; constructor(userComparator, _userService) { this.userComparator = userComparator; this._userService = _userService; } hasTaskPermission(task, permission) { if (!task) { return false; } const rolePermValue = this.checkRolePerms(task.roles, permission); const userPermValue = this.checkUserPerms(task.users, permission); return this.resolvePermissions(rolePermValue, userPermValue); } hasCasePermission(case_, permission) { if (!case_) { return false; } const rolePermValue = this.checkRolePerms(case_.permissions, permission); const userPermValue = this.checkUserPerms(case_.users, permission); return this.resolvePermissions(rolePermValue, userPermValue); } resolvePermissions(rolePermValue, userPermValue) { return userPermValue === undefined ? (!!rolePermValue) : userPermValue; } hasNetPermission(action, net) { if (!net || !net.permissions || !action || !(net.permissions instanceof Object)) { return false; } if (Object.keys(net.permissions).some(role => this._userService.hasRoleById(role) ? net.permissions[role][action] === false : false)) { return false; } return Object.keys(net.permissions).some(role => this._userService.hasRoleById(role) ? !!net.permissions[role][action] : false); } canAssign(task) { return !!task && ((task.assignPolicy === AssignPolicy.manual && !task.userId && this.hasTaskPermission(task, PermissionType.ASSIGN))); } canCancel(task) { return !!task && !!task.userId && this.hasTaskPermission(task, PermissionType.CANCEL) && ((task.assignedUserPolicy === undefined || task.assignedUserPolicy.cancel === undefined) || task.assignedUserPolicy.cancel); } canReassign(task) { return !!task && !!task.userId && this.userComparator.compareUsers(task.userId) && this.hasTaskPermission(task, PermissionType.DELEGATE) && ((task.assignedUserPolicy === undefined || task.assignedUserPolicy.reassign === undefined) || task.assignedUserPolicy.reassign); } canFinish(task) { return !!task && !!task.userId && this.userComparator.compareUsers(task.userId) && this.hasTaskPermission(task, PermissionType.FINISH); } canCollapse(task) { return !!task && task.assignPolicy === AssignPolicy.manual; } checkRolePerms(roles, permission) { let rolePermValue; if (!!roles) { Object.keys(roles).forEach(role => { if (roles[role][permission] !== undefined && this._userService.hasRoleById(role)) { rolePermValue = rolePermValue === undefined ? roles[role][permission] : rolePermValue && roles[role][permission]; } }); } return rolePermValue; } checkUserPerms(users, permission) { let userPermValue; if (!!users) { const loggedUserId = this._userService.user.getSelfOrImpersonated().id; Object.keys(users).forEach(user => { if (user === loggedUserId && users[user][permission] !== undefined) { userPermValue = userPermValue === undefined ? users[user][permission] : userPermValue && users[user][permission]; } }); } return userPermValue; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionService, deps: [{ token: i1.UserComparatorService }, { token: i2.UserService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.UserComparatorService }, { type: i2.UserService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9hdXRob3JpemF0aW9uL3Blcm1pc3Npb24vcGVybWlzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBSzdELE9BQU8sRUFBYyxjQUFjLEVBQWtCLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFLdkYsTUFBTSxPQUFPLGlCQUFpQjtJQUVKO0lBQWlEO0lBQXZFLFlBQXNCLGNBQXFDLEVBQVksWUFBeUI7UUFBMUUsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQVksaUJBQVksR0FBWixZQUFZLENBQWE7SUFDaEcsQ0FBQztJQUVNLGlCQUFpQixDQUFDLElBQXNCLEVBQUUsVUFBa0I7UUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEtBQXVCLEVBQUUsVUFBa0I7UUFDaEUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENB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QUFDLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM5QixJQUFJLElBQUksS0FBSyxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDaEUsYUFBYSxHQUFHLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQzt3QkFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUMxRTtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO3dHQTNHUSxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZkLE1BQU07OzRGQUVULGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVc2VyQ29tcGFyYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci1jb21wYXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtBc3NpZ25Qb2xpY3l9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC9wb2xpY3knO1xuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3Rhc2snO1xuaW1wb3J0IHtVc2VyU2VydmljZX0gZnJvbSAnLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtQZXRyaU5ldFJlZmVyZW5jZVdpdGhQZXJtaXNzaW9uc30gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wZXRyaS1uZXQtcmVmZXJlbmNlLXdpdGgtcGVybWlzc2lvbnMnO1xuaW1wb3J0IHtQZXJtaXNzaW9ucywgUGVybWlzc2lvblR5cGUsIFVzZXJQZXJtaXNzaW9uc30gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wZXJtaXNzaW9ucyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVzZXJDb21wYXJhdG9yOiBVc2VyQ29tcGFyYXRvclNlcnZpY2UsIHByb3RlY3RlZCBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1Rhc2tQZXJtaXNzaW9uKHRhc2s6IFRhc2sgfCB1bmRlZmluZWQsIHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRhc2spIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvbGVQZXJtVmFsdWUgPSB0aGlzLmNoZWNrUm9sZVBlcm1zKHRhc2sucm9sZXMsIHBlcm1pc3Npb24pO1xuICAgICAgICBjb25zdCB1c2VyUGVybVZhbHVlID0gdGhpcy5jaGVja1VzZXJQZXJtcyh0YXNrLnVzZXJzLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVBlcm1pc3Npb25zKHJvbGVQZXJtVmFsdWUsIHVzZXJQZXJtVmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNDYXNlUGVybWlzc2lvbihjYXNlXzogQ2FzZSB8IHVuZGVmaW5lZCwgcGVybWlzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghY2FzZV8pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvbGVQZXJtVmFsdWUgPSB0aGlzLmNoZWNrUm9sZVBlcm1zKGNhc2VfLnBlcm1pc3Npb25zLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgY29uc3QgdXNlclBlcm1WYWx1ZSA9IHRoaXMuY2hlY2tVc2VyUGVybXMoY2FzZV8udXNlcnMsIHBlcm1pc3Npb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUGVybWlzc2lvbnMocm9sZVBlcm1WYWx1ZSwgdXNlclBlcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVQZXJtaXNzaW9ucyhyb2xlUGVybVZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkLCB1c2VyUGVybVZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB1c2VyUGVybVZhbHVlID09PSB1bmRlZmluZWQgPyAoISFyb2xlUGVybVZhbHVlKSA6IHVzZXJQZXJtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05ldFBlcm1pc3Npb24oYWN0aW9uOiBzdHJpbmcsIG5ldDogUGV0cmlOZXRSZWZlcmVuY2VXaXRoUGVybWlzc2lvbnMpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFuZXRcbiAgICAgICAgICAgIHx8ICFuZXQucGVybWlzc2lvbnNcbiAgICAgICAgICAgIHx8ICFhY3Rpb25cbiAgICAgICAgICAgIHx8ICEobmV0LnBlcm1pc3Npb25zIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobmV0LnBlcm1pc3Npb25zKS5zb21lKHJvbGUgPT5cbiAgICAgICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlLmhhc1JvbGVCeUlkKHJvbGUpID8gbmV0LnBlcm1pc3Npb25zW3JvbGVdW2FjdGlvbl0gPT09IGZhbHNlIDogZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG5ldC5wZXJtaXNzaW9ucykuc29tZShyb2xlID0+XG4gICAgICAgICAgICB0aGlzLl91c2VyU2VydmljZS5oYXNSb2xlQnlJZChyb2xlKSA/ICEhbmV0LnBlcm1pc3Npb25zW3JvbGVdW2FjdGlvbl0gOiBmYWxzZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5Bc3NpZ24odGFzazogVGFzayB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0YXNrXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICB0YXNrLmFzc2lnblBvbGljeSA9PT0gQXNzaWduUG9saWN5Lm1hbnVhbFxuICAgICAgICAgICAgICAgICAgICAmJiAhdGFzay51c2VySWRcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5oYXNUYXNrUGVybWlzc2lvbih0YXNrLCBQZXJtaXNzaW9uVHlwZS5BU1NJR04pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ2FuY2VsKHRhc2s6IFRhc2sgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGFzayAmJiAhIXRhc2sudXNlcklkXG4gICAgICAgICAgICAmJiB0aGlzLmhhc1Rhc2tQZXJtaXNzaW9uKHRhc2ssIFBlcm1pc3Npb25UeXBlLkNBTkNFTClcbiAgICAgICAgICAgICYmICgodGFzay5hc3NpZ25lZFVzZXJQb2xpY3kgPT09IHVuZGVmaW5lZCB8fCB0YXNrLmFzc2lnbmVkVXNlclBvbGljeS5jYW5jZWwgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB8fCB0YXNrLmFzc2lnbmVkVXNlclBvbGljeS5jYW5jZWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5SZWFzc2lnbih0YXNrOiBUYXNrIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRhc2sgJiYgISF0YXNrLnVzZXJJZCAmJiB0aGlzLnVzZXJDb21wYXJhdG9yLmNvbXBhcmVVc2Vycyh0YXNrLnVzZXJJZClcbiAgICAgICAgICAgICYmIHRoaXMuaGFzVGFza1Blcm1pc3Npb24odGFzaywgUGVybWlzc2lvblR5cGUuREVMRUdBVEUpXG4gICAgICAgICAgICAmJiAoKHRhc2suYXNzaWduZWRVc2VyUG9saWN5ID09PSB1bmRlZmluZWQgfHwgdGFzay5hc3NpZ25lZFVzZXJQb2xpY3kucmVhc3NpZ24gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB8fCB0YXNrLmFzc2lnbmVkVXNlclBvbGljeS5yZWFzc2lnbik7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkZpbmlzaCh0YXNrOiBUYXNrIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRhc2tcbiAgICAgICAgICAgICYmICEhdGFzay51c2VySWRcbiAgICAgICAgICAgICYmIHRoaXMudXNlckNvbXBhcmF0b3IuY29tcGFyZVVzZXJzKHRhc2sudXNlcklkKVxuICAgICAgICAgICAgJiYgdGhpcy5oYXNUYXNrUGVybWlzc2lvbih0YXNrLCBQZXJtaXNzaW9uVHlwZS5GSU5JU0gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5Db2xsYXBzZSh0YXNrOiBUYXNrIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRhc2tcbiAgICAgICAgICAgICYmIHRhc2suYXNzaWduUG9saWN5ID09PSBBc3NpZ25Qb2xpY3kubWFudWFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVja1JvbGVQZXJtcyhyb2xlczogUGVybWlzc2lvbnMsIHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgcm9sZVBlcm1WYWx1ZTogYm9vbGVhbjtcbiAgICAgICAgaWYgKCEhcm9sZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHJvbGVzKS5mb3JFYWNoKHJvbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlc1tyb2xlXVtwZXJtaXNzaW9uXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3VzZXJTZXJ2aWNlLmhhc1JvbGVCeUlkKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVQZXJtVmFsdWUgPSByb2xlUGVybVZhbHVlID09PSB1bmRlZmluZWQgPyByb2xlc1tyb2xlXVtwZXJtaXNzaW9uXSA6IHJvbGVQZXJtVmFsdWUgJiYgcm9sZXNbcm9sZV1bcGVybWlzc2lvbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVQZXJtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrVXNlclBlcm1zKHVzZXJzOiBVc2VyUGVybWlzc2lvbnMsIHBlcm1pc3Npb24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHVzZXJQZXJtVmFsdWU6IGJvb2xlYW47XG4gICAgICAgIGlmICghIXVzZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2dnZWRVc2VySWQgPSB0aGlzLl91c2VyU2VydmljZS51c2VyLmdldFNlbGZPckltcGVyc29uYXRlZCgpLmlkO1xuICAgICAgICAgICAgT2JqZWN0LmtleXModXNlcnMpLmZvckVhY2godXNlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIgPT09IGxvZ2dlZFVzZXJJZCAmJiB1c2Vyc1t1c2VyXVtwZXJtaXNzaW9uXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJQZXJtVmFsdWUgPSB1c2VyUGVybVZhbHVlID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbdXNlcl1bcGVybWlzc2lvbl0gOiB1c2VyUGVybVZhbHVlICYmIHVzZXJzW3VzZXJdW3Blcm1pc3Npb25dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1c2VyUGVybVZhbHVlO1xuICAgIH1cbn1cbiJdfQ==