@forestadmin/agent 1.0.0-alpha.1 → 1.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/routes/access/chart.js +3 -3
  2. package/dist/routes/access/count-related.js +2 -2
  3. package/dist/routes/access/count.js +2 -2
  4. package/dist/routes/access/csv-related.js +2 -2
  5. package/dist/routes/access/csv.js +2 -2
  6. package/dist/routes/access/get.js +2 -2
  7. package/dist/routes/access/list-related.js +2 -2
  8. package/dist/routes/access/list.js +2 -2
  9. package/dist/routes/modification/action.js +2 -2
  10. package/dist/routes/modification/associate-related.js +2 -2
  11. package/dist/routes/modification/create.js +2 -2
  12. package/dist/routes/modification/delete.js +2 -2
  13. package/dist/routes/modification/dissociate-delete-related.js +2 -2
  14. package/dist/routes/modification/update-field.js +2 -2
  15. package/dist/routes/modification/update-relation.js +3 -3
  16. package/dist/routes/modification/update.js +2 -2
  17. package/dist/routes/security/scope-invalidation.js +2 -2
  18. package/dist/services/authorization/authorization.d.ts +7 -1
  19. package/dist/services/authorization/authorization.js +29 -2
  20. package/dist/services/authorization/index.js +6 -2
  21. package/dist/services/authorization/internal/generate-actions-from-permissions.js +3 -3
  22. package/dist/services/authorization/internal/generate-user-scope.d.ts +4 -0
  23. package/dist/services/authorization/internal/generate-user-scope.js +36 -0
  24. package/dist/services/authorization/internal/hash-chart.d.ts +4 -0
  25. package/dist/services/authorization/internal/hash-chart.js +48 -0
  26. package/dist/services/authorization/internal/rendering-permission.d.ts +26 -0
  27. package/dist/services/authorization/internal/rendering-permission.js +77 -0
  28. package/dist/services/authorization/internal/types.d.ts +167 -3
  29. package/dist/services/authorization/internal/types.js +13 -3
  30. package/dist/services/authorization/internal/user-permission.d.ts +12 -0
  31. package/dist/services/authorization/internal/user-permission.js +35 -0
  32. package/dist/services/index.d.ts +0 -2
  33. package/dist/services/index.js +1 -3
  34. package/dist/utils/forest-http-api.d.ts +2 -28
  35. package/dist/utils/forest-http-api.js +9 -78
  36. package/package.json +4 -3
  37. package/dist/services/permissions.d.ts +0 -19
  38. package/dist/services/permissions.js +0 -85
@@ -6,11 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CustomActionEvent = void 0;
7
7
  const action_permission_1 = __importDefault(require("./internal/action-permission"));
8
8
  const authorization_1 = __importDefault(require("./authorization"));
9
+ const rendering_permission_1 = __importDefault(require("./internal/rendering-permission"));
10
+ const user_permission_1 = __importDefault(require("./internal/user-permission"));
9
11
  function authorizationServiceFactory(options) {
10
12
  const actionPermissionService = new action_permission_1.default(options);
11
- return new authorization_1.default(actionPermissionService);
13
+ const userPermissionService = new user_permission_1.default(options);
14
+ const renderingPermissionService = new rendering_permission_1.default(options, userPermissionService);
15
+ return new authorization_1.default(actionPermissionService, renderingPermissionService);
12
16
  }
13
17
  exports.default = authorizationServiceFactory;
14
18
  var types_1 = require("./internal/types");
15
19
  Object.defineProperty(exports, "CustomActionEvent", { enumerable: true, get: function () { return types_1.CustomActionEvent; } });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvYXV0aG9yaXphdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxxRkFBbUU7QUFDbkUsb0VBQW1EO0FBRW5ELFNBQXdCLDJCQUEyQixDQUNqRCxPQUFpQztJQUVqQyxNQUFNLHVCQUF1QixHQUFHLElBQUksMkJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckUsT0FBTyxJQUFJLHVCQUFvQixDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDM0QsQ0FBQztBQU5ELDhDQU1DO0FBRUQsMENBQWlHO0FBQXhGLDBHQUFBLGlCQUFpQixPQUFBIn0=
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvYXV0aG9yaXphdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxxRkFBbUU7QUFDbkUsb0VBQW1EO0FBQ25ELDJGQUF5RTtBQUN6RSxpRkFBK0Q7QUFFL0QsU0FBd0IsMkJBQTJCLENBQ2pELE9BQWlDO0lBRWpDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSwyQkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRSxNQUFNLHFCQUFxQixHQUFHLElBQUkseUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLDhCQUEwQixDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBRWxHLE9BQU8sSUFBSSx1QkFBb0IsQ0FBQyx1QkFBdUIsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFSRCw4Q0FRQztBQUVELDBDQUFpRztBQUF4RiwwR0FBQSxpQkFBaUIsT0FBQSJ9
@@ -53,8 +53,8 @@ function getUsersForRoles(roles, userIdsByRole) {
53
53
  }, []));
54
54
  }
