@forestadmin/forestadmin-client 1.0.1 → 1.0.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.
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.js +39 -0
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.js +3 -0
- package/dist/forest-admin-client-with-cache.d.ts +7 -1
- package/dist/forest-admin-client-with-cache.js +10 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -3
- package/dist/permissions/action-permission.d.ts +2 -2
- package/dist/permissions/action-permission.js +15 -18
- package/dist/permissions/generate-actions-from-permissions.d.ts +6 -3
- package/dist/permissions/generate-actions-from-permissions.js +8 -16
- package/dist/permissions/permission-with-cache.d.ts +1 -0
- package/dist/permissions/permission-with-cache.js +14 -7
- package/dist/schema/index.d.ts +8 -3
- package/dist/schema/index.js +5 -6
- package/dist/types.d.ts +4 -0
- package/package.json +3 -2
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Client } from 'openid-client';
|
|
2
|
+
import { ForestAdminClientOptionsWithDefaults } from '../types';
|
|
3
|
+
import { UserInfo } from './types';
|
|
4
|
+
export default class AuthService {
|
|
5
|
+
private options;
|
|
6
|
+
constructor(options: ForestAdminClientOptionsWithDefaults);
|
|
7
|
+
getOpenIdClient(): Promise<Client>;
|
|
8
|
+
getUserInfo(renderingId: number, accessToken: string): Promise<UserInfo>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
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 openid_client_1 = require("openid-client");
|
|
7
|
+
const server_1 = __importDefault(require("../utils/server"));
|
|
8
|
+
class AuthService {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
async getOpenIdClient() {
|
|
13
|
+
// We can't use 'Issuer.discover' because the oidc config is behind an auth-wall.
|
|
14
|
+
const url = '/oidc/.well-known/openid-configuration';
|
|
15
|
+
const config = await server_1.default.query(this.options, 'get', url);
|
|
16
|
+
const issuer = new openid_client_1.Issuer(config);
|
|
17
|
+
const registration = { token_endpoint_auth_method: 'none' };
|
|
18
|
+
return issuer.Client.register(registration, { initialAccessToken: this.options.envSecret });
|
|
19
|
+
}
|
|
20
|
+
async getUserInfo(renderingId, accessToken) {
|
|
21
|
+
const url = `/liana/v2/renderings/${renderingId}/authorization`;
|
|
22
|
+
const headers = { 'forest-token': accessToken };
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
const response = await server_1.default.query(this.options, 'get', url, headers);
|
|
25
|
+
return {
|
|
26
|
+
id: Number(response.data.id),
|
|
27
|
+
email: response.data.attributes.email,
|
|
28
|
+
firstName: response.data.attributes.first_name,
|
|
29
|
+
lastName: response.data.attributes.last_name,
|
|
30
|
+
team: response.data.attributes.teams[0],
|
|
31
|
+
role: response.data.attributes.role,
|
|
32
|
+
permissionLevel: response.data.attributes.permission_level,
|
|
33
|
+
renderingId,
|
|
34
|
+
tags: response.data.attributes.tags?.reduce((memo, { key, value }) => ({ ...memo, [key]: value }), {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.default = AuthService;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlEQUFpRjtBQUdqRiw2REFBMEM7QUFHMUMsTUFBcUIsV0FBVztJQUM5QixZQUFvQixPQUE2QztRQUE3QyxZQUFPLEdBQVAsT0FBTyxDQUFzQztJQUFHLENBQUM7SUFFckUsS0FBSyxDQUFDLGVBQWU7UUFDbkIsaUZBQWlGO1FBQ2pGLE1BQU0sR0FBRyxHQUFHLHdDQUF3QyxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQVcsQ0FBQyxLQUFLLENBQWlCLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLElBQUksc0JBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxNQUFNLFlBQVksR0FBRyxFQUFFLDBCQUEwQixFQUFFLE1BQTBCLEVBQUUsQ0FBQztRQUVoRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFtQixFQUFFLFdBQW1CO1FBQ3hELE1BQU0sR0FBRyxHQUFHLHdCQUF3QixXQUFXLGdCQUFnQixDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBRWhELDhEQUE4RDtRQUM5RCxNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFXLENBQUMsS0FBSyxDQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVqRixPQUFPO1lBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztZQUNyQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVTtZQUM5QyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUztZQUM1QyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUNuQyxlQUFlLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCO1lBQzFELFdBQVc7WUFDWCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FDekMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQ3JELEVBQUUsQ0FDSDtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuQ0QsOEJBbUNDIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare type UserInfo = {
|
|
2
|
+
id: number;
|
|
3
|
+
email: string;
|
|
4
|
+
firstName: string;
|
|
5
|
+
lastName: string;
|
|
6
|
+
team: string;
|
|
7
|
+
renderingId: number;
|
|
8
|
+
role: string;
|
|
9
|
+
tags: {
|
|
10
|
+
[key: string]: string;
|
|
11
|
+
};
|
|
12
|
+
permissionLevel: string;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { Client } from 'openid-client';
|
|
2
|
+
import AuthService from './auth';
|
|
3
|
+
import { UserInfo } from './auth/types';
|
|
1
4
|
import ChartHandler from './charts/chart-handler';
|
|
2
5
|
import IpWhiteListService from './ip-whitelist';
|
|
3
6
|
import { IpWhitelistConfiguration } from './ip-whitelist/types';
|
|
@@ -15,10 +18,13 @@ export default class ForestAdminClientWithCache implements ForestAdminClient {
|
|
|
15
18
|
readonly chartHandler: ChartHandler;
|
|
16
19
|
protected readonly ipWhitelistService: IpWhiteListService;
|
|
17
20
|
protected readonly schemaService: SchemaService;
|
|
18
|
-
|
|
21
|
+
protected readonly authService: AuthService;
|
|
22
|
+
constructor(options: ForestAdminClientOptionsWithDefaults, permissionService: PermissionService, renderingPermissionService: RenderingPermissionService, contextVariablesInstantiator: ContextVariablesInstantiator, chartHandler: ChartHandler, ipWhitelistService: IpWhiteListService, schemaService: SchemaService, authService: AuthService);
|
|
19
23
|
verifySignedActionParameters<TSignedParameters>(signedParameters: string): TSignedParameters;
|
|
20
24
|
getIpWhitelistConfiguration(): Promise<IpWhitelistConfiguration>;
|
|
21
25
|
postSchema(schema: ForestServerCollection[], agentName: string, agentVersion: string): Promise<boolean>;
|
|
26
|
+
getOpenIdClient(): Promise<Client>;
|
|
27
|
+
getUserInfo(renderingId: number, accessToken: string): Promise<UserInfo>;
|
|
22
28
|
getScope({ renderingId, userId, collectionName, }: {
|
|
23
29
|
renderingId: number | string;
|
|
24
30
|
userId: number | string;
|
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const verify_approval_1 = __importDefault(require("./permissions/verify-approval"));
|
|
7
7
|
class ForestAdminClientWithCache {
|
|
8
|
-
constructor(options, permissionService, renderingPermissionService, contextVariablesInstantiator, chartHandler, ipWhitelistService, schemaService) {
|
|
8
|
+
constructor(options, permissionService, renderingPermissionService, contextVariablesInstantiator, chartHandler, ipWhitelistService, schemaService, authService) {
|
|
9
9
|
this.options = options;
|
|
10
10
|
this.permissionService = permissionService;
|
|
11
11
|
this.renderingPermissionService = renderingPermissionService;
|
|
@@ -13,16 +13,23 @@ class ForestAdminClientWithCache {
|
|
|
13
13
|
this.chartHandler = chartHandler;
|
|
14
14
|
this.ipWhitelistService = ipWhitelistService;
|
|
15
15
|
this.schemaService = schemaService;
|
|
16
|
+
this.authService = authService;
|
|
16
17
|
}
|
|
17
18
|
verifySignedActionParameters(signedParameters) {
|
|
18
19
|
return (0, verify_approval_1.default)(signedParameters, this.options.envSecret);
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
getIpWhitelistConfiguration() {
|
|
21
22
|
return this.ipWhitelistService.getConfiguration();
|
|
22
23
|
}
|
|
23
24
|
async postSchema(schema, agentName, agentVersion) {
|
|
24
25
|
return this.schemaService.postSchema(schema, agentName, agentVersion);
|
|
25
26
|
}
|
|
27
|
+
getOpenIdClient() {
|
|
28
|
+
return this.authService.getOpenIdClient();
|
|
29
|
+
}
|
|
30
|
+
getUserInfo(renderingId, accessToken) {
|
|
31
|
+
return this.authService.getUserInfo(renderingId, accessToken);
|
|
32
|
+
}
|
|
26
33
|
async getScope({ renderingId, userId, collectionName, }) {
|
|
27
34
|
return this.renderingPermissionService.getScope({
|
|
28
35
|
renderingId,
|
|
@@ -35,4 +42,4 @@ class ForestAdminClientWithCache {
|
|
|
35
42
|
}
|
|
36
43
|
}
|
|
37
44
|
exports.default = ForestAdminClientWithCache;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZXN0LWFkbWluLWNsaWVudC13aXRoLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZvcmVzdC1hZG1pbi1jbGllbnQtd2l0aC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVNBLG9GQUFxRTtBQVVyRSxNQUFxQiwwQkFBMEI7SUFDN0MsWUFDcUIsT0FBNkMsRUFDaEQsaUJBQW9DLEVBQ2pDLDBCQUFzRCxFQUN6RCw0QkFBMEQsRUFDMUQsWUFBMEIsRUFDdkIsa0JBQXNDLEVBQ3RDLGFBQTRCLEVBQzVCLFdBQXdCO1FBUHhCLFlBQU8sR0FBUCxPQUFPLENBQXNDO1FBQ2hELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDakMsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQUN6RCxpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQThCO1FBQzFELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3ZCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7SUFDMUMsQ0FBQztJQUVKLDRCQUE0QixDQUFvQixnQkFBd0I7UUFDdEUsT0FBTyxJQUFBLHlCQUF3QixFQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLE1BQWdDLEVBQ2hDLFNBQWlCLEVBQ2pCLFlBQW9CO1FBRXBCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsV0FBVyxDQUFDLFdBQW1CLEVBQUUsV0FBbUI7UUFDbEQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFDcEIsV0FBVyxFQUNYLE1BQU0sRUFDTixjQUFjLEdBS2Y7UUFDQyxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsV0FBVztZQUNYLGNBQWM7WUFDZCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLG1CQUFtQixDQUFDLFdBQTRCO1FBQ3JELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUNGO0FBdkRELDZDQXVEQyJ9
|
package/dist/index.d.ts
CHANGED
|
@@ -8,10 +8,12 @@ export { default as NonSelectSQLQueryError } from './permissions/errors/non-sele
|
|
|
8
8
|
export { ForestAdminClientOptions, Logger, LoggerLevel, ForestAdminClient, ChartHandlerInterface, ContextVariablesInstantiatorInterface, } from './types';
|
|
9
9
|
export { IpWhitelistConfiguration } from './ip-whitelist/types';
|
|
10
10
|
export { CollectionActionEvent, RenderingPermissionV4, UserPermissionV4, } from './permissions/types';
|
|
11
|
+
export { UserInfo } from './auth/types';
|
|
11
12
|
export default function createForestAdminClient(options: ForestAdminClientOptions): ForestAdminClient;
|
|
12
13
|
export * from './charts/types';
|
|
13
14
|
export * from './schema/types';
|
|
14
15
|
export { default as ContextVariablesInjector } from './utils/context-variables-injector';
|
|
15
16
|
export { default as ContextVariables } from './utils/context-variables';
|
|
16
17
|
export { default as ChartHandler } from './charts/chart-handler';
|
|
18
|
+
export { default as SchemaService } from './schema';
|
|
17
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.ChartHandler = exports.ContextVariables = exports.ContextVariablesInjector = exports.CollectionActionEvent = exports.NonSelectSQLQueryError = exports.EmptySQLQueryError = exports.ChainedSQLQueryError = exports.JTWUnableToVerifyError = exports.JTWTokenExpiredError = void 0;
|
|
20
|
+
exports.SchemaService = exports.ChartHandler = exports.ContextVariables = exports.ContextVariablesInjector = exports.CollectionActionEvent = exports.NonSelectSQLQueryError = exports.EmptySQLQueryError = exports.ChainedSQLQueryError = exports.JTWUnableToVerifyError = exports.JTWTokenExpiredError = void 0;
|
|
21
|
+
const auth_1 = __importDefault(require("./auth"));
|
|
21
22
|
const chart_handler_1 = __importDefault(require("./charts/chart-handler"));
|
|
22
23
|
const forest_admin_client_with_cache_1 = __importDefault(require("./forest-admin-client-with-cache"));
|
|
23
24
|
const ip_whitelist_1 = __importDefault(require("./ip-whitelist"));
|
|
@@ -57,7 +58,8 @@ function createForestAdminClient(options) {
|
|
|
57
58
|
const chartHandler = new chart_handler_1.default(contextVariablesInstantiator);
|
|
58
59
|
const ipWhitelistPermission = new ip_whitelist_1.default(optionsWithDefaults);
|
|
59
60
|
const schemaService = new schema_1.default(optionsWithDefaults);
|
|
60
|
-
|
|
61
|
+
const authService = new auth_1.default(optionsWithDefaults);
|
|
62
|
+
return new forest_admin_client_with_cache_1.default(optionsWithDefaults, permissionService, renderingPermission, contextVariablesInstantiator, chartHandler, ipWhitelistPermission, schemaService, authService);
|
|
61
63
|
}
|
|
62
64
|
exports.default = createForestAdminClient;
|
|
63
65
|
__exportStar(require("./charts/types"), exports);
|
|
@@ -68,4 +70,7 @@ var context_variables_1 = require("./utils/context-variables");
|
|
|
68
70
|
Object.defineProperty(exports, "ContextVariables", { enumerable: true, get: function () { return __importDefault(context_variables_1).default; } });
|
|
69
71
|
var chart_handler_2 = require("./charts/chart-handler");
|
|
70
72
|
Object.defineProperty(exports, "ChartHandler", { enumerable: true, get: function () { return __importDefault(chart_handler_2).default; } });
|
|
71
|
-
|
|
73
|
+
// export is necessary for the agent-generator package
|
|
74
|
+
var schema_2 = require("./schema");
|
|
75
|
+
Object.defineProperty(exports, "SchemaService", { enumerable: true, get: function () { return __importDefault(schema_2).default; } });
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBaUM7QUFDakMsMkVBQWtEO0FBQ2xELHNHQUFpRTtBQUNqRSxrRUFBZ0Q7QUFDaEQsd0ZBQXNFO0FBQ3RFLGdHQUFvRTtBQUNwRSw4RkFBNEU7QUFDNUUsb0ZBQWtFO0FBQ2xFLHNEQUFxQztBQUVyQyw0R0FBa0Y7QUFDbEYsNEVBQW1EO0FBRW5ELHdGQUErRjtBQUF0RixnSkFBQSxPQUFPLE9BQXdCO0FBQ3hDLDhGQUFvRztBQUEzRixxSkFBQSxPQUFPLE9BQTBCO0FBQzFDLHdGQUErRjtBQUF0RixnSkFBQSxPQUFPLE9BQXdCO0FBQ3hDLG9GQUEyRjtBQUFsRiw0SUFBQSxPQUFPLE9BQXNCO0FBQ3RDLDhGQUFvRztBQUEzRixxSkFBQSxPQUFPLE9BQTBCO0FBVzFDLHVEQUF1RDtBQUN2RCw2Q0FJNkI7QUFIM0IsOEdBQUEscUJBQXFCLE9BQUE7QUFNdkIsU0FBd0IsdUJBQXVCLENBQzdDLE9BQWlDO0lBRWpDLE1BQU0sbUJBQW1CLEdBQXlDO1FBQ2hFLGVBQWUsRUFBRSw2QkFBNkI7UUFDOUMsaUNBQWlDLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDMUMsc0NBQXNDO1FBQ3RDLE1BQU0sRUFBRSx3QkFBYTtRQUNyQixHQUFHLE9BQU87S0FDWCxDQUFDO0lBRUYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLDJCQUF1QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDMUUsTUFBTSxjQUFjLEdBQUcsSUFBSSx5QkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSw4QkFBMEIsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRyxNQUFNLGlCQUFpQixHQUFHLElBQUksK0JBQWlCLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN2RixNQUFNLDRCQUE0QixHQUFHLElBQUksd0NBQTRCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMzRixNQUFNLFlBQVksR0FBRyxJQUFJLHVCQUFZLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNwRSxNQUFNLHFCQUFxQixHQUFHLElBQUksc0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMxRSxNQUFNLGFBQWEsR0FBRyxJQUFJLGdCQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLGNBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXpELE9BQU8sSUFBSSx3Q0FBaUIsQ0FDMUIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsNEJBQTRCLEVBQzVCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsYUFBYSxFQUNiLFdBQVcsQ0FDWixDQUFDO0FBQ0osQ0FBQztBQS9CRCwwQ0ErQkM7QUFFRCxpREFBK0I7QUFDL0IsaURBQStCO0FBQy9CLGlGQUF5RjtBQUFoRix1SkFBQSxPQUFPLE9BQTRCO0FBQzVDLCtEQUF3RTtBQUEvRCxzSUFBQSxPQUFPLE9BQW9CO0FBQ3BDLHdEQUFpRTtBQUF4RCw4SEFBQSxPQUFPLE9BQWdCO0FBRWhDLHNEQUFzRDtBQUN0RCxtQ0FBb0Q7QUFBM0Msd0hBQUEsT0FBTyxPQUFpQiJ9
|
|
@@ -4,8 +4,8 @@ export default class ActionPermissionService {
|
|
|
4
4
|
private permissionsPromise;
|
|
5
5
|
private permissionExpirationTimestamp;
|
|
6
6
|
constructor(options: ForestAdminClientOptionsWithDefaults);
|
|
7
|
-
canOneOf(
|
|
8
|
-
can(
|
|
7
|
+
canOneOf(roleId: number, actionNames: string[]): Promise<boolean>;
|
|
8
|
+
can(roleId: number, actionName: string): Promise<boolean>;
|
|
9
9
|
private hasPermissionOrRefetch;
|
|
10
10
|
private isAllowedOneOf;
|
|
11
11
|
private isAllowed;
|
|
@@ -9,42 +9,42 @@ class ActionPermissionService {
|
|
|
9
9
|
constructor(options) {
|
|
10
10
|
this.options = options;
|
|
11
11
|
}
|
|
12
|
-
canOneOf(
|
|
12
|
+
canOneOf(roleId, actionNames) {
|
|
13
13
|
return this.hasPermissionOrRefetch({
|
|
14
|
-
|
|
14
|
+
roleId,
|
|
15
15
|
actionNames,
|
|
16
16
|
allowRefetch: true,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
-
can(
|
|
19
|
+
can(roleId, actionName) {
|
|
20
20
|
return this.hasPermissionOrRefetch({
|
|
21
|
-
|
|
21
|
+
roleId,
|
|
22
22
|
actionNames: [actionName],
|
|
23
23
|
allowRefetch: true,
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
async hasPermissionOrRefetch({
|
|
26
|
+
async hasPermissionOrRefetch({ roleId, actionNames, allowRefetch, }) {
|
|
27
27
|
const permissions = await this.getPermissions();
|
|
28
|
-
const isAllowed = this.isAllowedOneOf({ permissions, actionNames,
|
|
28
|
+
const isAllowed = this.isAllowedOneOf({ permissions, actionNames, roleId });
|
|
29
29
|
if (!isAllowed && allowRefetch) {
|
|
30
30
|
this.permissionsPromise = undefined;
|
|
31
31
|
this.permissionExpirationTimestamp = undefined;
|
|
32
32
|
return this.hasPermissionOrRefetch({
|
|
33
|
-
|
|
33
|
+
roleId,
|
|
34
34
|
actionNames,
|
|
35
35
|
allowRefetch: false,
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
this.options.logger('Debug', `User ${
|
|
38
|
+
this.options.logger('Debug', `User ${roleId} is ${isAllowed ? '' : 'not '}allowed to perform ${actionNames.length > 1 ? ' one of ' : ''}${actionNames.join(', ')}`);
|
|
39
39
|
return isAllowed;
|
|
40
40
|
}
|
|
41
|
-
isAllowedOneOf({ permissions, actionNames,
|
|
42
|
-
return actionNames.some(actionName => this.isAllowed({ permissions, actionName,
|
|
41
|
+
isAllowedOneOf({ permissions, actionNames, roleId, }) {
|
|
42
|
+
return actionNames.some(actionName => this.isAllowed({ permissions, actionName, roleId }));
|
|
43
43
|
}
|
|
44
|
-
isAllowed({ permissions, actionName,
|
|
44
|
+
isAllowed({ permissions, actionName, roleId, }) {
|
|
45
45
|
return Boolean(permissions.everythingAllowed ||
|
|
46
46
|
permissions.actionsGloballyAllowed.has(actionName) ||
|
|
47
|
-
permissions.
|
|
47
|
+
permissions.actionsByRole.get(actionName)?.allowedRoles.has(roleId));
|
|
48
48
|
}
|
|
49
49
|
async getPermissions() {
|
|
50
50
|
if (this.permissionsPromise &&
|
|
@@ -59,12 +59,9 @@ class ActionPermissionService {
|
|
|
59
59
|
}
|
|
60
60
|
async fetchEnvironmentPermissions() {
|
|
61
61
|
this.options.logger('Debug', 'Fetching environment permissions');
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
forest_http_api_1.default.getUsers(this.options),
|
|
65
|
-
]);
|
|
66
|
-
return (0, generate_actions_from_permissions_1.default)(rawPermissions, users);
|
|
62
|
+
const rawPermissions = await forest_http_api_1.default.getEnvironmentPermissions(this.options);
|
|
63
|
+
return (0, generate_actions_from_permissions_1.default)(rawPermissions);
|
|
67
64
|
}
|
|
68
65
|
}
|
|
69
66
|
exports.default = ActionPermissionService;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXBlcm1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvYWN0aW9uLXBlcm1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx3RUFBOEM7QUFDOUMsNEdBRTZDO0FBRTdDLE1BQXFCLHVCQUF1QjtJQUkxQyxZQUE2QixPQUE2QztRQUE3QyxZQUFPLEdBQVAsT0FBTyxDQUFzQztJQUFHLENBQUM7SUFFdkUsUUFBUSxDQUFDLE1BQWMsRUFBRSxXQUFxQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUNqQyxNQUFNO1lBQ04sV0FBVztZQUNYLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxHQUFHLENBQUMsTUFBYyxFQUFFLFVBQWtCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ2pDLE1BQU07WUFDTixXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDekIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUNuQyxNQUFNLEVBQ04sV0FBVyxFQUNYLFlBQVksR0FLYjtRQUNDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxDQUFDO1lBRS9DLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dCQUNqQyxNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDakIsT0FBTyxFQUNQLFFBQVEsTUFBTSxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLHNCQUMxQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUN4QyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDNUIsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxjQUFjLENBQUMsRUFDckIsV0FBVyxFQUNYLFdBQVcsRUFDWCxNQUFNLEdBS1A7UUFDQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVPLFNBQVMsQ0FBQyxFQUNoQixXQUFXLEVBQ1gsVUFBVSxFQUNWLE1BQU0sR0FLUDtRQUNDLE9BQU8sT0FBTyxDQUNaLFdBQVcsQ0FBQyxpQkFBaUI7WUFDM0IsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDbEQsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYztRQUMxQixJQUNFLElBQUksQ0FBQyxrQkFBa0I7WUFDdkIsSUFBSSxDQUFDLDZCQUE2QjtZQUNsQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUMvQztZQUNBLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyw2QkFBNkI7WUFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDO1FBRXJFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFTyxLQUFLLENBQUMsMkJBQTJCO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sY0FBYyxHQUFHLE1BQU0seUJBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkYsT0FBTyxJQUFBLDJDQUE4QixFQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQTFHRCwwQ0EwR0MifQ==
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { EnvironmentPermissionsV4
|
|
1
|
+
import { EnvironmentPermissionsV4 } from './types';
|
|
2
2
|
export declare type ActionPermissions = {
|
|
3
3
|
everythingAllowed: boolean;
|
|
4
4
|
actionsGloballyAllowed: Set<string>;
|
|
5
|
-
|
|
5
|
+
actionsByRole: Map<string, ActionPermission>;
|
|
6
6
|
};
|
|
7
|
-
export
|
|
7
|
+
export declare type ActionPermission = {
|
|
8
|
+
allowedRoles: Set<number>;
|
|
9
|
+
};
|
|
10
|
+
export default function generateActionsFromPermissions(environmentPermissions: EnvironmentPermissionsV4): ActionPermissions;
|
|
8
11
|
//# sourceMappingURL=generate-actions-from-permissions.d.ts.map
|
|
@@ -43,30 +43,22 @@ function generateActionsGloballyAllowed(permissions) {
|
|
|
43
43
|
.filter(([, permission]) => permission === true)
|
|
44
44
|
.map(([action]) => action));
|
|
45
45
|
}
|
|
46
|
-
function
|
|
47
|
-
return new Set(roles.reduce((acc, roleId) => {
|
|
48
|
-
const userIds = (userIdsByRole.get(roleId) || []).map(userId => `${userId}`);
|
|
49
|
-
return [...acc, ...userIds];
|
|
50
|
-
}, []));
|
|
51
|
-
}
|
|
52
|
-
function generateActionsAllowedByUser(permissions, users) {
|
|
53
|
-
const userIdsByRole = users.reduce((acc, { id, roleId }) => {
|
|
54
|
-
acc.set(roleId, [...(acc.get(roleId) || []), id]);
|
|
55
|
-
return acc;
|
|
56
|
-
}, new Map());
|
|
46
|
+
function generateActionsByRole(permissions) {
|
|
57
47
|
return new Map(Object.entries(permissions)
|
|
58
48
|
.filter(([, permission]) => typeof permission !== 'boolean')
|
|
59
49
|
.map(([name, permission]) => [
|
|
60
50
|
name,
|
|
61
|
-
|
|
51
|
+
{
|
|
52
|
+
allowedRoles: new Set(permission.roles),
|
|
53
|
+
},
|
|
62
54
|
]));
|
|
63
55
|
}
|
|
64
|
-
function generateActionsFromPermissions(environmentPermissions
|
|
56
|
+
function generateActionsFromPermissions(environmentPermissions) {
|
|
65
57
|
if (environmentPermissions === true) {
|
|
66
58
|
return {
|
|
67
59
|
everythingAllowed: true,
|
|
68
60
|
actionsGloballyAllowed: new Set(),
|
|
69
|
-
|
|
61
|
+
actionsByRole: new Map(),
|
|
70
62
|
};
|
|
71
63
|
}
|
|
72
64
|
const remotePermissions = environmentPermissions;
|
|
@@ -77,8 +69,8 @@ function generateActionsFromPermissions(environmentPermissions, users) {
|
|
|
77
69
|
return {
|
|
78
70
|
everythingAllowed: false,
|
|
79
71
|
actionsGloballyAllowed: generateActionsGloballyAllowed(allPermissions),
|
|
80
|
-
|
|
72
|
+
actionsByRole: generateActionsByRole(allPermissions),
|
|
81
73
|
};
|
|
82
74
|
}
|
|
83
75
|
exports.default = generateActionsFromPermissions;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtYWN0aW9ucy1mcm9tLXBlcm1pc3Npb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL2dlbmVyYXRlLWFjdGlvbnMtZnJvbS1wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZFQUdzQztBQUN0QyxtQ0FTaUI7QUFtQmpCLFNBQVMsNkJBQTZCLENBQ3BDLFdBQWdEO0lBRWhELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLENBQUMsRUFBRSxFQUFFO1FBQ3ZGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQztRQUU3QyxPQUFPO1lBQ0wsR0FBRyxHQUFHO1lBQ04sQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUM5RSxVQUFVLENBQUMsYUFBYTtZQUMxQixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzVFLFVBQVUsQ0FBQyxXQUFXO1lBQ3hCLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDNUUsVUFBVSxDQUFDLFdBQVc7WUFDeEIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUMzRSxVQUFVLENBQUMsVUFBVTtZQUN2QixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzlFLFVBQVUsQ0FBQyxhQUFhO1lBQzFCLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMs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
|
|
@@ -8,22 +8,26 @@ class PermissionServiceWithCache {
|
|
|
8
8
|
this.renderingPermissionService = renderingPermissionService;
|
|
9
9
|
}
|
|
10
10
|
async canOnCollection({ userId, collectionName, event, }) {
|
|
11
|
-
|
|
11
|
+
const roleId = await this.getRoleIdForUserId(userId);
|
|
12
|
+
return this.actionPermissionService.can(roleId, (0, generate_action_identifier_1.generateCollectionActionIdentifier)(event, collectionName));
|
|
12
13
|
}
|
|
13
14
|
async canExecuteSegmentQuery(params) {
|
|
14
15
|
return this.renderingPermissionService.canExecuteSegmentQuery(params);
|
|
15
16
|
}
|
|
16
|
-
canTriggerCustomAction({ userId, collectionName, customActionName, }) {
|
|
17
|
-
|
|
17
|
+
async canTriggerCustomAction({ userId, collectionName, customActionName, }) {
|
|
18
|
+
const roleId = await this.getRoleIdForUserId(userId);
|
|
19
|
+
return this.actionPermissionService.can(roleId, (0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.Trigger, customActionName, collectionName));
|
|
18
20
|
}
|
|
19
|
-
canApproveCustomAction({ userId, collectionName, customActionName, requesterId, }) {
|
|
21
|
+
async canApproveCustomAction({ userId, collectionName, customActionName, requesterId, }) {
|
|
20
22
|
const actionIdentifier = requesterId === userId
|
|
21
23
|
? (0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.SelfApprove, customActionName, collectionName)
|
|
22
24
|
: (0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.Approve, customActionName, collectionName);
|
|
23
|
-
|
|
25
|
+
const roleId = await this.getRoleIdForUserId(userId);
|
|
26
|
+
return this.actionPermissionService.can(roleId, actionIdentifier);
|
|
24
27
|
}
|
|
25
28
|
async canRequestCustomActionParameters({ userId, collectionName, customActionName, }) {
|
|
26
|
-
|
|
29
|
+
const roleId = await this.getRoleIdForUserId(userId);
|
|
30
|
+
return this.actionPermissionService.canOneOf(roleId, [
|
|
27
31
|
(0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.Trigger, customActionName, collectionName),
|
|
28
32
|
(0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.RequireApproval, customActionName, collectionName),
|
|
29
33
|
]);
|
|
@@ -35,6 +39,9 @@ class PermissionServiceWithCache {
|
|
|
35
39
|
chartRequest,
|
|
36
40
|
});
|
|
37
41
|
}
|
|
42
|
+
async getRoleIdForUserId(userId) {
|
|
43
|
+
return (await this.renderingPermissionService.getUser(userId))?.roleId;
|
|
44
|
+
}
|
|
38
45
|
}
|
|
39
46
|
exports.default = PermissionServiceWithCache;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi13aXRoLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL3Blcm1pc3Npb24td2l0aC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDZFQUdzQztBQUV0QyxtQ0FBbUU7QUFFbkUsTUFBcUIsMEJBQTBCO0lBQzdDLFlBQ21CLHVCQUF5QyxFQUN6QywwQkFBc0Q7UUFEdEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFrQjtRQUN6QywrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO0lBQ3RFLENBQUM7SUFFRyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzNCLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxHQUtOO1FBQ0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUNyQyxNQUFNLEVBQ04sSUFBQSwrREFBa0MsRUFBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQzFELENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BS25DO1FBQ0MsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUNsQyxNQUFNLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixHQUtqQjtRQUNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FDckMsTUFBTSxFQUNOLElBQUEsMkRBQThCLEVBQUMseUJBQWlCLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUM1RixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUNsQyxNQUFNLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixFQUNoQixXQUFXLEdBTVo7UUFDQyxNQUFNLGdCQUFnQixHQUNwQixXQUFXLEtBQUssTUFBTTtZQUNwQixDQUFDLENBQUMsSUFBQSwyREFBOEIsRUFDNUIseUJBQWlCLENBQUMsV0FBVyxFQUM3QixnQkFBZ0IsRUFDaEIsY0FBYyxDQUNmO1lBQ0gsQ0FBQyxDQUFDLElBQUEsMkRBQThCLEVBQzVCLHlCQUFpQixDQUFDLE9BQU8sRUFDekIsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBRVIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFDNUMsTUFBTSxFQUNOLGNBQWMsRUFDZCxnQkFBZ0IsR0FLakI7UUFDQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ25ELElBQUEsMkRBQThCLEVBQUMseUJBQWlCLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQztZQUMzRixJQUFBLDJEQUE4QixFQUM1Qix5QkFBaUIsQ0FBQyxlQUFlLEVBQ2pDLGdCQUFnQixFQUNoQixjQUFjLENBQ2Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUMzQixXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksR0FLYjtRQUNDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQztZQUNyRCxXQUFXO1lBQ1gsTUFBTTtZQUNOLFlBQVk7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQWM7UUFDN0MsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN6RSxDQUFDO0NBQ0Y7QUF0SEQsNkNBc0hDIn0=
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { ForestAdminClientOptionsWithDefaults } from '../types';
|
|
2
2
|
import { ForestServerCollection } from './types';
|
|
3
|
+
declare type SerializedSchema = {
|
|
4
|
+
meta: {
|
|
5
|
+
schemaFileHash: string;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
3
8
|
export default class SchemaService {
|
|
4
9
|
private options;
|
|
5
|
-
private serializer;
|
|
6
10
|
constructor(options: ForestAdminClientOptionsWithDefaults);
|
|
7
11
|
postSchema(schema: ForestServerCollection[], agentName: string, agentVersion: string): Promise<boolean>;
|
|
8
|
-
|
|
9
|
-
private
|
|
12
|
+
static serialize(schema: ForestServerCollection[], agentName: string, agentVersion: string): SerializedSchema;
|
|
13
|
+
private static get serializer();
|
|
10
14
|
private doServerWantsSchema;
|
|
11
15
|
}
|
|
16
|
+
export {};
|
|
12
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/schema/index.js
CHANGED
|
@@ -9,17 +9,16 @@ const server_1 = __importDefault(require("../utils/server"));
|
|
|
9
9
|
class SchemaService {
|
|
10
10
|
constructor(options) {
|
|
11
11
|
this.options = options;
|
|
12
|
-
this.serializer = this.getSerializer();
|
|
13
12
|
}
|
|
14
13
|
async postSchema(schema, agentName, agentVersion) {
|
|
15
|
-
const apimap =
|
|
14
|
+
const apimap = SchemaService.serialize(schema, agentName, agentVersion);
|
|
16
15
|
const shouldSend = await this.doServerWantsSchema(apimap.meta.schemaFileHash);
|
|
17
16
|
if (shouldSend) {
|
|
18
17
|
await server_1.default.query(this.options, 'post', '/forest/apimaps', {}, apimap);
|
|
19
18
|
}
|
|
20
19
|
return shouldSend;
|
|
21
20
|
}
|
|
22
|
-
serialize(schema, agentName, agentVersion) {
|
|
21
|
+
static serialize(schema, agentName, agentVersion) {
|
|
23
22
|
const data = schema.map(c => ({ id: c.name, ...c }));
|
|
24
23
|
const meta = {
|
|
25
24
|
liana: agentName,
|
|
@@ -33,12 +32,12 @@ class SchemaService {
|
|
|
33
32
|
.createHash('sha1')
|
|
34
33
|
.update(JSON.stringify({ ...schema, meta }))
|
|
35
34
|
.digest('hex');
|
|
36
|
-
return
|
|
35
|
+
return SchemaService.serializer.serialize('collections', data, {
|
|
37
36
|
...meta,
|
|
38
37
|
schemaFileHash,
|
|
39
38
|
});
|
|
40
39
|
}
|
|
41
|
-
|
|
40
|
+
static get serializer() {
|
|
42
41
|
const serializer = new json_api_serializer_1.default();
|
|
43
42
|
serializer.register('collections', {
|
|
44
43
|
// Pass the metadata provided to the serialization fn
|
|
@@ -59,4 +58,4 @@ class SchemaService {
|
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
60
|
exports.default = SchemaService;
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhFQUFvRDtBQUdwRCw2REFBMEM7QUFLMUMsTUFBcUIsYUFBYTtJQUNoQyxZQUFvQixPQUE2QztRQUE3QyxZQUFPLEdBQVAsT0FBTyxDQUFzQztJQUFHLENBQUM7SUFFckUsS0FBSyxDQUFDLFVBQVUsQ0FDZCxNQUFnQyxFQUNoQyxTQUFpQixFQUNqQixZQUFvQjtRQUVwQixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU5RSxJQUFJLFVBQVUsRUFBRTtZQUNkLE1BQU0sZ0JBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlFO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQ2QsTUFBZ0MsRUFDaEMsU0FBaUIsRUFDakIsWUFBb0I7UUFFcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRztZQUNYLEtBQUssRUFBRSxTQUFTO1lBQ2hCLGFBQWEsRUFBRSxZQUFZO1lBQzNCLEtBQUssRUFBRTtnQkFDTCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO2FBQzFEO1NBQ0YsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLGdCQUFNO2FBQzFCLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqQixPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUU7WUFDN0QsR0FBRyxJQUFJO1lBQ1AsY0FBYztTQUNmLENBQXFCLENBQUM7SUFDekIsQ0FBQztJQUVPLE1BQU0sS0FBSyxVQUFVO1FBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUksNkJBQWlCLEVBQUUsQ0FBQztRQUMzQyxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtZQUNqQyxxREFBcUQ7WUFDckQsWUFBWSxFQUFFLENBQUMsU0FBa0IsRUFBRSxFQUFFLENBQUMsU0FBUztZQUMvQyxhQUFhLEVBQUU7Z0JBQ2IsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDOUIsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTthQUM3QjtTQUNGLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBWTtRQUM1Qyx3REFBd0Q7UUFDeEQsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sZ0JBQVcsQ0FBQyxLQUFLLENBQzVDLElBQUksQ0FBQyxPQUFPLEVBQ1osTUFBTSxFQUNOLDJCQUEyQixFQUMzQixFQUFFLEVBQ0YsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQ3pCLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUF4RUQsZ0NBd0VDIn0=
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ChartRequest } from './charts/chart-handler';
|
|
2
2
|
import type { Chart, QueryChart } from './charts/types';
|
|
3
3
|
import type { CollectionActionEvent, RawTree } from './permissions/types';
|
|
4
|
+
import type { Client } from 'openid-client';
|
|
5
|
+
import { UserInfo } from './auth/types';
|
|
4
6
|
import { IpWhitelistConfiguration } from './ip-whitelist/types';
|
|
5
7
|
import { ForestServerCollection } from './schema/types';
|
|
6
8
|
import ContextVariables, { RequestContextVariables } from './utils/context-variables';
|
|
@@ -20,6 +22,8 @@ export interface ForestAdminClient {
|
|
|
20
22
|
verifySignedActionParameters<TSignedParameters>(signedParameters: string): TSignedParameters;
|
|
21
23
|
getIpWhitelistConfiguration(): Promise<IpWhitelistConfiguration>;
|
|
22
24
|
postSchema(schema: ForestServerCollection[], agentName: string, agentVersion: string): Promise<boolean>;
|
|
25
|
+
getOpenIdClient(): Promise<Client>;
|
|
26
|
+
getUserInfo(renderingId: number, accessToken: string): Promise<UserInfo>;
|
|
23
27
|
getScope(params: {
|
|
24
28
|
renderingId: number | string;
|
|
25
29
|
userId: number | string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/forestadmin-client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
"jsonwebtoken": "^8.5.1",
|
|
17
17
|
"lru-cache": "^7.3.1",
|
|
18
18
|
"object-hash": "^3.0.0",
|
|
19
|
-
"
|
|
19
|
+
"openid-client": "5.2.1",
|
|
20
|
+
"superagent": "^8.0.6"
|
|
20
21
|
},
|
|
21
22
|
"files": [
|
|
22
23
|
"dist/**/*.js",
|