|
25 | 25 | * @returns {promise} $q.promise object
|
26 | 26 | */
|
27 | 27 | function authorize(permissionsMap, toParams) {
|
| 28 | + |
| 29 | + if (isCompensatedMap(permissionsMap)) { |
| 30 | + return authorizeCompensatedMap(permissionsMap, toParams); |
| 31 | + } |
| 32 | + |
| 33 | + return authorizeDecompensatedMap(permissionsMap, toParams); |
| 34 | + } |
| 35 | + |
| 36 | + /** |
| 37 | + * Checks if provided map is compensated or not |
| 38 | + * |
| 39 | + * @param permissionMap {Object} Map of permission names |
| 40 | + * @returns {boolean} |
| 41 | + */ |
| 42 | + function isCompensatedMap(permissionMap) { |
| 43 | + return !!((angular.isArray(permissionMap.only[0])) || angular.isArray(permissionMap.except[0])); |
| 44 | + } |
| 45 | + |
| 46 | + |
| 47 | + /** |
| 48 | + * Checks authorization for complex state inheritance |
| 49 | + * @method |
| 50 | + * @private |
| 51 | + * |
| 52 | + * @param permissionMap {Object} Map of permission names |
| 53 | + * @param [toParams] {Object} UI-Router params object |
| 54 | + * |
| 55 | + * @returns {promise} $q.promise object |
| 56 | + */ |
| 57 | + function authorizeCompensatedMap(permissionMap, toParams) { |
28 | 58 | var deferred = $q.defer();
|
29 | 59 |
|
30 |
| - var exceptPromises = resolveAccessRights(permissionsMap.except, toParams); |
| 60 | + var exceptPromises = resolveAccessRights(permissionMap.except, toParams); |
31 | 61 |
|
32 | 62 | $q.all(exceptPromises)
|
33 | 63 | .then(function (rejectedPermissions) {
|
34 | 64 | deferred.reject(rejectedPermissions);
|
35 | 65 | })
|
36 | 66 | .catch(function () {
|
37 |
| - if (!permissionsMap.only.length) { |
| 67 | + if (!permissionMap.only.length) { |
38 | 68 | deferred.resolve(null);
|
39 | 69 | }
|
40 | 70 |
|
41 |
| - var onlyPromises = resolveAccessRights(permissionsMap.only, toParams); |
| 71 | + var onlyPromises = resolveAccessRights(permissionMap.only, toParams); |
42 | 72 |
|
43 | 73 | $q.all(onlyPromises)
|
44 | 74 | .then(function (resolvedPermissions) {
|
|
52 | 82 | return deferred.promise;
|
53 | 83 | }
|
54 | 84 |
|
| 85 | + /** |
| 86 | + * Checks authorization for simple view based access |
| 87 | + * @method |
| 88 | + * @private |
| 89 | + * |
| 90 | + * @param permissionMap {Object} Map of permission names |
| 91 | + * @param [toParams] {Object} UI-Router params object |
| 92 | + * |
| 93 | + * @returns {promise} $q.promise object |
| 94 | + */ |
| 95 | + function authorizeDecompensatedMap(permissionMap, toParams) { |
| 96 | + var deferred = $q.defer(); |
| 97 | + var exceptPromises = resolveStateAccessRights(permissionMap.except, toParams); |
| 98 | + |
| 99 | + only(exceptPromises) |
| 100 | + .then(function (rejectedPermissions) { |
| 101 | + deferred.reject(rejectedPermissions); |
| 102 | + }) |
| 103 | + .catch(function () { |
| 104 | + if (!permissionMap.only.length) { |
| 105 | + deferred.resolve(null); |
| 106 | + } |
| 107 | + |
| 108 | + var onlyPromises = resolveStateAccessRights(permissionMap.only, toParams); |
| 109 | + |
| 110 | + only(onlyPromises) |
| 111 | + .then(function (resolvedPermissions) { |
| 112 | + deferred.resolve(resolvedPermissions); |
| 113 | + }) |
| 114 | + .catch(function (rejectedPermission) { |
| 115 | + deferred.reject(rejectedPermission); |
| 116 | + }); |
| 117 | + }); |
| 118 | + |
| 119 | + return deferred.promise; |
| 120 | + } |
| 121 | + |
55 | 122 | /**
|
56 | 123 | * Performs iteration over list of defined access rights looking for matches
|
57 | 124 | * @method
|
|
63 | 130 | * @returns {Array} Promise collection
|
64 | 131 | */
|
65 | 132 | function resolveAccessRights(accessRightSet, toParams) {
|
66 |
| - if (accessRightSet.length === 0) { |
| 133 | + if (!accessRightSet.length) { |
67 | 134 | return [$q.reject()];
|
68 | 135 | }
|
69 | 136 |
|
|
83 | 150 | * @returns {Array}
|
84 | 151 | */
|
85 | 152 | function resolveStateAccessRights(stateAccessRights, toParams) {
|
| 153 | + if (stateAccessRights.length === 0) { |
| 154 | + return []; |
| 155 | + } |
| 156 | + |
86 | 157 | return stateAccessRights.map(function (accessRightName) {
|
87 | 158 | if (RoleStore.hasRoleDefinition(accessRightName)) {
|
88 | 159 | var role = RoleStore.getRoleDefinition(accessRightName);
|
|
0 commit comments