@forestadmin/forestadmin-client 1.24.6 → 1.25.1
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.
|
@@ -19,10 +19,11 @@ export default class RenderingPermissionService {
|
|
|
19
19
|
userId: number | string;
|
|
20
20
|
}): Promise<RawTree>;
|
|
21
21
|
private getScopeOrRetry;
|
|
22
|
-
canExecuteSegmentQuery({ renderingId, collectionName, segmentQuery, }: {
|
|
22
|
+
canExecuteSegmentQuery({ renderingId, collectionName, segmentQuery, userId, }: {
|
|
23
23
|
renderingId: number | string;
|
|
24
24
|
collectionName: string;
|
|
25
25
|
segmentQuery: string;
|
|
26
|
+
userId: number;
|
|
26
27
|
}): Promise<boolean>;
|
|
27
28
|
private canExecuteSegmentQueryOrRetry;
|
|
28
29
|
private loadPermissions;
|
|
@@ -46,17 +46,25 @@ class RenderingPermissionService {
|
|
|
46
46
|
}
|
|
47
47
|
return context_variables_injector_1.default.injectContextInFilter(collectionPermissions.scope, new context_variables_1.default({ team: permissions.team, user: userInfo }));
|
|
48
48
|
}
|
|
49
|
-
async canExecuteSegmentQuery({ renderingId, collectionName, segmentQuery, }) {
|
|
49
|
+
async canExecuteSegmentQuery({ renderingId, collectionName, segmentQuery, userId, }) {
|
|
50
50
|
return ((await this.canExecuteSegmentQueryOrRetry({
|
|
51
51
|
renderingId,
|
|
52
52
|
collectionName,
|
|
53
53
|
segmentQuery,
|
|
54
|
+
userId,
|
|
54
55
|
// Only allow retry when not using server events
|
|
55
56
|
allowRetry: !this.options.instantCacheRefresh,
|
|
56
57
|
})) && (0, verify_sql_query_1.default)(segmentQuery));
|
|
57
58
|
}
|
|
58
|
-
async canExecuteSegmentQueryOrRetry({ renderingId, collectionName, segmentQuery, allowRetry, }) {
|
|
59
|
-
const permissions = await
|
|
59
|
+
async canExecuteSegmentQueryOrRetry({ renderingId, collectionName, segmentQuery, allowRetry, userId, }) {
|
|
60
|
+
const [userInfo, permissions] = await Promise.all([
|
|
61
|
+
this.userPermissions.getUserInfo(userId),
|
|
62
|
+
this.permissionsByRendering.fetch(`${renderingId}`),
|
|
63
|
+
]);
|
|
64
|
+
if ([types_1.PermissionLevel.Admin, types_1.PermissionLevel.Developer, types_1.PermissionLevel.Editor].includes(userInfo?.permissionLevel)) {
|
|
65
|
+
this.options.logger('Debug', `User ${userId} can retrieve SQL segment on rendering ${renderingId}`);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
60
68
|
const collectionPermissions = permissions?.collections?.[collectionName];
|
|
61
69
|
if (!collectionPermissions ||
|
|
62
70
|
!(0, is_segment_query_authorized_1.default)(segmentQuery, collectionPermissions.segments)) {
|
|
@@ -66,13 +74,14 @@ class RenderingPermissionService {
|
|
|
66
74
|
renderingId,
|
|
67
75
|
collectionName,
|
|
68
76
|
segmentQuery,
|
|
77
|
+
userId,
|
|
69
78
|
allowRetry: false,
|
|
70
79
|
});
|
|
71
80
|
}
|
|
72
|
-
this.options.logger('Debug', `User cannot retrieve SQL segment on rendering ${renderingId}`);
|
|
81
|
+
this.options.logger('Debug', `User ${userId} cannot retrieve SQL segment on rendering ${renderingId}`);
|
|
73
82
|
return false;
|
|
74
83
|
}
|
|
75
|
-
this.options.logger('Debug', `User can retrieve SQL segment on rendering ${renderingId}`);
|
|
84
|
+
this.options.logger('Debug', `User ${userId} can retrieve SQL segment on rendering ${renderingId}`);
|
|
76
85
|
return true;
|
|
77
86
|
}
|
|
78
87
|
async loadPermissions(renderingId) {
|
|
@@ -139,4 +148,4 @@ class RenderingPermissionService {
|
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
150
|
exports.default = RenderingPermissionService;
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLXBlcm1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcmVuZGVyaW5nLXBlcm1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBa0U7QUFDbEUsZ0dBQWtFO0FBQ2xFLG1DQU1pQjtBQUVqQiwwRUFBZ0Q7QUFHaEQsbUZBQTBEO0FBQzFELHFHQUEyRTtBQUMzRSxtRUFBMEM7QUFRMUMsTUFBcUIsMEJBQTBCO0lBRzdDLFlBQ21CLE9BQTZDLEVBQzdDLGVBQXNDLEVBQ3RDLDBCQUFzRDtRQUZ0RCxZQUFPLEdBQVAsT0FBTyxDQUFzQztRQUM3QyxvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDdEMsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQUV2RSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxtQkFBUSxDQUN4QyxLQUFLLEVBQUMsV0FBVyxFQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUM5RCxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxHQUFHLElBQUksQ0FDdEQsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQ3BCLFdBQVcsRUFDWCxjQUFjLEVBQ2QsTUFBTSxHQUtQO1FBQ0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzFCLFdBQVc7WUFDWCxjQUFjO1lBQ2QsTUFBTTtZQUNOLGdEQUFnRDtZQUNoRCxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQjtTQUM5QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUM1QixXQUFXLEVBQ1gsY0FBYyxFQUNkLE1BQU0sRUFDTixVQUFVLEdBTVg7UUFDQyxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sT0FB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
|
package/dist/schema/index.js
CHANGED
|
@@ -16,6 +16,10 @@ class SchemaService {
|
|
|
16
16
|
if (shouldSend) {
|
|
17
17
|
await server_1.default.query(this.options, 'post', '/forest/apimaps', {}, apimap);
|
|
18
18
|
}
|
|
19
|
+
const message = shouldSend
|
|
20
|
+
? 'Schema was updated, sending new version'
|
|
21
|
+
: 'Schema was not updated since last run';
|
|
22
|
+
this.options.logger('Info', `${message} (hash: ${apimap.meta.schemaFileHash})`);
|
|
19
23
|
return shouldSend;
|
|
20
24
|
}
|
|
21
25
|
static serialize(schema) {
|
|
@@ -47,4 +51,4 @@ class SchemaService {
|
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
exports.default = SchemaService;
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhFQUFvRDtBQUlwRCw2REFBMEM7QUFJMUMsTUFBcUIsYUFBYTtJQUNoQyxZQUFvQixPQUE2QztRQUE3QyxZQUFPLEdBQVAsT0FBTyxDQUFzQztJQUFHLENBQUM7SUFFckUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFvQjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFOUUsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLGdCQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM5RTtRQUVELE1BQU0sT0FBTyxHQUFHLFVBQVU7WUFDeEIsQ0FBQyxDQUFDLHlDQUF5QztZQUMzQyxDQUFDLENBQUMsdUNBQXVDLENBQUM7UUFFNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxXQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUVoRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFvQjtRQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLGNBQWMsR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RixPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUU7WUFDN0QsR0FBRyxNQUFNLENBQUMsSUFBSTtZQUNkLGNBQWM7U0FDZixDQUFxQixDQUFDO0lBQ3pCLENBQUM7SUFFTyxNQUFNLEtBQUssVUFBVTtRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUFpQixFQUFFLENBQUM7UUFDM0MsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7WUFDakMscURBQXFEO1lBQ3JELFlBQVksRUFBRSxDQUFDLFNBQWtCLEVBQUUsRUFBRSxDQUFDLFNBQVM7WUFDL0MsYUFBYSxFQUFFO2dCQUNiLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQzlCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7YUFDN0I7U0FDRixDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVuQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQVk7UUFDNUMsd0RBQXdEO1FBQ3hELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLGdCQUFXLENBQUMsS0FBSyxDQUM1QyxJQUFJLENBQUMsT0FBTyxFQUNaLE1BQU0sRUFDTiwyQkFBMkIsRUFDM0IsRUFBRSxFQUNGLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUN6QixDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBMURELGdDQTBEQyJ9
|