55
55
  function generateActionsAllowedByUser(permissions, users) {
56
- const userIdsByRole = users.reduce((acc, user) => {
57
- acc.set(user.roleId, [...(acc.get(user.roleId) || []), user.id]);
56
+ const userIdsByRole = users.reduce((acc, { id, roleId }) => {
57
+ acc.set(roleId, [...(acc.get(roleId) || []), id]);
58
58
  return acc;
59
59
  }, new Map());
60
60
  return new Map(Object.entries(permissions)
@@ -84,4 +84,4 @@ function generateActionsFromPermissions(environmentPermissions, users) {
84
84
  };
85
85
  }
86
86
  exports.default = generateActionsFromPermissions;
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtYWN0aW9ucy1mcm9tLXBlcm1pc3Npb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2F1dGhvcml6YXRpb24vaW50ZXJuYWwvZ2VuZXJhdGUtYWN0aW9ucy1mcm9tLXBlcm1pc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBVWlCO0FBQ2pCLDZFQUdzQztBQVl0QyxTQUFTLDZCQUE2QixDQUNwQyxXQUFnRDtJQUVoRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLEVBQUUsRUFBRTtRQUN2RixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcscUJBQXFCLENBQUM7UUFFN0MsT0FBTztZQUNMLEdBQUcsR0FBRztZQUNOLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDOUUsVUFBVSxDQUFDLGFBQWE7WUFDMUIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUM1RSxVQUFVLENBQUMsV0FBVztZQUN4QixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzVFLFVBQVUsQ0FBQyxXQUFXO1lBQ3hCLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDM0UsVUFBVSxDQUFDLFVBQVU7WUFDdkIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUM5RSxVQUFVLENBQUMsYUFBYTtZQUMxQixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMs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
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtYWN0aW9ucy1mcm9tLXBlcm1pc3Npb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2F1dGhvcml6YXRpb24vaW50ZXJuYWwvZ2VuZXJhdGUtYWN0aW9ucy1mcm9tLXBlcm1pc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBVWlCO0FBQ2pCLDZFQUdzQztBQVl0QyxTQUFTLDZCQUE2QixDQUNwQyxXQUFnRDtJQUVoRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLEVBQUUsRUFBRTtRQUN2RixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcscUJBQXFCLENBQUM7UUFFN0MsT0FBTztZQUNMLEdBQUcsR0FBRztZQUNOLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDOUUsVUFBVSxDQUFDLGFBQWE7WUFDMUIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUM1RSxVQUFVLENBQUMsV0FBVztZQUN4QixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzVFLFVBQVUsQ0FBQyxXQUFXO1lBQ3hCLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDM0UsVUFBVSxDQUFDLFVBQVU7WUFDdkIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUM5RSxVQUFVLENBQUMsYUFBYTtZQUMxQixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMs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
@@ -0,0 +1,4 @@
1
+ import { GenericTree } from '@forestadmin/datasource-toolkit';
2
+ import { Team, UserPermissionV4 } from './types';
3
+ export default function generateUserScope(filter: GenericTree | null, team: Team, user: UserPermissionV4): GenericTree;
4
+ //# sourceMappingURL=generate-user-scope.d.ts.map
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const USER_VALUE_PREFIX = '$currentUser.';
4
+ const USER_VALUE_TAG_PREFIX = '$currentUser.tags.';
5
+ const USER_VALUE_TEAM_PREFIX = '$currentUser.team.';
6
+ function generateUserValue(value, team, user) {
7
+ if (typeof value !== 'string' || !value.startsWith(USER_VALUE_PREFIX)) {
8
+ return value;
9
+ }
10
+ if (value.startsWith(USER_VALUE_TEAM_PREFIX)) {
11
+ return team[value.slice(USER_VALUE_TEAM_PREFIX.length)];
12
+ }
13
+ if (value.startsWith(USER_VALUE_TAG_PREFIX)) {
14
+ return user?.tags?.[value.substring(USER_VALUE_TAG_PREFIX.length)];
15
+ }
16
+ return user?.[value.substring(USER_VALUE_PREFIX.length)];
17
+ }
18
+ function generateUserScope(filter, team, user) {
19
+ if (!filter) {
20
+ return null;
21
+ }
22
+ const branch = filter;
23
+ if (branch.aggregator) {
24
+ return {
25
+ ...filter,
26
+ conditions: branch.conditions.map(condition => generateUserScope(condition, team, user)),
27
+ };
28
+ }
29
+ const leaf = filter;
30
+ return {
31
+ ...filter,
32
+ value: generateUserValue(leaf.value, team, user),
33
+ };
34
+ }
35
+ exports.default = generateUserScope;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtdXNlci1zY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9hdXRob3JpemF0aW9uL2ludGVybmFsL2dlbmVyYXRlLXVzZXItc2NvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO0FBQ25ELE1BQU0sc0JBQXNCLEdBQUcsb0JBQW9CLENBQUM7QUFFcEQsU0FBUyxpQkFBaUIsQ0FBQyxLQUF1QixFQUFFLElBQVUsRUFBRSxJQUFzQjtJQUNwRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUNyRSxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDM0MsT0FBTyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQXdCLGlCQUFpQixDQUN2QyxNQUEwQixFQUMxQixJQUFVLEVBQ1YsSUFBc0I7SUFFdEIsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUEyQixDQUFDO0lBRTNDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNyQixPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6RixDQUFDO0tBQ0g7SUFFRCxNQUFNLElBQUksR0FBRyxNQUF5QixDQUFDO0lBRXZDLE9BQU87UUFDTCxHQUFHLE1BQU07UUFDVCxLQUFLLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBeEJELG9DQXdCQyJ9
@@ -0,0 +1,4 @@
1
+ import { RenderingChartDefinitions } from './types';
2
+ export declare function hashServerCharts(chartsByType: RenderingChartDefinitions): Set<string>;
3
+ export declare function hashChartRequest(chart: any): string;
4
+ //# sourceMappingURL=hash-chart.d.ts.map
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hashChartRequest = exports.hashServerCharts = void 0;
7
+ const object_hash_1 = __importDefault(require("object-hash"));
8
+ function hashServerCharts(chartsByType) {
9
+ const serverCharts = Object.entries(chartsByType)
10
+ .filter(([key]) => key !== 'queries')
11
+ .map(([, value]) => value)
12
+ .flat();
13
+ const frontendCharts = serverCharts.map(chart => ({
14
+ type: chart.type,
15
+ filters: chart.filter,
16
+ aggregate: chart.aggregator,
17
+ aggregate_field: chart.aggregateFieldName,
18
+ collection: chart.sourceCollectionId,
19
+ time_range: chart.timeRange,
20
+ group_by_date_field: (chart.type === 'Line' && chart.groupByFieldName) || null,
21
+ group_by_field: (chart.type !== 'Line' && chart.groupByFieldName) || null,
22
+ limit: chart.limit,
23
+ label_field: chart.labelFieldName,
24
+ relationship_field: chart.relationshipFieldName,
25
+ }));
26
+ const hashes = frontendCharts.map(chart => (0, object_hash_1.default)(chart, {
27
+ respectType: false,
28
+ excludeKeys: key => chart[key] === null || chart[key] === undefined,
29
+ }));
30
+ return new Set(hashes);
31
+ }
32
+ exports.hashServerCharts = hashServerCharts;
33
+ function hashChartRequest(chart) {
34
+ const hashed = {
35
+ ...chart,
36
+ // When the server sends the data of the allowed charts, the target column is not specified
37
+ // for relations => allow them all.
38
+ ...(chart?.group_by_field?.includes(':')
39
+ ? { group_by_field: chart.group_by_field.substring(0, chart.group_by_field.indexOf(':')) }
40
+ : {}),
41
+ };
42
+ return (0, object_hash_1.default)(hashed, {
43
+ respectType: false,
44
+ excludeKeys: key => chart[key] === null,
45
+ });
46
+ }
47
+ exports.hashChartRequest = hashChartRequest;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9hdXRob3JpemF0aW9uL2ludGVybmFsL2hhc2gtY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQXFDO0FBSXJDLFNBQWdCLGdCQUFnQixDQUFDLFlBQXVDO0lBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1NBQzlDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUM7U0FDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDekIsSUFBSSxFQUFFLENBQUM7SUFFVixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3JCLFNBQVMsRUFBRSxLQUFLLENBQUMsVUFBVTtRQUMzQixlQUFlLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtRQUN6QyxVQUFVLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtRQUNwQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDM0IsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJO1FBQzlFLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUk7UUFDekUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLFdBQVcsRUFBRSxLQUFLLENBQUMsY0FBYztRQUNqQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMscUJBQXFCO0tBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUN4QyxJQUFBLHFCQUFVLEVBQUMsS0FBSyxFQUFFO1FBQ2hCLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVM7S0FDcEUsQ0FBQyxDQUNILENBQUM7SUFFRixPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUE1QkQsNENBNEJDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsS0FBVTtJQUN6QyxNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcsS0FBSztRQUNSLDJGQUEyRjtRQUMzRixtQ0FBbUM7UUFDbkMsR0FBRyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUN0QyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDMUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNSLENBQUM7SUFFRixPQUFPLElBQUEscUJBQVUsRUFBQyxNQUFNLEVBQUU7UUFDeEIsV0FBVyxFQUFFLEtBQUs7UUFDbEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUk7S0FDeEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWRELDRDQWNDIn0=
@@ -0,0 +1,26 @@
1
+ import { GenericTree } from '@forestadmin/datasource-toolkit';
2
+ import { AgentOptionsWithDefaults } from '../../../types';
3
+ import { User } from './types';
4
+ import UserPermissionService from './user-permission';
5
+ export declare type RenderingPermissionOptions = Pick<AgentOptionsWithDefaults, 'forestServerUrl' | 'envSecret' | 'isProduction' | 'permissionsCacheDurationInSeconds'>;
6
+ export default class RenderingPermissionService {
7
+ private readonly options;
8
+ private readonly userPermissions;
9
+ private readonly permissionsByRendering;
10
+ constructor(options: RenderingPermissionOptions, userPermissions: UserPermissionService);
11
+ getScope({ renderingId, collectionName, user, }: {
12
+ renderingId: string;
13
+ collectionName: string;
14
+ user: User;
15
+ }): Promise<GenericTree>;
16
+ private getScopeOrRetry;
17
+ private loadPermissions;
18
+ canRetrieveChart({ renderingId, chartRequest, userId, }: {
19
+ renderingId: number;
20
+ chartRequest: any;
21
+ userId: number;
22
+ }): Promise<boolean>;
23
+ private canRetrieveChartHashOrRetry;
24
+ invalidateCache(renderingId: any): void;
25
+ }
26
+ //# sourceMappingURL=rendering-permission.d.ts.map
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const lru_cache_1 = __importDefault(require("lru-cache"));
7
+ const types_1 = require("./types");
8
+ const hash_chart_1 = require("./hash-chart");
9
+ const forest_http_api_1 = __importDefault(require("../../../utils/forest-http-api"));
10
+ const generate_user_scope_1 = __importDefault(require("./generate-user-scope"));
11
+ class RenderingPermissionService {
12
+ constructor(options, userPermissions) {
13
+ this.options = options;
14
+ this.userPermissions = userPermissions;
15
+ this.permissionsByRendering = new lru_cache_1.default({
16
+ max: 256,
17
+ ttl: this.options.permissionsCacheDurationInSeconds * 1000,
18
+ fetchMethod: renderingId => this.loadPermissions(renderingId),
19
+ });
20
+ }
21
+ async getScope({ renderingId, collectionName, user, }) {
22
+ return this.getScopeOrRetry({ renderingId, collectionName, user, allowRetry: true });
23
+ }
24
+ async getScopeOrRetry({ renderingId, collectionName, user, allowRetry, }) {
25
+ const [permissions, userInfo] = await Promise.all([
26
+ this.permissionsByRendering.fetch(renderingId),
27
+ this.userPermissions.getUserInfo(user.id),
28
+ ]);
29
+ const collectionPermissions = permissions?.collections?.[collectionName];
30
+ if (!collectionPermissions) {
31
+ if (allowRetry) {
32
+ this.invalidateCache(renderingId);
33
+ return this.getScopeOrRetry({ renderingId, collectionName, user, allowRetry: false });
34
+ }
35
+ return null;
36
+ }
37
+ return (0, generate_user_scope_1.default)(collectionPermissions.scope, permissions.team, userInfo);
38
+ }
39
+ async loadPermissions(renderingId) {
40
+ const rawPermissions = await forest_http_api_1.default.getRenderingPermissions(renderingId, this.options);
41
+ return {
42
+ team: rawPermissions.team,
43
+ collections: rawPermissions.collections,
44
+ charts: (0, hash_chart_1.hashServerCharts)(rawPermissions.stats),
45
+ };
46
+ }
47
+ async canRetrieveChart({ renderingId, chartRequest, userId, }) {
48
+ const chartHash = (0, hash_chart_1.hashChartRequest)(chartRequest);
49
+ return this.canRetrieveChartHashOrRetry({ renderingId, chartHash, userId, allowRetry: true });
50
+ }
51
+ async canRetrieveChartHashOrRetry({ renderingId, userId, chartHash, allowRetry, }) {
52
+ const [userInfo, permissions] = await Promise.all([
53
+ this.userPermissions.getUserInfo(userId),
54
+ this.permissionsByRendering.fetch(renderingId),
55
+ ]);
56
+ if ([types_1.PermissionLevel.Admin, types_1.PermissionLevel.Developer].includes(userInfo?.permissionLevel) ||
57
+ permissions.charts.has(chartHash)) {
58
+ return true;
59
+ }
60
+ if (allowRetry) {
61
+ this.invalidateCache(renderingId);
62
+ this.userPermissions.clearCache();
63
+ return this.canRetrieveChartHashOrRetry({
64
+ renderingId,
65
+ userId,
66
+ chartHash,
67
+ allowRetry: false,
68
+ });
69
+ }
70
+ return false;
71
+ }
72
+ invalidateCache(renderingId) {
73
+ this.permissionsByRendering.del(renderingId);
74
+ }
75
+ }
76
+ exports.default = RenderingPermissionService;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLXBlcm1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvYXV0aG9yaXphdGlvbi9pbnRlcm5hbC9yZW5kZXJpbmctcGVybWlzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDBEQUFpQztBQUdqQyxtQ0FPaUI7QUFDakIsNkNBQWtFO0FBQ2xFLHFGQUEyRDtBQUUzRCxnRkFBc0Q7QUFhdEQsTUFBcUIsMEJBQTBCO0lBRzdDLFlBQ21CLE9BQW1DLEVBQ25DLGVBQXNDO1FBRHRDLFlBQU8sR0FBUCxPQUFPLENBQTRCO1FBQ25DLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUV2RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxtQkFBUSxDQUFDO1lBQ3pDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQWlDLEdBQUcsSUFBSTtZQUMxRCxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUNwQixXQUFXLEVBQ1gsY0FBYyxFQUNkLElBQUksR0FLTDtRQUNDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzVCLFdBQVcsRUFDWCxjQUFjLEVBQ2QsSUFBSSxFQUNKLFVBQVUsR0FNWDtRQUNDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQThDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUMzRixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLFdBQVcs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
@@ -1,3 +1,4 @@
1
+ import { GenericTree } from '@forestadmin/datasource-toolkit';
1
2
  export declare type EnvironmentPermissionsV4 = EnvironmentPermissionsV4Remote | true;
2
3
  export declare type RightDescriptionWithRolesV4 = {
3
4
  roles: number[];
@@ -32,17 +33,17 @@ export interface EnvironmentPermissionsV4Remote {
32
33
  }
33
34
  export declare enum PermissionLevel {
34
35
  Admin = "admin",
35
- User = "user",
36
- Developer = "developer"
36
+ Developer = "developer",
37
+ User = "user"
37
38
  }
38
39
  export declare type UserPermissionV4 = {
39
40
  id: number;
40
41
  firstName: string;
41
42
  lastName: string;
42
43
  email: string;
43
- roleId: number;
44
44
  permissionLevel: PermissionLevel;
45
45
  tags: Record<string, string>;
46
+ roleId: number;
46
47
  };
47
48
  export declare enum CollectionActionEvent {
48
49
  Browse = "browse",
@@ -58,4 +59,167 @@ export declare enum CustomActionEvent {
58
59
  SelfApprove = "self-approve",
59
60
  RequireApproval = "require-approval"
60
61
  }
62
+ export declare enum ChartType {
63
+ Pie = "Pie",
64
+ Value = "Value",
65
+ Leaderboard = "Leaderboard",
66
+ Line = "Line",
67
+ Objective = "Objective",
68
+ Percentage = "Percentage",
69
+ Smart = "Smart"
70
+ }
71
+ export interface DisplaySettings {
72
+ x: number;
73
+ y: number;
74
+ width: number;
75
+ height: number;
76
+ }
77
+ export interface BaseChart {
78
+ type: ChartType;
79
+ }
80
+ export interface SmartRouteChart extends BaseChart {
81
+ type: Exclude<ChartType, ChartType.Smart>;
82
+ smartRoute: string;
83
+ }
84
+ export interface ApiRouteChart extends BaseChart {
85
+ type: Exclude<ChartType, ChartType.Smart>;
86
+ apiRoute: string;
87
+ }
88
+ export interface QueryChart extends BaseChart {
89
+ type: Exclude<ChartType, ChartType.Smart>;
90
+ query: string;
91
+ filter?: Record<string, any>;
92
+ }
93
+ export interface S3Versions {
94
+ 'component.js': string;
95
+ 'template.hbs': string;
96
+ }
97
+ export interface SmartChart extends BaseChart {
98
+ type: ChartType.Smart;
99
+ s3Versions: S3Versions & {
100
+ 'style.css': string;
101
+ };
102
+ id: string;
103
+ }
104
+ export interface LeaderboardChart extends BaseChart {
105
+ type: ChartType.Leaderboard;
106
+ sourceCollectionId: string | number;
107
+ labelFieldName: string;
108
+ relationshipFieldName: string;
109
+ aggregateFieldName: string | null;
110
+ aggregator: 'Sum' | 'Count';
111
+ limit: any;
112
+ }
113
+ export interface LineChart extends BaseChart {
114
+ type: ChartType.Line;
115
+ sourceCollectionId: string | number;
116
+ groupByFieldName: string;
117
+ aggregateFieldName: string | null;
118
+ aggregator: 'Sum' | 'Count';
119
+ timeRange: 'Day' | 'Week' | 'Month' | 'Year';
120
+ filter: Filter | null;
121
+ }
122
+ export interface ObjectiveChart extends BaseChart {
123
+ type: ChartType.Objective;
124
+ sourceCollectionId: string | number;
125
+ aggregateFieldName: string;
126
+ aggregator: 'Sum' | 'Count';
127
+ objective: number;
128
+ filter: Filter | null;
129
+ }
130
+ export interface PercentageChart extends BaseChart {
131
+ type: ChartType.Percentage;
132
+ numeratorChartId: string;
133
+ denominatorChartId: string;
134
+ }
135
+ export interface PieChart extends BaseChart {
136
+ type: ChartType.Pie;
137
+ sourceCollectionId: string | number;
138
+ aggregateFieldName: string;
139
+ groupByFieldName: string;
140
+ aggregator: 'Sum' | 'Count';
141
+ filter: Filter | null;
142
+ }
143
+ export interface ValueChart extends BaseChart {
144
+ type: ChartType.Value;
145
+ sourceCollectionId: string | number;
146
+ aggregateFieldName: string;
147
+ aggregator: 'Sum' | 'Count';
148
+ filter: Filter | null;
149
+ }
150
+ export declare type Chart = SmartChart | ApiRouteChart | QueryChart | SmartRouteChart | LeaderboardChart | LineChart | ObjectiveChart | PercentageChart | PieChart | ValueChart;
151
+ export interface RenderingChartDefinitions {
152
+ queries: string[];
153
+ leaderboards: LeaderboardChart[];
154
+ lines: LineChart[];
155
+ objectives: ObjectiveChart[];
156
+ percentages: PercentageChart[];
157
+ pies: PieChart[];
158
+ values: ValueChart[];
159
+ }
160
+ export interface CollectionColumn {
161
+ id: string | number;
162
+ fieldName: string;
163
+ position: number | null;
164
+ isVisible: boolean;
165
+ }
166
+ export interface BaseCollectionSegment {
167
+ id: string | number;
168
+ type: 'manual' | 'smart';
169
+ name: string;
170
+ position: number;
171
+ defaultSortingFieldName: string | null;
172
+ defaultSortingFieldOrder: 'ascending' | 'descending' | null;
173
+ isVisible: boolean;
174
+ hasColumnsConfiguration: boolean;
175
+ columns: CollectionColumn[];
176
+ }
177
+ export interface FilterCondition {
178
+ id: string;
179
+ value: boolean | number | string | string[];
180
+ fieldName: string | null;
181
+ subFieldName: string | null;
182
+ embeddedFieldName?: string | null;
183
+ operator: string;
184
+ embeddedField?: {
185
+ id?: number;
186
+ type: string;
187
+ field: string;
188
+ enums?: Array<string | number | Record<string, string>>;
189
+ } | null;
190
+ }
191
+ export interface Filter {
192
+ id?: string;
193
+ type: 'and' | 'or';
194
+ conditions: FilterCondition[] | null;
195
+ }
196
+ export interface ManualCollectionSegment extends BaseCollectionSegment {
197
+ type: 'manual';
198
+ filter: Filter | null;
199
+ query: string | null;
200
+ }
201
+ export interface SmartCollectionSegment extends BaseCollectionSegment {
202
+ type: 'smart';
203
+ }
204
+ export declare type CollectionSegment = ManualCollectionSegment | SmartCollectionSegment;
205
+ export declare type DynamicScopesValues = {
206
+ users: Record<string, Record<string, string | number>>;
207
+ };
208
+ export declare type CollectionRenderingPermissionV4 = {
209
+ scope: GenericTree | null;
210
+ segments: CollectionSegment[];
211
+ };
212
+ export declare type Team = {
213
+ id: number;
214
+ name: string;
215
+ };
216
+ export declare type RenderingPermissionV4 = {
217
+ team: Team;
218
+ collections: Record<string, CollectionRenderingPermissionV4>;
219
+ stats: RenderingChartDefinitions;
220
+ };
221
+ export declare type User = Record<string, any> & {
222
+ id: number;
223
+ tags: Record<string, string>;
224
+ };
61
225
  //# sourceMappingURL=types.d.ts.map
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CustomActionEvent = exports.CollectionActionEvent = exports.PermissionLevel = void 0;
3
+ exports.ChartType = exports.CustomActionEvent = exports.CollectionActionEvent = exports.PermissionLevel = void 0;
4
4
  var PermissionLevel;
5
5
  (function (PermissionLevel) {
6
6
  PermissionLevel["Admin"] = "admin";
7
- PermissionLevel["User"] = "user";
8
7
  PermissionLevel["Developer"] = "developer";
8
+ PermissionLevel["User"] = "user";
9
9
  })(PermissionLevel = exports.PermissionLevel || (exports.PermissionLevel = {}));
10
10
  var CollectionActionEvent;
11
11
  (function (CollectionActionEvent) {
@@ -23,4 +23,14 @@ var CustomActionEvent;
23
23
  CustomActionEvent["SelfApprove"] = "self-approve";
24
24
  CustomActionEvent["RequireApproval"] = "require-approval";
25
25
  })(CustomActionEvent = exports.CustomActionEvent || (exports.CustomActionEvent = {}));
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvYXV0aG9yaXphdGlvbi9pbnRlcm5hbC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzQ0EsSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLGtDQUFlLENBQUE7SUFDZixnQ0FBYSxDQUFBO0lBQ2IsMENBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBSTFCO0FBWUQsSUFBWSxxQkFPWDtBQVBELFdBQVkscUJBQXFCO0lBQy9CLDBDQUFpQixDQUFBO0lBQ2pCLDBDQUFpQixDQUFBO0lBQ2pCLHNDQUFhLENBQUE7SUFDYixzQ0FBYSxDQUFBO0lBQ2IsMENBQWlCLENBQUE7SUFDakIsb0NBQVcsQ0FBQTtBQUNiLENBQUMsRUFQVyxxQkFBcUIsR0FBckIsNkJBQXFCLEtBQXJCLDZCQUFxQixRQU9oQztBQUVELElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUMzQix3Q0FBbUIsQ0FBQTtJQUNuQix3Q0FBbUIsQ0FBQTtJQUNuQixpREFBNEIsQ0FBQTtJQUM1Qix5REFBb0MsQ0FBQTtBQUN0QyxDQUFDLEVBTFcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUFLNUIifQ==
26
+ var ChartType;
27
+ (function (ChartType) {
28
+ ChartType["Pie"] = "Pie";
29
+ ChartType["Value"] = "Value";
30
+ ChartType["Leaderboard"] = "Leaderboard";
31
+ ChartType["Line"] = "Line";
32
+ ChartType["Objective"] = "Objective";
33
+ ChartType["Percentage"] = "Percentage";
34
+ ChartType["Smart"] = "Smart";
35
+ })(ChartType = exports.ChartType || (exports.ChartType = {}));
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvYXV0aG9yaXphdGlvbi9pbnRlcm5hbC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3Q0EsSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLGtDQUFlLENBQUE7SUFDZiwwQ0FBdUIsQ0FBQTtJQUN2QixnQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUpXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBSTFCO0FBWUQsSUFBWSxxQkFPWDtBQVBELFdBQVkscUJBQXFCO0lBQy9CLDBDQUFpQixDQUFBO0lBQ2pCLDBDQUFpQixDQUFBO0lBQ2pCLHNDQUFhLENBQUE7SUFDYixzQ0FBYSxDQUFBO0lBQ2IsMENBQWlCLENBQUE7SUFDakIsb0NBQVcsQ0FBQTtBQUNiLENBQUMsRUFQVyxxQkFBcUIsR0FBckIsNkJBQXFCLEtBQXJCLDZCQUFxQixRQU9oQztBQUVELElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUMzQix3Q0FBbUIsQ0FBQTtJQUNuQix3Q0FBbUIsQ0FBQTtJQUNuQixpREFBNEIsQ0FBQTtJQUM1Qix5REFBb0MsQ0FBQTtBQUN0QyxDQUFDLEVBTFcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUFLNUI7QUFFRCxJQUFZLFNBUVg7QUFSRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLDRCQUFlLENBQUE7SUFDZix3Q0FBMkIsQ0FBQTtJQUMzQiwwQkFBYSxDQUFBO0lBQ2Isb0NBQXVCLENBQUE7SUFDdkIsc0NBQXlCLENBQUE7SUFDekIsNEJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUlcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFRcEIifQ==
@@ -0,0 +1,12 @@
1
+ import { AgentOptionsWithDefaults } from '../../../types';
2
+ import { UserPermissionV4 } from './types';
3
+ export declare type UserPermissionOptions = Pick<AgentOptionsWithDefaults, 'forestServerUrl' | 'envSecret' | 'isProduction' | 'permissionsCacheDurationInSeconds'>;
4
+ export default class UserPermissionService {
5
+ private readonly options;
6
+ private cacheExpirationTimestamp;
7
+ private userInfoById;
8
+ constructor(options: UserPermissionOptions);
9
+ getUserInfo(userId: number): Promise<UserPermissionV4 | undefined>;
10
+ clearCache(): void;
11
+ }
12
+ //# sourceMappingURL=user-permission.d.ts.map
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const forest_http_api_1 = __importDefault(require("../../../utils/forest-http-api"));
7
+ class UserPermissionService {
8
+ constructor(options) {
9
+ this.options = options;
10
+ this.cacheExpirationTimestamp = 0;
11
+ // The trick here is to keep the cache as a Promise and not a Map
12
+ // in order to avoid doing the same HTTP request twice when
13
+ // 2 calls are made to getUserInfo at the same time.
14
+ this.userInfoById = null;
15
+ }
16
+ async getUserInfo(userId) {
17
+ if (!this.cacheExpirationTimestamp ||
18
+ this.cacheExpirationTimestamp < Date.now() ||
19
+ !(await this.userInfoById).has(userId)) {
20
+ this.cacheExpirationTimestamp =
21
+ Date.now() + this.options.permissionsCacheDurationInSeconds * 1000;
22
+ // The response here is not awaited in order to be set in the cache
23
+ // allowing subsequent calls to getUserInfo to use the cache even if
24
+ // the response is not yet available.
25
+ this.userInfoById = forest_http_api_1.default.getUsers(this.options).then(users => new Map(users.map(user => [user.id, user])));
26
+ }
27
+ return (await this.userInfoById).get(userId);
28
+ }
29
+ clearCache() {
30
+ this.userInfoById = null;
31
+ this.cacheExpirationTimestamp = Number.NEGATIVE_INFINITY;
32
+ }
33
+ }
34
+ exports.default = UserPermissionService;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wZXJtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2F1dGhvcml6YXRpb24vaW50ZXJuYWwvdXNlci1wZXJtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEscUZBQTJEO0FBTzNELE1BQXFCLHFCQUFxQjtJQVF4QyxZQUE2QixPQUE4QjtRQUE5QixZQUFPLEdBQVAsT0FBTyxDQUF1QjtRQVBuRCw2QkFBd0IsR0FBRyxDQUFDLENBQUM7UUFFckMsaUVBQWlFO1FBQ2pFLDJEQUEyRDtRQUMzRCxvREFBb0Q7UUFDNUMsaUJBQVksR0FBMkMsSUFBSSxDQUFDO0lBRU4sQ0FBQztJQUV4RCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWM7UUFDckMsSUFDRSxDQUFDLElBQUksQ0FBQyx3QkFBd0I7WUFDOUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDMUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDdEM7WUFDQSxJQUFJLENBQUMsd0JBQXdCO2dCQUMzQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsR0FBRyxJQUFJLENBQUM7WUFFckUsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSxxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyx5QkFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUMzRCxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO1NBQ0g7UUFFRCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0NBQ0Y7QUFsQ0Qsd0NBa0NDIn0=
@@ -1,9 +1,7 @@
1
1
  import { AgentOptionsWithDefaults } from '../types';
2
2
  import AuthorizationService from './authorization/authorization';
3
- import PermissionService from './permissions';
4
3
  import Serializer from './serializer';
5
4
  export declare type ForestAdminHttpDriverServices = {
6
- permissions: PermissionService;
7
5
  serializer: Serializer;
8
6
  authorization: AuthorizationService;
9
7
  };
@@ -3,14 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const permissions_1 = __importDefault(require("./permissions"));
7
6
  const serializer_1 = __importDefault(require("./serializer"));
8
7
  const authorization_1 = __importDefault(require("./authorization"));
9
8
  exports.default = (options) => {
10
9
  return {
11
- permissions: new permissions_1.default(options),
12
10
  authorization: (0, authorization_1.default)(options),
13
11
  serializer: new serializer_1.default(),
14
12
  };
15
13
  };
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxnRUFBOEM7QUFDOUMsOERBQXNDO0FBQ3RDLG9FQUEwRDtBQVExRCxrQkFBZSxDQUFDLE9BQWlDLEVBQWlDLEVBQUU7SUFDbEYsT0FBTztRQUNMLFdBQVcsRUFBRSxJQUFJLHFCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUMzQyxhQUFhLEVBQUUsSUFBQSx1QkFBMkIsRUFBQyxPQUFPLENBQUM7UUFDbkQsVUFBVSxFQUFFLElBQUksb0JBQVUsRUFBRTtLQUM3QixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSw4REFBc0M7QUFDdEMsb0VBQTBEO0FBTzFELGtCQUFlLENBQUMsT0FBaUMsRUFBaUMsRUFBRTtJQUNsRixPQUFPO1FBQ0wsYUFBYSxFQUFFLElBQUEsdUJBQTJCLEVBQUMsT0FBTyxDQUFDO1FBQ25ELFVBQVUsRUFBRSxJQUFJLG9CQUFVLEVBQUU7S0FDN0IsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -1,8 +1,8 @@
1
1
  import { IssuerMetadata } from 'openid-client';
2
2
  import { JSONAPIDocument } from 'json-api-serializer';
3
- import { PlainConditionTree } from '@forestadmin/datasource-toolkit';
4
3
  import { AgentOptions } from '../types';
5
4
  import { EnvironmentPermissionsV4, UserPermissionV4 } from '../services/authorization';
5
+ import { RenderingPermissionV4 } from '../services/authorization/internal/types';
6
6
  export declare type IpWhitelistConfiguration = {
7
7
  isFeatureEnabled: boolean;
8
8
  ipRules: Array<{
@@ -26,22 +26,6 @@ export declare type UserInfo = {
26
26
  };
27
27
  permissionLevel: string;
28
28
  };
29
- export declare type RenderingPermissions = {
30
- actions: Set<string>;
31
- actionsByUser: {
32
- [actionName: string]: Set<number>;
33
- };
34
- scopes: {
35
- [collectionName: string]: {
36
- conditionTree: PlainConditionTree;
37
- dynamicScopeValues: {
38
- [userId: number]: {
39
- [replacementKey: string]: unknown;
40
- };
41
- };
42
- };
43
- };
44
- };
45
29
  declare type HttpOptions = Pick<AgentOptions, 'envSecret' | 'forestServerUrl' | 'isProduction'>;
46
30
  export default class ForestHttpApi {
47
31
  static getIpWhitelistConfiguration(options: HttpOptions): Promise<IpWhitelistConfiguration>;
@@ -49,19 +33,9 @@ export default class ForestHttpApi {
49
33
  static getUserInformation(options: HttpOptions, renderingId: number, accessToken: string): Promise<UserInfo>;
50
34
  static hasSchema(options: HttpOptions, hash: string): Promise<boolean>;
51
35
  static uploadSchema(options: HttpOptions, apimap: JSONAPIDocument): Promise<void>;
52
- static getPermissions(options: HttpOptions, renderingId: number): Promise<RenderingPermissions>;
53
36
  static getEnvironmentPermissions(options: HttpOptions): Promise<EnvironmentPermissionsV4>;
54
37
  static getUsers(options: HttpOptions): Promise<UserPermissionV4[]>;
55
- /** Helper to format permissions into something easy to validate against */
56
- private static decodeChartPermissions;
57
- /**
58
- * Helper to format permissions into something easy to validate against
59
- * Note that the format the server is sending varies depending on if we're using a remote or
60
- * local environment.
61
- */
62
- private static decodeActionPermissions;
63
- /** Helper to format permissions into something easy to validate against */
64
- private static decodeScopePermissions;
38
+ static getRenderingPermissions(renderingId: number, options: HttpOptions): Promise<RenderingPermissionV4>;
65
39
  private static handleResponseError;
66
40
  }
67
41
  export {};