@forestadmin/agent-bff 1.15.0 → 1.16.0
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/cli-core.js +20 -3
- package/dist/data/agent-query.d.ts +2 -0
- package/dist/data/agent-query.js +28 -17
- package/dist/data/data-routes-middleware.js +65 -16
- package/dist/http/agent-error-mapper.js +15 -7
- package/dist/http/bff-http-error.d.ts +6 -1
- package/dist/http/bff-http-error.js +5 -4
- package/dist/http/bff-local-errors.d.ts +2 -0
- package/dist/http/bff-local-errors.js +12 -4
- package/dist/permissions/build-permission-hints.d.ts +40 -0
- package/dist/permissions/build-permission-hints.js +73 -0
- package/dist/permissions/can-role-perform.d.ts +12 -0
- package/dist/permissions/can-role-perform.js +18 -0
- package/dist/permissions/permissions-cache.d.ts +24 -0
- package/dist/permissions/permissions-cache.js +51 -0
- package/dist/permissions/permissions-client.d.ts +21 -0
- package/dist/permissions/permissions-client.js +27 -0
- package/dist/permissions/permissions-routes-middleware.d.ts +13 -0
- package/dist/permissions/permissions-routes-middleware.js +99 -0
- package/dist/read-model/read-model.d.ts +1 -0
- package/dist/read-model/read-model.js +4 -1
- package/dist/validation/capabilities-validator.d.ts +9 -0
- package/dist/validation/capabilities-validator.js +3 -1
- package/dist/validation/validation-errors.js +7 -5
- package/package.json +3 -3
package/dist/cli-core.js
CHANGED
|
@@ -28,6 +28,9 @@ const oauth_routes_1 = __importDefault(require("./oauth/oauth-routes"));
|
|
|
28
28
|
const session_store_1 = __importDefault(require("./oauth/session-store"));
|
|
29
29
|
const token_cipher_1 = __importDefault(require("./oauth/token-cipher"));
|
|
30
30
|
const openapi_routes_1 = __importDefault(require("./openapi/openapi-routes"));
|
|
31
|
+
const permissions_cache_1 = __importDefault(require("./permissions/permissions-cache"));
|
|
32
|
+
const permissions_client_1 = __importDefault(require("./permissions/permissions-client"));
|
|
33
|
+
const permissions_routes_middleware_1 = __importDefault(require("./permissions/permissions-routes-middleware"));
|
|
31
34
|
const create_read_model_1 = __importDefault(require("./read-model/create-read-model"));
|
|
32
35
|
const timezone_middleware_1 = __importDefault(require("./timezone/timezone-middleware"));
|
|
33
36
|
const version_1 = __importDefault(require("./version"));
|
|
@@ -117,8 +120,8 @@ function buildApiKeyMiddleware(config, logger) {
|
|
|
117
120
|
// data middleware falls through to the action middleware on a non-data path.
|
|
118
121
|
function buildAgentRouteMiddlewares(config, logger) {
|
|
119
122
|
const apiKeyConfig = resolveApiKeyConfig(config);
|
|
120
|
-
if (!apiKeyConfig
|
|
121
|
-
logger('Warn', 'Data endpoints disabled:
|
|
123
|
+
if (!apiKeyConfig) {
|
|
124
|
+
logger('Warn', 'Data, action and permissions endpoints disabled: FOREST_SERVER_URL, FOREST_ENV_SECRET or FOREST_AUTH_SECRET is missing');
|
|
122
125
|
return [(0, agent_stub_1.default)()];
|
|
123
126
|
}
|
|
124
127
|
const { store } = (0, create_read_model_1.default)({
|
|
@@ -127,7 +130,21 @@ function buildAgentRouteMiddlewares(config, logger) {
|
|
|
127
130
|
logger,
|
|
128
131
|
});
|
|
129
132
|
const { agentUrl, agentTimeoutMs: timeoutMs } = config;
|
|
133
|
+
const permissionsMiddleware = (0, permissions_routes_middleware_1.default)({
|
|
134
|
+
store,
|
|
135
|
+
client: new permissions_client_1.default({
|
|
136
|
+
forestServerUrl: apiKeyConfig.forestServerUrl,
|
|
137
|
+
envSecret: apiKeyConfig.forestEnvSecret,
|
|
138
|
+
}),
|
|
139
|
+
cache: new permissions_cache_1.default(),
|
|
140
|
+
logger,
|
|
141
|
+
});
|
|
142
|
+
if (!agentUrl) {
|
|
143
|
+
logger('Warn', 'Data and action endpoints disabled: AGENT_URL is missing');
|
|
144
|
+
return [permissionsMiddleware, (0, agent_stub_1.default)()];
|
|
145
|
+
}
|
|
130
146
|
return [
|
|
147
|
+
permissionsMiddleware,
|
|
131
148
|
(0, data_routes_middleware_1.default)({ store, agentUrl, timeoutMs, logger }),
|
|
132
149
|
(0, action_routes_middleware_1.default)({ store, agentUrl, timeoutMs, logger }),
|
|
133
150
|
];
|
|
@@ -180,4 +197,4 @@ function reportFatalError(err) {
|
|
|
180
197
|
process.stderr.write(`Error: ${(0, errors_1.extractErrorMessage)(err)}\n`);
|
|
181
198
|
process.exitCode = 1;
|
|
182
199
|
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvT0EseUJBa0NDO0FBRUQsNENBR0M7QUF2UUQsZ0RBQTZDO0FBRTdDLGlHQUE2RTtBQUM3RSwrRUFBNEQ7QUFDNUQsb0VBQTJEO0FBQzNELDRGQUF3RTtBQUN4RSw4RUFBb0Q7QUFDcEQsc0ZBQWtFO0FBQ2xFLDRFQUF5RDtBQUN6RCx1RkFBbUU7QUFDbkUsb0RBQWtEO0FBQ2xELDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFDQUErQztBQUMvQywwREFBcUQ7QUFDckQsNkVBQW1EO0FBQ25ELG1FQUEyQztBQUMzQywrRUFBNEQ7QUFDNUQsd0ZBQThEO0FBQzlELHdFQUFxRDtBQUNyRCwwRUFBK0Q7QUFDL0Qsd0VBQXFEO0FBQ3JELDhFQUEyRDtBQUMzRCx3RkFBK0Q7QUFDL0QsMEZBQWlFO0FBQ2pFLGdIQUE0RjtBQUM1Rix1RkFBNkQ7QUFDN0QseUZBQXNFO0FBQ3RFLHdEQUFnQztBQUVoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpDLFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFVBQXNCO0lBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDLENB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
|
package/dist/data/agent-query.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_PARSED_FILTER_DEPTH = void 0;
|
|
3
4
|
exports.parseListRequest = parseListRequest;
|
|
4
5
|
exports.parseCountRequest = parseCountRequest;
|
|
5
6
|
exports.buildListAgentQuery = buildListAgentQuery;
|
|
@@ -10,9 +11,25 @@ exports.parseRelationListRequest = parseRelationListRequest;
|
|
|
10
11
|
exports.parseRelationCountRequest = parseRelationCountRequest;
|
|
11
12
|
exports.collectCountFieldPaths = collectCountFieldPaths;
|
|
12
13
|
const bff_local_errors_1 = require("../http/bff-local-errors");
|
|
14
|
+
const capabilities_validator_1 = require("../validation/capabilities-validator");
|
|
15
|
+
Object.defineProperty(exports, "MAX_PARSED_FILTER_DEPTH", { enumerable: true, get: function () { return capabilities_validator_1.MAX_FILTER_DEPTH; } });
|
|
16
|
+
const validation_errors_1 = require("../validation/validation-errors");
|
|
13
17
|
function isPlainObject(value) {
|
|
14
18
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
15
19
|
}
|
|
20
|
+
function assertNoNodeReadableAsBothLeafAndBranch(node, depth = 0) {
|
|
21
|
+
if (depth > capabilities_validator_1.MAX_FILTER_DEPTH)
|
|
22
|
+
throw (0, validation_errors_1.filterTooDeep)(capabilities_validator_1.MAX_FILTER_DEPTH);
|
|
23
|
+
if (typeof node !== 'object' || node === null)
|
|
24
|
+
return;
|
|
25
|
+
const readableAsBranch = (0, capabilities_validator_1.isBranch)(node);
|
|
26
|
+
if ((0, capabilities_validator_1.isLeaf)(node) && readableAsBranch) {
|
|
27
|
+
throw (0, bff_local_errors_1.invalidRequest)('A filter node cannot carry both "field" and "conditions"');
|
|
28
|
+
}
|
|
29
|
+
if (readableAsBranch) {
|
|
30
|
+
node.conditions.forEach(condition => assertNoNodeReadableAsBothLeafAndBranch(condition, depth + 1));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
16
33
|
// Validate the untyped request body before it reaches the query builders, so malformed shapes
|
|
17
34
|
// (e.g. `projection` or `sort` as a string) surface as 400 invalid_request rather than a 500 from
|
|
18
35
|
// an array method blowing up downstream.
|
|
@@ -35,8 +52,10 @@ function parseListRequest(body) {
|
|
|
35
52
|
if (!valid)
|
|
36
53
|
throw (0, bff_local_errors_1.invalidRequest)('sort must be an array of { field, direction? }');
|
|
37
54
|
}
|
|
38
|
-
if (filter !== undefined
|
|
39
|
-
|
|
55
|
+
if (filter !== undefined) {
|
|
56
|
+
if (!isPlainObject(filter))
|
|
57
|
+
throw (0, bff_local_errors_1.invalidRequest)('filter must be an object');
|
|
58
|
+
assertNoNodeReadableAsBothLeafAndBranch(filter);
|
|
40
59
|
}
|
|
41
60
|
if (page !== undefined) {
|
|
42
61
|
if (!isPlainObject(page)) {
|
|
@@ -54,26 +73,18 @@ function parseListRequest(body) {
|
|
|
54
73
|
function parseCountRequest(body) {
|
|
55
74
|
if (!isPlainObject(body))
|
|
56
75
|
throw (0, bff_local_errors_1.invalidRequest)('Request body must be an object');
|
|
57
|
-
if (body.filter !== undefined
|
|
58
|
-
|
|
76
|
+
if (body.filter !== undefined) {
|
|
77
|
+
if (!isPlainObject(body.filter))
|
|
78
|
+
throw (0, bff_local_errors_1.invalidRequest)('filter must be an object');
|
|
79
|
+
assertNoNodeReadableAsBothLeafAndBranch(body.filter);
|
|
59
80
|
}
|
|
60
81
|
return body;
|
|
61
82
|
}
|
|
62
|
-
function isBranch(node) {
|
|
63
|
-
return (typeof node === 'object' &&
|
|
64
|
-
node !== null &&
|
|
65
|
-
Array.isArray(node.conditions));
|
|
66
|
-
}
|
|
67
|
-
function isLeaf(node) {
|
|
68
|
-
return (typeof node === 'object' &&
|
|
69
|
-
node !== null &&
|
|
70
|
-
typeof node.field === 'string');
|
|
71
|
-
}
|
|
72
83
|
function collectFilterFields(filter, acc) {
|
|
73
|
-
if (isBranch(filter)) {
|
|
84
|
+
if ((0, capabilities_validator_1.isBranch)(filter)) {
|
|
74
85
|
filter.conditions.forEach(condition => collectFilterFields(condition, acc));
|
|
75
86
|
}
|
|
76
|
-
else if (isLeaf(filter)) {
|
|
87
|
+
else if ((0, capabilities_validator_1.isLeaf)(filter)) {
|
|
77
88
|
acc.push(filter.field);
|
|
78
89
|
}
|
|
79
90
|
}
|
|
@@ -141,4 +152,4 @@ function collectCountFieldPaths(body) {
|
|
|
141
152
|
collectFilterFields(body.filter, paths);
|
|
142
153
|
return paths;
|
|
143
154
|
}
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS9hZ2VudC1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5REEsNENBNkNDO0FBRUQsOENBU0M7QUEyQkQsa0RBYUM7QUFFRCxvREFNQztBQUVELHNEQU1DO0FBS0Qsc0NBWUM7QUFFRCw0REFJQztBQUVELDhEQUlDO0FBRUQsd0RBS0M7QUE3TUQsK0RBQTBEO0FBQzFELGlGQUEwRjtBQUc3RCx3R0FIcEIseUNBQWdCLE9BRzJCO0FBRnBELHVFQUFnRTtBQStCaEUsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyx1Q0FBdUMsQ0FBQyxJQUFhLEVBQUUsS0FBSyxHQUFHLENBQUM7SUFDdkUsSUFBSSxLQUFLLEdBQUcseUNBQWdCO1FBQUUsTUFBTSxJQUFBLGlDQUFhLEVBQUMseUNBQWdCLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU87SUFFdEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLGlDQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEMsSUFBSSxJQUFBLCtCQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUEsaUNBQWMsRUFBQywwREFBMEQsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FDbEMsdUNBQXVDLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FD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
|
|
@@ -31,27 +31,54 @@ function assertCollectionStillAllowed(readModel, collection) {
|
|
|
31
31
|
if (!readModel.isCollectionAllowed(collection))
|
|
32
32
|
throw (0, bff_local_errors_1.unknownCollection)();
|
|
33
33
|
}
|
|
34
|
-
function
|
|
35
|
-
return
|
|
34
|
+
function toValidationInput(body) {
|
|
35
|
+
return {
|
|
36
|
+
filter: body.filter,
|
|
37
|
+
sortFields: body.sort?.map(clause => clause.field),
|
|
38
|
+
projectionFields: body.projection,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function resolveCapabilities(deps, collection) {
|
|
42
|
+
return (0, agent_route_helpers_1.callAgent)(() => deps.store.getCapabilities(collection, (0, agent_capabilities_fetcher_1.default)({
|
|
36
43
|
agentUrl: deps.agentUrl,
|
|
37
44
|
token: deps.token,
|
|
38
45
|
timeoutMs: deps.timeoutMs,
|
|
39
46
|
})), deps.logger);
|
|
40
47
|
}
|
|
48
|
+
async function resolveCapabilitiesOrRethrowUnlessVanished(deps, collection, assertStillExposed) {
|
|
49
|
+
try {
|
|
50
|
+
return await resolveCapabilities(deps, collection);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
deps.logger('Warn', 'Capabilities lookup failed; re-checking exposure before rethrowing', {
|
|
54
|
+
collection,
|
|
55
|
+
});
|
|
56
|
+
let readModel;
|
|
57
|
+
try {
|
|
58
|
+
readModel = await (0, agent_route_helpers_1.resolveReadModel)(deps.store);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
assertStillExposed(readModel);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function resolveOwnCapabilities(deps) {
|
|
68
|
+
const assertStillAllowed = (readModel) => assertCollectionStillAllowed(readModel, deps.collection);
|
|
69
|
+
const result = await resolveCapabilitiesOrRethrowUnlessVanished(deps, deps.collection, assertStillAllowed);
|
|
70
|
+
assertStillAllowed(result.readModel);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
41
73
|
async function handleList(ctx, body, deps) {
|
|
42
74
|
(0, relation_field_guard_1.default)((0, agent_query_1.collectListFieldPaths)(body));
|
|
43
|
-
const validationInput =
|
|
44
|
-
filter: body.filter,
|
|
45
|
-
sortFields: body.sort?.map(clause => clause.field),
|
|
46
|
-
projectionFields: body.projection,
|
|
47
|
-
};
|
|
75
|
+
const validationInput = toValidationInput(body);
|
|
48
76
|
// The store hands back the read-model the capabilities belong to; using it keeps the primary keys
|
|
49
77
|
// serialized below from a different schema generation than the fields just validated, and re-checks
|
|
50
78
|
// the allow-list in case that generation dropped the collection.
|
|
51
79
|
let { primaryKeys } = deps;
|
|
52
80
|
if ((0, capabilities_validator_1.hasCapabilityConstrainedInput)(validationInput)) {
|
|
53
|
-
const { capabilities, readModel } = await
|
|
54
|
-
assertCollectionStillAllowed(readModel, deps.collection);
|
|
81
|
+
const { capabilities, readModel } = await resolveOwnCapabilities(deps);
|
|
55
82
|
(0, capabilities_validator_1.assertValidAgainstCapabilities)(validationInput, capabilities);
|
|
56
83
|
primaryKeys = readModel.getPrimaryKeys(deps.collection);
|
|
57
84
|
}
|
|
@@ -64,8 +91,7 @@ async function handleCount(ctx, body, deps) {
|
|
|
64
91
|
(0, relation_field_guard_1.default)((0, agent_query_1.collectCountFieldPaths)(body));
|
|
65
92
|
// Count carries only a filter (no sort/projection), so that is all there is to validate.
|
|
66
93
|
if (body.filter !== undefined) {
|
|
67
|
-
const { capabilities
|
|
68
|
-
assertCollectionStillAllowed(readModel, deps.collection);
|
|
94
|
+
const { capabilities } = await resolveOwnCapabilities(deps);
|
|
69
95
|
(0, capabilities_validator_1.assertValidAgainstCapabilities)({ filter: body.filter }, capabilities);
|
|
70
96
|
}
|
|
71
97
|
const query = (0, agent_query_1.buildCountAgentQuery)(deps.timezone, body);
|
|
@@ -73,18 +99,41 @@ async function handleCount(ctx, body, deps) {
|
|
|
73
99
|
ctx.status = 200;
|
|
74
100
|
ctx.body = (0, response_mappers_1.mapCountResponse)(raw);
|
|
75
101
|
}
|
|
102
|
+
function assertRelationStillExposed(readModel, deps) {
|
|
103
|
+
assertCollectionStillAllowed(readModel, deps.collection);
|
|
104
|
+
const stillTargets = resolveForeignCollection(readModel.getRelationTarget(deps.collection, deps.relation));
|
|
105
|
+
if (stillTargets !== deps.foreignCollection) {
|
|
106
|
+
throw (0, bff_local_errors_1.unknownRelation)(`Unknown relation: ${deps.collection}.${deps.relation}`);
|
|
107
|
+
}
|
|
108
|
+
assertCollectionStillAllowed(readModel, deps.foreignCollection);
|
|
109
|
+
}
|
|
110
|
+
async function resolveExposedRelationCapabilities(deps) {
|
|
111
|
+
const assertStillExposed = (readModel) => assertRelationStillExposed(readModel, deps);
|
|
112
|
+
assertStillExposed(await (0, agent_route_helpers_1.resolveReadModel)(deps.store));
|
|
113
|
+
const result = await resolveCapabilitiesOrRethrowUnlessVanished(deps, deps.foreignCollection, assertStillExposed);
|
|
114
|
+
assertStillExposed(result.readModel);
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
76
117
|
async function handleRelationList(ctx, body, deps) {
|
|
77
|
-
// The nested-relation guard IS wired here: the agent's list-related asserts browse only on the
|
|
78
|
-
// immediate foreign collection, so a nested `:`-path would traverse to a third collection whose
|
|
79
|
-
// browse is never checked. Plain foreign fields (no `:`) are unaffected.
|
|
80
118
|
(0, relation_field_guard_1.default)((0, agent_query_1.collectListFieldPaths)(body));
|
|
119
|
+
const validationInput = toValidationInput(body);
|
|
120
|
+
let { primaryKeys } = deps;
|
|
121
|
+
if ((0, capabilities_validator_1.hasCapabilityConstrainedInput)(validationInput)) {
|
|
122
|
+
const { capabilities, readModel } = await resolveExposedRelationCapabilities(deps);
|
|
123
|
+
(0, capabilities_validator_1.assertValidAgainstCapabilities)(validationInput, capabilities);
|
|
124
|
+
primaryKeys = readModel.getPrimaryKeys(deps.foreignCollection);
|
|
125
|
+
}
|
|
81
126
|
const query = (0, agent_query_1.buildListAgentQuery)(deps.foreignCollection, deps.timezone, body);
|
|
82
127
|
const records = await (0, agent_route_helpers_1.callAgent)(() => deps.client.listRelation(deps.collection, body.parentId, deps.relation, query), deps.logger);
|
|
83
128
|
ctx.status = 200;
|
|
84
|
-
ctx.body = (0, response_mappers_1.mapListResponse)(deps.foreignCollection, records,
|
|
129
|
+
ctx.body = (0, response_mappers_1.mapListResponse)(deps.foreignCollection, records, primaryKeys);
|
|
85
130
|
}
|
|
86
131
|
async function handleRelationCount(ctx, body, deps) {
|
|
87
132
|
(0, relation_field_guard_1.default)((0, agent_query_1.collectCountFieldPaths)(body));
|
|
133
|
+
if (body.filter !== undefined) {
|
|
134
|
+
const { capabilities } = await resolveExposedRelationCapabilities(deps);
|
|
135
|
+
(0, capabilities_validator_1.assertValidAgainstCapabilities)({ filter: body.filter }, capabilities);
|
|
136
|
+
}
|
|
88
137
|
const query = (0, agent_query_1.buildCountAgentQuery)(deps.timezone, body);
|
|
89
138
|
const raw = await (0, agent_route_helpers_1.callAgent)(() => deps.client.countRelationRaw(deps.collection, body.parentId, deps.relation, query), deps.logger);
|
|
90
139
|
ctx.status = 200;
|
|
@@ -163,4 +212,4 @@ function createDataRoutesMiddleware({ store, agentUrl, timeoutMs, logger, create
|
|
|
163
212
|
}
|
|
164
213
|
};
|
|
165
214
|
}
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2RhdGEtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFxT0EsNkNBMERDO0FBalJELDRFQUErRDtBQUMvRCwrQ0FTdUI7QUFDdkIseURBQXVFO0FBQ3ZFLHFFQUtxQztBQUNyQywrREFBOEU7QUFDOUUsMEdBQXNGO0FBQ3RGLGlGQUc4QztBQUM5Qyw4RkFBNEU7QUFFNUUsTUFBTSxVQUFVLEdBQUcsc0NBQXNDLENBQUM7QUFDMUQsTUFBTSxjQUFjLEdBQUcsMERBQTBELENBQUM7QUFFbEYsb0dBQW9HO0FBQ3BHLHFHQUFxRztBQUNyRyxTQUFTLHdCQUF3QixDQUFDLE1BQWtDO0lBQ2xFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNsRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTlFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN2QixDQUFDO0FBdUJELG1HQUFtRztBQUNuRyxrR0FBa0c7QUFDbEcscUdBQXFHO0FBQ3JHLDJGQUEyRjtBQUMzRixTQUFTLDRCQUE0QixDQUFDLFNBQW9CLEVBQUUsVUFBa0I7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7UUFBRSxNQUFNLElBQUEsb0NBQWlCLEdBQUUsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsSUFBd0I7SUFFeEIsT0FBTyxJQUFBLCtCQUFTLEVBQ2QsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBQSxvQ0FBOEIsRUFBQztRQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7UUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztLQUMxQixDQUFDLENBQ0gsRUFDSCxJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxHQUFZLEVBQUUsSUFBcUIsRUFBRSxJQUFxQjtJQUNsRixJQUFBLDhCQUEwQixFQUFDLElBQUEsbUNBQXFCLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUV4RCxNQUFNLGVBQWUsR0FBRztRQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsVUFBVTtLQUNsQyxDQUFDO0lBRUYsa0dBQWtHO0lBQ2xHLG9HQUFvRztJQUNwRyxpRUFBaUU7SUFDakUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUUzQixJQUFJLElBQUEsc0RBQTZCLEVBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsNEJBQTRCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFBLHVEQUE4QixFQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RCxXQUFXLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsaUNBQW1CLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSwrQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTdGLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBQSxrQ0FBZSxFQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQVksRUFBRSxJQUFzQixFQUFFLElBQXdCO0lBQ3ZGLElBQUEsOEJBQTBCLEVBQUMsSUFBQSxvQ0FBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXpELHlGQUF5RjtJQUN6RixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBQSx1REFBOEIsRUFBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsa0NBQW9CLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsK0JBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU3RixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUEsbUNBQWdCLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQVdELEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsR0FBWSxFQUNaLElBQTZCLEVBQzdCLElBQTZCO0lBRTdCLCtGQUErRjtJQUMvRixnR0FBZ0c7SUFDaEcseUVBQXlFO0lBQ3pFLElBQUEsOEJBQTBCLEVBQUMsSUFBQSxtQ0FBcUIsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXhELE1BQU0sS0FBSyxHQUFHLElBQUEsaUNBQW1CLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLCtCQUFTLEVBQzdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUNwRixJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7SUFFRixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUEsa0NBQWUsRUFBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxHQUFZLEVBQ1osSUFBOEIsRUFDOUIsSUFBeUI7SUFFekIsSUFBQSw4QkFBMEIsRUFBQyxJQUFBLG9DQUFzQixFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFekQsTUFBTSxLQUFLLEdBQUcsSUFBQSxrQ0FBb0IsRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSwrQkFBUyxFQUN6QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUN4RixJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7SUFFRixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUNqQixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUEsbUNBQWdCLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELEtBQUssVUFBVSxjQUFjLENBQzNCLEdBQVksRUFDWixPQUFnQixFQUNoQixLQUFzQixFQUN0QixFQUFFLElBQUksRUFBRSxTQUFTLEVBQXNEO0lBRXZFLE1BQU0sUUFBUSxHQUFHLElBQUEsbUNBQWEsRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBcUIsQ0FBQztJQUUvQyxxRkFBcUY7SUFDckYsc0RBQXNEO0lBQ3RELE1BQU0saUJBQWlCLEdBQUcsd0JBQXdCLENBQ2hELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUN2RCxDQUFDO0lBRUYsa0dBQWtHO0lBQ2xHLGdHQUFnRztJQUNoRyx5RkFBeUY7SUFDekYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFBLGtDQUFlLEVBQUMscUJBQXFCLElBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLG1HQUFtRztJQUNuRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUEsb0NBQWlCLEdBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQXdCLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLENBQUM7SUFFbkYsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekIsTUFBTSxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBQSxzQ0FBd0IsRUFBQyxPQUFPLENBQUMsRUFBRTtZQUMvRCxHQUFHLFlBQVk7WUFDZixXQUFXLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztTQUN6RCxDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUEsdUNBQXlCLEVBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUF3QiwwQkFBMEIsQ0FBQyxFQUNqRCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxHQUFHLDJCQUE0QixHQUNmO0lBQzVCLE9BQU8sS0FBSyxVQUFVLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQ2xELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RSxNQUFNLEtBQUssR0FBRyxTQUFTLElBQUksYUFBYSxDQUFDO1FBRXpDLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksRUFBRSxDQUFDO1lBRWIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFBLG1DQUFhLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBQSx1Q0FBaUIsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsc0NBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQy9DLDZGQUE2RjtZQUM3Riw0RkFBNEY7WUFDNUYsNkZBQTZGO1lBQzdGLHlFQUF5RTtZQUN6RSxNQUFNLElBQUEsb0NBQWlCLEVBQUMsdUJBQXVCLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUF1QjtZQUMvQixVQUFVO1lBQ1YsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDcEQsS0FBSztZQUNMLFFBQVE7WUFDUixTQUFTO1lBQ1QsS0FBSztZQUNMLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQWtCO1lBQ3RDLE1BQU07U0FDUCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXZDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsTUFBTSxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUV2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQXFCLENBQUM7UUFFL0MsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxNQUFNLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEdBQUcsSUFBQSwrQkFBaUIsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIn0=
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2RhdGEtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErVEEsNkNBMERDO0FBM1dELDRFQUErRDtBQUMvRCwrQ0FTdUI7QUFDdkIseURBQXVFO0FBQ3ZFLHFFQUtxQztBQUNyQywrREFBOEU7QUFDOUUsMEdBQXNGO0FBQ3RGLGlGQUc4QztBQUM5Qyw4RkFBNEU7QUFFNUUsTUFBTSxVQUFVLEdBQUcsc0NBQXNDLENBQUM7QUFDMUQsTUFBTSxjQUFjLEdBQUcsMERBQTBELENBQUM7QUFFbEYsb0dBQW9HO0FBQ3BHLHFHQUFxRztBQUNyRyxTQUFTLHdCQUF3QixDQUFDLE1BQWtDO0lBQ2xFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNsRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTlFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN2QixDQUFDO0FBdUJELG1HQUFtRztBQUNuRyxrR0FBa0c7QUFDbEcscUdBQXFHO0FBQ3JHLDJGQUEyRjtBQUMzRixTQUFTLDRCQUE0QixDQUFDLFNBQW9CLEVBQUUsVUFBa0I7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7UUFBRSxNQUFNLElBQUEsb0NBQWlCLEdBQUUsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUErQztJQUN4RSxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFB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
|
|
@@ -40,7 +40,11 @@ function coerceStatus(status, fallback) {
|
|
|
40
40
|
function fallbackTypeByStatus(status) {
|
|
41
41
|
return FALLBACK_TYPE_BY_STATUS[status] ?? TYPE_INVALID_REQUEST;
|
|
42
42
|
}
|
|
43
|
-
function
|
|
43
|
+
function logCauseAndReturnAgentUnavailable(logger, status, cause) {
|
|
44
|
+
logger('Warn', 'Agent 5xx mapped to agent_unavailable; client message is generic', {
|
|
45
|
+
status,
|
|
46
|
+
cause,
|
|
47
|
+
});
|
|
44
48
|
return new bff_http_error_1.BffHttpError(503, TYPE_AGENT_UNAVAILABLE, DEFAULT_UNAVAILABLE_MESSAGE);
|
|
45
49
|
}
|
|
46
50
|
function firstJsonApiError(body) {
|
|
@@ -54,8 +58,9 @@ function mapJsonApiError(agentError, fallbackStatus, logger) {
|
|
|
54
58
|
// Never surface an upstream failure as a 2xx/3xx: ignore a non-error body status.
|
|
55
59
|
const status = bodyStatus >= 400 ? bodyStatus : fallbackStatus;
|
|
56
60
|
// The wrapped-message path skips the outer AgentHttpError 5xx check, so normalize here too.
|
|
57
|
-
if (status >= 500)
|
|
58
|
-
return
|
|
61
|
+
if (status >= 500) {
|
|
62
|
+
return logCauseAndReturnAgentUnavailable(logger, status, agentError.detail ?? agentError.message ?? DEFAULT_ERROR_MESSAGE);
|
|
63
|
+
}
|
|
59
64
|
const message = agentError.detail ?? agentError.message ?? DEFAULT_ERROR_MESSAGE;
|
|
60
65
|
const mappedType = agentError.name ? exports.AGENT_ERROR_TYPE_MAP[agentError.name] : undefined;
|
|
61
66
|
if (agentError.name && mappedType === undefined) {
|
|
@@ -64,7 +69,9 @@ function mapJsonApiError(agentError, fallbackStatus, logger) {
|
|
|
64
69
|
status,
|
|
65
70
|
});
|
|
66
71
|
}
|
|
67
|
-
return new bff_http_error_1.BffHttpError(status, mappedType ?? fallbackTypeByStatus(status), message,
|
|
72
|
+
return new bff_http_error_1.BffHttpError(status, mappedType ?? fallbackTypeByStatus(status), message, {
|
|
73
|
+
details: agentError.data,
|
|
74
|
+
});
|
|
68
75
|
}
|
|
69
76
|
function parseJsonApiFromMessage(error) {
|
|
70
77
|
if (!(error instanceof Error))
|
|
@@ -104,11 +111,12 @@ function mapAgentError(error, { logger }) {
|
|
|
104
111
|
});
|
|
105
112
|
return new bff_http_error_1.BffHttpError(502, TYPE_NETWORK_ERROR, DEFAULT_NETWORK_MESSAGE);
|
|
106
113
|
}
|
|
107
|
-
if (error.status >= 500)
|
|
108
|
-
return
|
|
114
|
+
if (error.status >= 500) {
|
|
115
|
+
return logCauseAndReturnAgentUnavailable(logger, error.status, firstJsonApiError(error.body)?.detail ?? error.responseText ?? DEFAULT_ERROR_MESSAGE);
|
|
116
|
+
}
|
|
109
117
|
const agentError = firstJsonApiError(error.body);
|
|
110
118
|
if (agentError)
|
|
111
119
|
return mapJsonApiError(agentError, error.status, logger);
|
|
112
120
|
return mapFlatBody(error.status, error.body, error.responseText);
|
|
113
121
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtZXJyb3ItbWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvYWdlbnQtZXJyb3ItbWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtKQSxzQ0FrQ0M7QUFsTEQsNERBQTJEO0FBRTNELHFEQUFnRDtBQUVoRCxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDO0FBQy9DLE1BQU0scUJBQXFCLEdBQUcsa0JBQWtCLENBQUM7QUFDakQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUM7QUFDekMsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDO0FBQ25DLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQztBQUNuQyxNQUFNLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDO0FBQ2xELE1BQU0sc0JBQXNCLEdBQUcsbUJBQW1CLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztBQWFuRCxNQUFNLHVCQUF1QixHQUFHLGdDQUFnQyxDQUFDO0FBQ2pFLE1BQU0sMkJBQTJCLEdBQUcsMEJBQTBCLENBQUM7QUFDL0QsTUFBTSxxQkFBcUIsR0FBRyxrQkFBa0IsQ0FBQztBQUVwQyxRQUFBLG9CQUFvQixHQUFpQztJQUNoRSxlQUFlLEVBQUUscUJBQXFCO0lBQ3RDLGVBQWUsRUFBRSxvQkFBb0I7SUFDckMsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLGNBQWMsRUFBRSxjQUFjO0lBQzlCLGFBQWEsRUFBRSxjQUFjO0lBQzdCLGtCQUFrQixFQUFFLGtCQUFrQjtJQUN0QyxvQkFBb0IsRUFBRSxzQkFBc0I7Q0FDN0MsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQWlDO0lBQzVELEdBQUcsRUFBRSxvQkFBb0I7SUFDekIsR0FBRyxFQUFFLGlCQUFpQjtJQUN0QixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsY0FBYztJQUNuQixH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
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
export interface BffHttpErrorOptions {
|
|
2
|
+
details?: unknown;
|
|
3
|
+
retryAfter?: number;
|
|
4
|
+
}
|
|
1
5
|
export declare class BffHttpError extends Error {
|
|
2
6
|
readonly status: number;
|
|
3
7
|
readonly type: string;
|
|
4
8
|
readonly details?: unknown;
|
|
5
|
-
|
|
9
|
+
readonly retryAfter?: number;
|
|
10
|
+
constructor(status: number, type: string, message: string, options?: BffHttpErrorOptions);
|
|
6
11
|
}
|
|
7
12
|
export interface BffErrorBody {
|
|
8
13
|
error: {
|
|
@@ -11,12 +11,13 @@ exports.missingTimezone = missingTimezone;
|
|
|
11
11
|
exports.invalidTimezone = invalidTimezone;
|
|
12
12
|
exports.relationFieldNotSupported = relationFieldNotSupported;
|
|
13
13
|
class BffHttpError extends Error {
|
|
14
|
-
constructor(status, type, message,
|
|
14
|
+
constructor(status, type, message, options = {}) {
|
|
15
15
|
super(message);
|
|
16
16
|
this.name = 'BffHttpError';
|
|
17
17
|
this.status = status;
|
|
18
18
|
this.type = type;
|
|
19
|
-
this.details = details;
|
|
19
|
+
this.details = options.details;
|
|
20
|
+
this.retryAfter = options.retryAfter;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
exports.BffHttpError = BffHttpError;
|
|
@@ -54,6 +55,6 @@ function invalidTimezone(value) {
|
|
|
54
55
|
return new BffHttpError(400, 'invalid_timezone', `Invalid timezone: "${value}"`);
|
|
55
56
|
}
|
|
56
57
|
function relationFieldNotSupported(fields) {
|
|
57
|
-
return new BffHttpError(422, 'relation_field_not_supported', 'Nested relation field paths are not supported on top-level list and count', { fields });
|
|
58
|
+
return new BffHttpError(422, 'relation_field_not_supported', 'Nested relation field paths are not supported on top-level list and count', { details: { fields } });
|
|
58
59
|
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLWh0dHAtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaHR0cC9iZmYtaHR0cC1lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4QkEsa0RBY0M7QUFFRCxrQ0FhQztBQUVELG9DQUVDO0FBRUQsb0RBSUM7QUFFRCx3Q0FFQztBQUVELDRDQUVDO0FBRUQsMENBSUM7QUFFRCwwQ0FFQztBQUVELDhEQU9DO0FBM0ZELE1BQWEsWUFBYSxTQUFRLEtBQUs7SUFNckMsWUFBWSxNQUFjLEVBQUUsSUFBWSxFQUFFLE9BQWUsRUFBRSxVQUErQixFQUFFO1FBQzFGLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBZEQsb0NBY0M7QUFXRCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFjO0lBT2hELE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsT0FBUSxLQUE4QixDQUFDLE1BQU0sS0FBSyxRQUFRO1FBQzFELE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUN0RCxPQUFRLEtBQStCLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FDN0QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsS0FLM0I7SUFDQyxNQUFNLElBQUksR0FBaUI7UUFDekIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7S0FDMUUsQ0FBQztJQUVGLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUVwRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsT0FBTyxHQUFHLGdDQUFnQztJQUNyRSxPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUNsQyxPQUFPLEdBQUcsdURBQXVEO0lBRWpFLE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsT0FBTyxHQUFHLDZCQUE2QjtJQUNwRSxPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLG9DQUFvQztJQUM3RSxPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUM3QixPQUFPLEdBQUcsOENBQThDO0lBRXhELE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFnQixlQUFlLENBQUMsS0FBYTtJQUMzQyxPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNuRixDQUFDO0FBRUQsU0FBZ0IseUJBQXlCLENBQUMsTUFBZ0I7SUFDeEQsT0FBTyxJQUFJLFlBQVksQ0FDckIsR0FBRyxFQUNILDhCQUE4QixFQUM5QiwyRUFBMkUsRUFDM0UsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUN4QixDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -11,5 +11,7 @@ export declare function schemaUnavailable(message?: string): BffHttpError;
|
|
|
11
11
|
export declare function unsupportedActionResult(message?: string): BffHttpError;
|
|
12
12
|
export declare function actionError(message?: string, details?: unknown): BffHttpError;
|
|
13
13
|
export declare function openapiDisabled(message?: string): BffHttpError;
|
|
14
|
+
export declare function forestIdentityNotAllowed(message?: string): BffHttpError;
|
|
15
|
+
export declare function permissionsUnavailable(retryAfter: number, message?: string): BffHttpError;
|
|
14
16
|
export declare function actionRequiresApproval(message?: string, details?: unknown): BffHttpError;
|
|
15
17
|
//# sourceMappingURL=bff-local-errors.d.ts.map
|
|
@@ -12,6 +12,8 @@ exports.schemaUnavailable = schemaUnavailable;
|
|
|
12
12
|
exports.unsupportedActionResult = unsupportedActionResult;
|
|
13
13
|
exports.actionError = actionError;
|
|
14
14
|
exports.openapiDisabled = openapiDisabled;
|
|
15
|
+
exports.forestIdentityNotAllowed = forestIdentityNotAllowed;
|
|
16
|
+
exports.permissionsUnavailable = permissionsUnavailable;
|
|
15
17
|
exports.actionRequiresApproval = actionRequiresApproval;
|
|
16
18
|
const bff_http_error_1 = require("./bff-http-error");
|
|
17
19
|
function unknownCollection(message = 'Unknown collection') {
|
|
@@ -33,7 +35,7 @@ function actionNotAllowed(message = 'Action is not allowed') {
|
|
|
33
35
|
return new bff_http_error_1.BffHttpError(403, 'action_not_allowed', message);
|
|
34
36
|
}
|
|
35
37
|
function invalidRequest(message = 'Invalid request', details) {
|
|
36
|
-
return new bff_http_error_1.BffHttpError(400, 'invalid_request', message, details);
|
|
38
|
+
return new bff_http_error_1.BffHttpError(400, 'invalid_request', message, { details });
|
|
37
39
|
}
|
|
38
40
|
function mappingError(message = 'Failed to map the agent response') {
|
|
39
41
|
return new bff_http_error_1.BffHttpError(500, 'mapping_error', message);
|
|
@@ -45,12 +47,18 @@ function unsupportedActionResult(message = 'Unsupported action result') {
|
|
|
45
47
|
return new bff_http_error_1.BffHttpError(501, 'unsupported_action_result', message);
|
|
46
48
|
}
|
|
47
49
|
function actionError(message = 'The action failed', details) {
|
|
48
|
-
return new bff_http_error_1.BffHttpError(400, 'action_error', message, details);
|
|
50
|
+
return new bff_http_error_1.BffHttpError(400, 'action_error', message, { details });
|
|
49
51
|
}
|
|
50
52
|
function openapiDisabled(message = 'The OpenAPI document is not served') {
|
|
51
53
|
return new bff_http_error_1.BffHttpError(404, 'openapi_disabled', message);
|
|
52
54
|
}
|
|
55
|
+
function forestIdentityNotAllowed(message = 'Forest identity not allowed') {
|
|
56
|
+
return new bff_http_error_1.BffHttpError(403, 'forest_identity_not_allowed', message);
|
|
57
|
+
}
|
|
58
|
+
function permissionsUnavailable(retryAfter, message = 'Permissions are unavailable') {
|
|
59
|
+
return new bff_http_error_1.BffHttpError(503, 'permissions_unavailable', message, { retryAfter });
|
|
60
|
+
}
|
|
53
61
|
function actionRequiresApproval(message = 'This action requires an approval before it can run', details) {
|
|
54
|
-
return new bff_http_error_1.BffHttpError(403, 'action_requires_approval', message, details);
|
|
62
|
+
return new bff_http_error_1.BffHttpError(403, 'action_requires_approval', message, { details });
|
|
55
63
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLWxvY2FsLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL2JmZi1sb2NhbC1lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSw4Q0FFQztBQUVELDBDQUVDO0FBRUQsc0NBRUM7QUFFRCxvREFFQztBQUVELGdEQUVDO0FBRUQsNENBRUM7QUFFRCx3Q0FFQztBQUVELG9DQUVDO0FBRUQsOENBRUM7QUFFRCwwREFFQztBQUVELGtDQUVDO0FBRUQsMENBRUM7QUFFRCw0REFFQztBQUVELHdEQUtDO0FBRUQsd0RBS0M7QUFsRUQscURBQWdEO0FBRWhELFNBQWdCLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxvQkFBb0I7SUFDOUQsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxTQUFnQixlQUFlLENBQUMsT0FBTyxHQUFHLGtCQUFrQjtJQUMxRCxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxPQUFPLEdBQUcsZ0JBQWdCO0lBQ3RELE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsT0FBTyxHQUFHLDJCQUEyQjtJQUN4RSxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLE9BQU8sR0FBRyx5QkFBeUI7SUFDcEUsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsdUJBQXVCO0lBQ2hFLE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxPQUFpQjtJQUMzRSxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLE9BQU8sR0FBRyxrQ0FBa0M7SUFDdkUsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsT0FBTyxHQUFHLGlDQUFpQztJQUMzRSxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQU8sR0FBRywyQkFBMkI7SUFDM0UsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLDJCQUEyQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsT0FBTyxHQUFHLG1CQUFtQixFQUFFLE9BQWlCO0lBQzFFLE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE9BQU8sR0FBRyxvQ0FBb0M7SUFDNUUsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxPQUFPLEdBQUcsNkJBQTZCO0lBQzlFLE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSw2QkFBNkIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQ3BDLFVBQWtCLEVBQ2xCLE9BQU8sR0FBRyw2QkFBNkI7SUFFdkMsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUVELFNBQWdCLHNCQUFzQixDQUNwQyxPQUFPLEdBQUcsb0RBQW9ELEVBQzlELE9BQWlCO0lBRWpCLE9BQU8sSUFBSSw2QkFBWSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ2pGLENBQUMifQ==
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type ReadModel from '../read-model/read-model';
|
|
2
|
+
import type { ActionPermissions } from '@forestadmin/forestadmin-client';
|
|
3
|
+
export declare const DISPLAY_HINT_FINALITY = "display_hint";
|
|
4
|
+
export interface CrudHints {
|
|
5
|
+
browse: boolean;
|
|
6
|
+
read: boolean;
|
|
7
|
+
edit: boolean;
|
|
8
|
+
add: boolean;
|
|
9
|
+
delete: boolean;
|
|
10
|
+
export: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ActionHints {
|
|
13
|
+
collection: string;
|
|
14
|
+
name: string;
|
|
15
|
+
visible: boolean;
|
|
16
|
+
requiresApprovalHint: boolean;
|
|
17
|
+
canApproveHint: boolean;
|
|
18
|
+
canSelfApproveHint: boolean;
|
|
19
|
+
finality: typeof DISPLAY_HINT_FINALITY;
|
|
20
|
+
}
|
|
21
|
+
export interface VisibleActionRef {
|
|
22
|
+
collection: string;
|
|
23
|
+
name: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CollectionHints {
|
|
26
|
+
crud: CrudHints;
|
|
27
|
+
actions: Record<string, ActionHints>;
|
|
28
|
+
}
|
|
29
|
+
export interface PermissionHints {
|
|
30
|
+
collections: Record<string, CollectionHints>;
|
|
31
|
+
visibleActions: VisibleActionRef[];
|
|
32
|
+
}
|
|
33
|
+
export interface BuildPermissionHintsParams {
|
|
34
|
+
actionPermissions: ActionPermissions;
|
|
35
|
+
roleId: number;
|
|
36
|
+
readModel: ReadModel;
|
|
37
|
+
collections: string[];
|
|
38
|
+
}
|
|
39
|
+
export default function buildPermissionHints(params: BuildPermissionHintsParams): PermissionHints;
|
|
40
|
+
//# sourceMappingURL=build-permission-hints.d.ts.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DISPLAY_HINT_FINALITY = void 0;
|
|
4
|
+
exports.default = buildPermissionHints;
|
|
5
|
+
const forestadmin_client_1 = require("@forestadmin/forestadmin-client");
|
|
6
|
+
const can_role_perform_1 = require("./can-role-perform");
|
|
7
|
+
exports.DISPLAY_HINT_FINALITY = 'display_hint';
|
|
8
|
+
function buildCrudHints(permissions, roleId, collection) {
|
|
9
|
+
const can = (action) => (0, can_role_perform_1.canRolePerformCollectionAction)(permissions, roleId, action, collection);
|
|
10
|
+
return {
|
|
11
|
+
browse: can(forestadmin_client_1.CollectionActionEvent.Browse),
|
|
12
|
+
read: can(forestadmin_client_1.CollectionActionEvent.Read),
|
|
13
|
+
edit: can(forestadmin_client_1.CollectionActionEvent.Edit),
|
|
14
|
+
add: can(forestadmin_client_1.CollectionActionEvent.Add),
|
|
15
|
+
delete: can(forestadmin_client_1.CollectionActionEvent.Delete),
|
|
16
|
+
export: can(forestadmin_client_1.CollectionActionEvent.Export),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function visibleWithoutApprovalHints(collection, name) {
|
|
20
|
+
return {
|
|
21
|
+
collection,
|
|
22
|
+
name,
|
|
23
|
+
visible: true,
|
|
24
|
+
requiresApprovalHint: false,
|
|
25
|
+
canApproveHint: false,
|
|
26
|
+
canSelfApproveHint: false,
|
|
27
|
+
finality: exports.DISPLAY_HINT_FINALITY,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function normalModeAction(permissions, roleId, collection, name) {
|
|
31
|
+
const can = (event) => (0, can_role_perform_1.canRolePerformCustomAction)({
|
|
32
|
+
permissions,
|
|
33
|
+
roleId,
|
|
34
|
+
event,
|
|
35
|
+
actionName: name,
|
|
36
|
+
collectionName: collection,
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
collection,
|
|
40
|
+
name,
|
|
41
|
+
visible: can(forestadmin_client_1.CustomActionEvent.Trigger),
|
|
42
|
+
requiresApprovalHint: can(forestadmin_client_1.CustomActionEvent.RequireApproval),
|
|
43
|
+
canApproveHint: can(forestadmin_client_1.CustomActionEvent.Approve),
|
|
44
|
+
canSelfApproveHint: can(forestadmin_client_1.CustomActionEvent.SelfApprove),
|
|
45
|
+
finality: exports.DISPLAY_HINT_FINALITY,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buildCollectionHints(params, collection) {
|
|
49
|
+
const { permissions, roleId, readModel } = params;
|
|
50
|
+
const { isDevelopment } = permissions;
|
|
51
|
+
const schemaExposedActionNames = Object.keys(readModel.getActionEndpoints()[collection] ?? {});
|
|
52
|
+
const actions = Object.create(null);
|
|
53
|
+
for (const name of schemaExposedActionNames) {
|
|
54
|
+
actions[name] = isDevelopment
|
|
55
|
+
? visibleWithoutApprovalHints(collection, name)
|
|
56
|
+
: normalModeAction(permissions, roleId, collection, name);
|
|
57
|
+
}
|
|
58
|
+
return { crud: buildCrudHints(permissions, roleId, collection), actions };
|
|
59
|
+
}
|
|
60
|
+
function buildPermissionHints(params) {
|
|
61
|
+
const permissions = params.actionPermissions;
|
|
62
|
+
const collections = Object.create(null);
|
|
63
|
+
const visibleActions = [];
|
|
64
|
+
for (const collection of params.collections) {
|
|
65
|
+
const hints = buildCollectionHints({ ...params, permissions }, collection);
|
|
66
|
+
collections[collection] = hints;
|
|
67
|
+
visibleActions.push(...Object.values(hints.actions)
|
|
68
|
+
.filter(action => action.visible)
|
|
69
|
+
.map(({ name }) => ({ collection, name })));
|
|
70
|
+
}
|
|
71
|
+
return { collections, visibleActions };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtcGVybWlzc2lvbi1oaW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy9idWlsZC1wZXJtaXNzaW9uLWhpbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZIQSx1Q0FnQkM7QUExSUQsd0VBQTJGO0FBRTNGLHlEQUFnRztBQUVuRixRQUFBLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQTJDcEQsU0FBUyxjQUFjLENBQ3JCLFdBQThCLEVBQzlCLE1BQWMsRUFDZCxVQUFrQjtJQUVsQixNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQTZCLEVBQUUsRUFBRSxDQUM1QyxJQUFBLGlEQUE4QixFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRTFFLE9BQU87UUFDTCxNQUFNLEVBQUUsR0FBRyxDQUFDLDBDQUFxQixDQUFDLE1BQU0sQ0FBQztRQUN6QyxJQUFJLEVBQUUsR0FBRyxDQUFDLDBDQUFxQixDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLEVBQUUsR0FBRyxDQUFDLDBDQUFxQixDQUFDLElBQUksQ0FBQztRQUNyQyxHQUFHLEVBQUUsR0FBRyxDQUFDLDBDQUFxQixDQUFDLEdBQUcsQ0FBQztRQUNuQyxNQUFNLEVBQUUsR0FBRyxDQUFDLDBDQUFxQixDQUFDLE1BQU0sQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxDQUFDLDBDQUFxQixDQUFDLE1BQU0sQ0FBQztLQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsVUFBa0IsRUFBRSxJQUFZO0lBQ25FLE9BQU87UUFDTCxVQUFVO1FBQ1YsSUFBSTtRQUNKLE9BQU8sRUFBRSxJQUFJO1FBQ2Isb0JBQW9CLEVBQUUsS0FBSztRQUMzQixjQUFjLEVBQUUsS0FBSztRQUNyQixrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLFFBQVEsRUFBRSw2QkFBcUI7S0FDaEMsQ0FBQztBQUNKLENB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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ActionPermissions, CollectionActionEvent, CustomActionEvent } from '@forestadmin/forestadmin-client';
|
|
2
|
+
export declare function isActionIdentifierAllowedForRole(permissions: ActionPermissions, roleId: number, actionName: string): boolean;
|
|
3
|
+
export declare function canRolePerformCollectionAction(permissions: ActionPermissions, roleId: number, action: CollectionActionEvent, collectionName: string): boolean;
|
|
4
|
+
export interface CanRolePerformCustomActionParams {
|
|
5
|
+
permissions: ActionPermissions;
|
|
6
|
+
roleId: number;
|
|
7
|
+
event: CustomActionEvent;
|
|
8
|
+
actionName: string;
|
|
9
|
+
collectionName: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function canRolePerformCustomAction({ permissions, roleId, event, actionName, collectionName, }: CanRolePerformCustomActionParams): boolean;
|
|
12
|
+
//# sourceMappingURL=can-role-perform.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isActionIdentifierAllowedForRole = isActionIdentifierAllowedForRole;
|
|
4
|
+
exports.canRolePerformCollectionAction = canRolePerformCollectionAction;
|
|
5
|
+
exports.canRolePerformCustomAction = canRolePerformCustomAction;
|
|
6
|
+
const forestadmin_client_1 = require("@forestadmin/forestadmin-client");
|
|
7
|
+
function isActionIdentifierAllowedForRole(permissions, roleId, actionName) {
|
|
8
|
+
return Boolean(permissions.isDevelopment ||
|
|
9
|
+
permissions.actionsGloballyAllowed.has(actionName) ||
|
|
10
|
+
permissions.actionsByRole.get(actionName)?.allowedRoles.has(roleId));
|
|
11
|
+
}
|
|
12
|
+
function canRolePerformCollectionAction(permissions, roleId, action, collectionName) {
|
|
13
|
+
return isActionIdentifierAllowedForRole(permissions, roleId, (0, forestadmin_client_1.generateCollectionActionIdentifier)(action, collectionName));
|
|
14
|
+
}
|
|
15
|
+
function canRolePerformCustomAction({ permissions, roleId, event, actionName, collectionName, }) {
|
|
16
|
+
return isActionIdentifierAllowedForRole(permissions, roleId, (0, forestadmin_client_1.generateCustomActionIdentifier)(event, actionName, collectionName));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuLXJvbGUtcGVyZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy9jYW4tcm9sZS1wZXJmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0EsNEVBVUM7QUFFRCx3RUFXQztBQVVELGdFQVlDO0FBbERELHdFQUd5QztBQUV6QyxTQUFnQixnQ0FBZ0MsQ0FDOUMsV0FBOEIsRUFDOUIsTUFBYyxFQUNkLFVBQWtCO0lBRWxCLE9BQU8sT0FBTyxDQUNaLFdBQVcsQ0FBQyxhQUFhO1FBQ3ZCLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2xELFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQ3RFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsOEJBQThCLENBQzVDLFdBQThCLEVBQzlCLE1BQWMsRUFDZCxNQUE2QixFQUM3QixjQUFzQjtJQUV0QixPQUFPLGdDQUFnQyxDQUNyQyxXQUFXLEVBQ1gsTUFBTSxFQUNOLElBQUEsdURBQWtDLEVBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUMzRCxDQUFDO0FBQ0osQ0FBQztBQVVELFNBQWdCLDBCQUEwQixDQUFDLEVBQ3pDLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLFVBQVUsRUFDVixjQUFjLEdBQ21CO0lBQ2pDLE9BQU8sZ0NBQWdDLENBQ3JDLFdBQVcsRUFDWCxNQUFNLEVBQ04sSUFBQSxtREFBOEIsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUNsRSxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ActionPermissions, UserPermissionV4 } from '@forestadmin/forestadmin-client';
|
|
2
|
+
export declare const PERMISSIONS_CACHE_TTL_MS: number;
|
|
3
|
+
export interface PermissionsCacheOptions {
|
|
4
|
+
now?: () => number;
|
|
5
|
+
ttlMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface EvaluatedPermissions {
|
|
8
|
+
actionPermissions: ActionPermissions;
|
|
9
|
+
users: UserPermissionV4[];
|
|
10
|
+
}
|
|
11
|
+
export default class PermissionsCache {
|
|
12
|
+
private readonly now;
|
|
13
|
+
private readonly ttlMs;
|
|
14
|
+
private entry;
|
|
15
|
+
constructor({ now, ttlMs }?: PermissionsCacheOptions);
|
|
16
|
+
wasRejectedByLatestFetch(userId: number): boolean;
|
|
17
|
+
rememberRejected(userId: number): void;
|
|
18
|
+
getFresh(): EvaluatedPermissions | undefined;
|
|
19
|
+
set(permissions: EvaluatedPermissions): void;
|
|
20
|
+
get size(): number;
|
|
21
|
+
clear(): void;
|
|
22
|
+
private getFreshEntry;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=permissions-cache.d.ts.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PERMISSIONS_CACHE_TTL_MS = void 0;
|
|
4
|
+
exports.PERMISSIONS_CACHE_TTL_MS = 15 * 60 * 1000;
|
|
5
|
+
function sameUsers(previous, next) {
|
|
6
|
+
if (previous.length !== next.length)
|
|
7
|
+
return false;
|
|
8
|
+
const previousRoleById = new Map(previous.map(user => [user.id, user.roleId]));
|
|
9
|
+
return next.every(user => previousRoleById.get(user.id) === user.roleId);
|
|
10
|
+
}
|
|
11
|
+
class PermissionsCache {
|
|
12
|
+
constructor({ now = Date.now, ttlMs = exports.PERMISSIONS_CACHE_TTL_MS } = {}) {
|
|
13
|
+
this.now = now;
|
|
14
|
+
this.ttlMs = ttlMs;
|
|
15
|
+
}
|
|
16
|
+
wasRejectedByLatestFetch(userId) {
|
|
17
|
+
return this.getFreshEntry()?.rejectedUserIds.has(userId) ?? false;
|
|
18
|
+
}
|
|
19
|
+
rememberRejected(userId) {
|
|
20
|
+
this.getFreshEntry()?.rejectedUserIds.add(userId);
|
|
21
|
+
}
|
|
22
|
+
getFresh() {
|
|
23
|
+
return this.getFreshEntry()?.permissions;
|
|
24
|
+
}
|
|
25
|
+
set(permissions) {
|
|
26
|
+
const previous = this.getFreshEntry();
|
|
27
|
+
const carriesTheSameUsers = previous !== undefined && sameUsers(previous.permissions.users, permissions.users);
|
|
28
|
+
this.entry = {
|
|
29
|
+
permissions,
|
|
30
|
+
storedAt: this.now(),
|
|
31
|
+
rejectedUserIds: carriesTheSameUsers ? previous.rejectedUserIds : new Set(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
get size() {
|
|
35
|
+
return this.entry ? 1 : 0;
|
|
36
|
+
}
|
|
37
|
+
clear() {
|
|
38
|
+
this.entry = undefined;
|
|
39
|
+
}
|
|
40
|
+
getFreshEntry() {
|
|
41
|
+
if (!this.entry)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (this.now() - this.entry.storedAt >= this.ttlMs) {
|
|
44
|
+
this.entry = undefined;
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return this.entry;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.default = PermissionsCache;
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQWtCdkQsU0FBUyxTQUFTLENBQUMsUUFBNEIsRUFBRSxJQUF3QjtJQUN2RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUvRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBcUIsZ0JBQWdCO0lBTW5DLFlBQVksRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsZ0NBQXdCLEtBQThCLEVBQUU7UUFDNUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNwRSxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLFdBQVcsQ0FBQztJQUMzQyxDQUFDO0lBRUQsR0FBRyxDQUFDLFdBQWlDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUN2QixRQUFRLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckYsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLFdBQVc7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixlQUFlLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFVO1NBQ3BGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUV2QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXRERCxtQ0FzREMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EnvironmentPermissionsV4, UserPermissionV4 } from '@forestadmin/forestadmin-client';
|
|
2
|
+
export interface PermissionsClientOptions {
|
|
3
|
+
forestServerUrl: string;
|
|
4
|
+
envSecret: string;
|
|
5
|
+
}
|
|
6
|
+
export interface EnvironmentAndUserPermissions {
|
|
7
|
+
environmentPermissions: EnvironmentPermissionsV4;
|
|
8
|
+
users: UserPermissionV4[];
|
|
9
|
+
}
|
|
10
|
+
export interface PermissionsFetcher {
|
|
11
|
+
fetchPermissions(): Promise<EnvironmentAndUserPermissions>;
|
|
12
|
+
}
|
|
13
|
+
export default class PermissionsClient implements PermissionsFetcher {
|
|
14
|
+
private readonly api;
|
|
15
|
+
private readonly options;
|
|
16
|
+
private inFlight;
|
|
17
|
+
constructor(options: PermissionsClientOptions);
|
|
18
|
+
fetchPermissions(): Promise<EnvironmentAndUserPermissions>;
|
|
19
|
+
private doFetchPermissions;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=permissions-client.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const forestadmin_client_1 = require("@forestadmin/forestadmin-client");
|
|
4
|
+
class PermissionsClient {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.inFlight = null;
|
|
7
|
+
this.api = new forestadmin_client_1.ForestHttpApi();
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
fetchPermissions() {
|
|
11
|
+
if (!this.inFlight) {
|
|
12
|
+
this.inFlight = this.doFetchPermissions().finally(() => {
|
|
13
|
+
this.inFlight = null;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return this.inFlight;
|
|
17
|
+
}
|
|
18
|
+
async doFetchPermissions() {
|
|
19
|
+
const [environmentPermissions, users] = await Promise.all([
|
|
20
|
+
this.api.getEnvironmentPermissions(this.options),
|
|
21
|
+
this.api.getUsers(this.options),
|
|
22
|
+
]);
|
|
23
|
+
return { environmentPermissions, users };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.default = PermissionsClient;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLHdFQUFnRTtBQWdCaEUsTUFBcUIsaUJBQWlCO0lBTXBDLFlBQVksT0FBaUM7UUFGckMsYUFBUSxHQUFrRCxJQUFJLENBQUM7UUFHckUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGtDQUFhLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixNQUFNLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ2hDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUE3QkQsb0NBNkJDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type PermissionsCache from './permissions-cache';
|
|
2
|
+
import type { PermissionsFetcher } from './permissions-client';
|
|
3
|
+
import type { Logger } from '../ports/logger-port';
|
|
4
|
+
import type ReadModelStore from '../read-model/read-model-store';
|
|
5
|
+
import type { Middleware } from 'koa';
|
|
6
|
+
export interface PermissionsRoutesMiddlewareOptions {
|
|
7
|
+
store: ReadModelStore;
|
|
8
|
+
client: PermissionsFetcher;
|
|
9
|
+
cache: PermissionsCache;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
}
|
|
12
|
+
export default function createPermissionsRoutesMiddleware({ store, client, cache, logger, }: PermissionsRoutesMiddlewareOptions): Middleware;
|
|
13
|
+
//# sourceMappingURL=permissions-routes-middleware.d.ts.map
|
|
@@ -0,0 +1,99 @@
|
|
|
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.default = createPermissionsRoutesMiddleware;
|
|
7
|
+
const forestadmin_client_1 = require("@forestadmin/forestadmin-client");
|
|
8
|
+
const build_permission_hints_1 = __importDefault(require("./build-permission-hints"));
|
|
9
|
+
const agent_route_helpers_1 = require("../http/agent-route-helpers");
|
|
10
|
+
const bff_http_error_1 = require("../http/bff-http-error");
|
|
11
|
+
const bff_local_errors_1 = require("../http/bff-local-errors");
|
|
12
|
+
const PERMISSIONS_ROUTE = '/agent/v1/permissions';
|
|
13
|
+
const UNAVAILABLE_RETRY_AFTER_SECONDS = 5;
|
|
14
|
+
function resolveCaller(ctx) {
|
|
15
|
+
const principal = ctx.state.principal;
|
|
16
|
+
if (principal)
|
|
17
|
+
return { userId: principal.id };
|
|
18
|
+
const identity = ctx.state.apiKeyIdentity;
|
|
19
|
+
if (identity)
|
|
20
|
+
return { userId: identity.user.id };
|
|
21
|
+
throw (0, bff_http_error_1.unauthorized)('No caller identity for this request');
|
|
22
|
+
}
|
|
23
|
+
function resolveRequestedCollections(ctx, readModel) {
|
|
24
|
+
const raw = ctx.query.collections;
|
|
25
|
+
if (raw === undefined)
|
|
26
|
+
return readModel.getAllowedCollections();
|
|
27
|
+
const value = Array.isArray(raw) ? raw.join(',') : raw;
|
|
28
|
+
const requested = value
|
|
29
|
+
.split(',')
|
|
30
|
+
.map(name => name.trim())
|
|
31
|
+
.filter(name => name !== '');
|
|
32
|
+
return [...new Set(requested.filter(name => readModel.isCollectionAllowed(name)))];
|
|
33
|
+
}
|
|
34
|
+
function findCallerRoleId(users, userId) {
|
|
35
|
+
return users.find(user => user.id === userId)?.roleId;
|
|
36
|
+
}
|
|
37
|
+
async function resolvePermissions({ cache, client, logger, }) {
|
|
38
|
+
let resolved;
|
|
39
|
+
try {
|
|
40
|
+
resolved = await client.fetchPermissions();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger('Warn', 'Permission resolution failed', {
|
|
44
|
+
cause: error instanceof Error ? `${error.name}: ${error.message}` : String(error),
|
|
45
|
+
});
|
|
46
|
+
const stillFresh = cache.getFresh();
|
|
47
|
+
if (stillFresh)
|
|
48
|
+
return { permissions: stillFresh, fromFreshFetch: false };
|
|
49
|
+
throw (0, bff_local_errors_1.permissionsUnavailable)(UNAVAILABLE_RETRY_AFTER_SECONDS);
|
|
50
|
+
}
|
|
51
|
+
const permissions = {
|
|
52
|
+
actionPermissions: (0, forestadmin_client_1.generateActionsFromPermissions)(resolved.environmentPermissions),
|
|
53
|
+
users: resolved.users,
|
|
54
|
+
};
|
|
55
|
+
cache.set(permissions);
|
|
56
|
+
return { permissions, fromFreshFetch: true };
|
|
57
|
+
}
|
|
58
|
+
async function resolveCallerPermissions({ caller, cache, client, logger, }) {
|
|
59
|
+
const cached = cache.getFresh();
|
|
60
|
+
const cachedRoleId = cached && findCallerRoleId(cached.users, caller.userId);
|
|
61
|
+
if (cached && cachedRoleId !== undefined) {
|
|
62
|
+
return { permissions: cached, roleId: cachedRoleId };
|
|
63
|
+
}
|
|
64
|
+
if (cache.wasRejectedByLatestFetch(caller.userId))
|
|
65
|
+
throw (0, bff_local_errors_1.forestIdentityNotAllowed)();
|
|
66
|
+
const { permissions, fromFreshFetch } = await resolvePermissions({ cache, client, logger });
|
|
67
|
+
const roleId = findCallerRoleId(permissions.users, caller.userId);
|
|
68
|
+
if (roleId === undefined) {
|
|
69
|
+
if (fromFreshFetch)
|
|
70
|
+
cache.rememberRejected(caller.userId);
|
|
71
|
+
throw (0, bff_local_errors_1.forestIdentityNotAllowed)();
|
|
72
|
+
}
|
|
73
|
+
return { permissions, roleId };
|
|
74
|
+
}
|
|
75
|
+
function createPermissionsRoutesMiddleware({ store, client, cache, logger, }) {
|
|
76
|
+
return async function permissionsRoutesMiddleware(ctx, next) {
|
|
77
|
+
if (ctx.path !== PERMISSIONS_ROUTE || ctx.method !== 'GET') {
|
|
78
|
+
await next();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const caller = resolveCaller(ctx);
|
|
82
|
+
const { permissions, roleId } = await resolveCallerPermissions({
|
|
83
|
+
caller,
|
|
84
|
+
cache,
|
|
85
|
+
client,
|
|
86
|
+
logger,
|
|
87
|
+
});
|
|
88
|
+
const readModel = await (0, agent_route_helpers_1.resolveReadModel)(store);
|
|
89
|
+
const collections = resolveRequestedCollections(ctx, readModel);
|
|
90
|
+
ctx.status = 200;
|
|
91
|
+
ctx.body = (0, build_permission_hints_1.default)({
|
|
92
|
+
actionPermissions: permissions.actionPermissions,
|
|
93
|
+
roleId,
|
|
94
|
+
readModel,
|
|
95
|
+
collections,
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtcm91dGVzLW1pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFpSUEsb0RBZ0NDO0FBdEpELHdFQUFpRjtBQUVqRixzRkFBNEQ7QUFDNUQscUVBQStEO0FBQy9ELDJEQUFzRDtBQUN0RCwrREFBNEY7QUFFNUYsTUFBTSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztBQUNsRCxNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQWExQyxTQUFTLGFBQWEsQ0FBQyxHQUFZO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBOEMsQ0FBQztJQUUzRSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUUvQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQW9ELENBQUM7SUFFaEYsSUFBSSxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRWxELE1BQU0sSUFBQSw2QkFBWSxFQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsR0FBWSxFQUFFLFNBQW9CO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBRWxDLElBQUksR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBRWhFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxD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
|
|
@@ -30,6 +30,7 @@ export default class ReadModel {
|
|
|
30
30
|
private buildActionEndpoints;
|
|
31
31
|
private buildPrimaryKeys;
|
|
32
32
|
isCollectionAllowed(collection: string): boolean;
|
|
33
|
+
getAllowedCollections(): string[];
|
|
33
34
|
isRelationAllowed(collection: string, relation: string): boolean;
|
|
34
35
|
getRelationTarget(collection: string, relation: string): RelationTarget | undefined;
|
|
35
36
|
isActionAllowed(collection: string, action: string): boolean;
|
|
@@ -85,6 +85,9 @@ class ReadModel {
|
|
|
85
85
|
isCollectionAllowed(collection) {
|
|
86
86
|
return this.collections.has(collection);
|
|
87
87
|
}
|
|
88
|
+
getAllowedCollections() {
|
|
89
|
+
return [...this.collections];
|
|
90
|
+
}
|
|
88
91
|
isRelationAllowed(collection, relation) {
|
|
89
92
|
return this.relations.get(collection)?.has(relation) ?? false;
|
|
90
93
|
}
|
|
@@ -102,4 +105,4 @@ class ReadModel {
|
|
|
102
105
|
}
|
|
103
106
|
}
|
|
104
107
|
exports.default = ReadModel;
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWFkLW1vZGVsL3JlYWQtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSxTQUFTLGdCQUFnQixDQUFDLEtBQXdCO0lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXJDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7SUFFaEMsSUFBSSxLQUFLLENBQUMsMkJBQTJCLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RixPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO0lBQ3RGLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQiwwRkFBMEY7UUFDMUYseUZBQXlGO1FBQ3pGLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2pHLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxLQUFRO0lBQzdCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBZ0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENB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
|
|
@@ -5,6 +5,14 @@ export interface ValidateParams {
|
|
|
5
5
|
sortFields?: string[];
|
|
6
6
|
projectionFields?: string[];
|
|
7
7
|
}
|
|
8
|
+
interface FilterLeaf {
|
|
9
|
+
field: string;
|
|
10
|
+
operator?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function isBranch(node: unknown): node is {
|
|
13
|
+
conditions: unknown[];
|
|
14
|
+
};
|
|
15
|
+
export declare function isLeaf(node: unknown): node is FilterLeaf;
|
|
8
16
|
export declare const MAX_FILTER_DEPTH = 100;
|
|
9
17
|
/**
|
|
10
18
|
* True when the request carries something capabilities can invalidate. Callers use it to skip the
|
|
@@ -19,4 +27,5 @@ export declare function hasCapabilityConstrainedInput(params: ValidateParams): b
|
|
|
19
27
|
*/
|
|
20
28
|
export declare function validateAgainstCapabilities(params: ValidateParams, capabilities: CapabilitiesResult): BffHttpError[];
|
|
21
29
|
export declare function assertValidAgainstCapabilities(params: ValidateParams, capabilities: CapabilitiesResult): void;
|
|
30
|
+
export {};
|
|
22
31
|
//# sourceMappingURL=capabilities-validator.d.ts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MAX_FILTER_DEPTH = void 0;
|
|
4
|
+
exports.isBranch = isBranch;
|
|
5
|
+
exports.isLeaf = isLeaf;
|
|
4
6
|
exports.hasCapabilityConstrainedInput = hasCapabilityConstrainedInput;
|
|
5
7
|
exports.validateAgainstCapabilities = validateAgainstCapabilities;
|
|
6
8
|
exports.assertValidAgainstCapabilities = assertValidAgainstCapabilities;
|
|
@@ -107,4 +109,4 @@ function assertValidAgainstCapabilities(params, capabilities) {
|
|
|
107
109
|
if (first)
|
|
108
110
|
throw first;
|
|
109
111
|
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLXZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2NhcGFiaWxpdGllcy12YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUJBLDRCQU1DO0FBRUQsd0JBTUM7QUFxRkQsc0VBTUM7QUFRRCxrRUFXQztBQUVELHdFQU9DO0FBekpELCtEQUEwRDtBQUMxRCwyREFLNkI7QUFDN0IsK0RBQXdEO0FBYXhELFNBQWdCLFFBQVEsQ0FBQyxJQUFhO0lBQ3BDLE9BQU8sQ0FDTCxPQUFPLElBQUksS0FBSyxRQUFRO1FBQ3hCLElBQUksS0FBSyxJQUFJO1FBQ2IsS0FBSyxDQUFDLE9BQU8sQ0FBRSxJQUFpQyxDQUFDLFVBQVUsQ0FBQyxDQUM3RCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLE1BQU0sQ0FBQyxJQUFhO0lBQ2xDLE9BQU8sQ0FDTCxPQUFPLElBQUksS0FBSyxRQUFRO1FBQ3hCLElBQUksS0FBSyxJQUFJO1FBQ2IsT0FBUSxJQUE0QixDQUFDLEtBQUssS0FBSyxRQUFRLENBQ3hELENBQUM7QUFDSixDQUFDO0FBRVksUUFBQSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFcEMsU0FBUyxhQUFhLENBQUMsSUFBYSxFQUFFLEdBQWlCLEVBQUUsS0FBSyxHQUFHLENBQUM7SUFDaEUsSUFBSSxLQUFLLEdBQUcsd0JBQWdCO1FBQUUsTUFBTSxJQUFBLGlDQUFhLEVBQUMsd0JBQWdCLENBQUMsQ0FBQztJQUVwRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFF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
|
|
@@ -6,17 +6,19 @@ exports.filterTooDeep = filterTooDeep;
|
|
|
6
6
|
exports.invalidFilterOperator = invalidFilterOperator;
|
|
7
7
|
const bff_http_error_1 = require("../http/bff-http-error");
|
|
8
8
|
function unknownField(field) {
|
|
9
|
-
return new bff_http_error_1.BffHttpError(422, 'unknown_field', `Unknown field: ${field}`, {
|
|
9
|
+
return new bff_http_error_1.BffHttpError(422, 'unknown_field', `Unknown field: ${field}`, {
|
|
10
|
+
details: { field },
|
|
11
|
+
});
|
|
10
12
|
}
|
|
11
13
|
function fieldNotFilterable(field) {
|
|
12
14
|
return new bff_http_error_1.BffHttpError(422, 'field_not_filterable', `Field is not filterable: ${field}`, {
|
|
13
|
-
field,
|
|
15
|
+
details: { field },
|
|
14
16
|
});
|
|
15
17
|
}
|
|
16
18
|
function filterTooDeep(maxDepth) {
|
|
17
|
-
return new bff_http_error_1.BffHttpError(400, 'filter_too_deep', `Filter nesting exceeds the maximum depth of ${maxDepth}`, { maxDepth });
|
|
19
|
+
return new bff_http_error_1.BffHttpError(400, 'filter_too_deep', `Filter nesting exceeds the maximum depth of ${maxDepth}`, { details: { maxDepth } });
|
|
18
20
|
}
|
|
19
21
|
function invalidFilterOperator(field, validOperators) {
|
|
20
|
-
return new bff_http_error_1.BffHttpError(400, 'invalid_filter_operator', `Unsupported operator for field: ${field}`, { field, validOperators });
|
|
22
|
+
return new bff_http_error_1.BffHttpError(400, 'invalid_filter_operator', `Unsupported operator for field: ${field}`, { details: { field, validOperators } });
|
|
21
23
|
}
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0aW9uLWVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLG9DQUlDO0FBRUQsZ0RBSUM7QUFFRCxzQ0FPQztBQUVELHNEQU9DO0FBOUJELDJEQUFzRDtBQUV0RCxTQUFnQixZQUFZLENBQUMsS0FBYTtJQUN4QyxPQUFPLElBQUksNkJBQVksQ0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixLQUFLLEVBQUUsRUFBRTtRQUN2RSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUU7S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEtBQWE7SUFDOUMsT0FBTyxJQUFJLDZCQUFZLENBQUMsR0FBRyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixLQUFLLEVBQUUsRUFBRTtRQUN4RixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUU7S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUFnQjtJQUM1QyxPQUFPLElBQUksNkJBQVksQ0FDckIsR0FBRyxFQUNILGlCQUFpQixFQUNqQiwrQ0FBK0MsUUFBUSxFQUFFLEVBQ3pELEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsY0FBd0I7SUFDM0UsT0FBTyxJQUFJLDZCQUFZLENBQ3JCLEdBQUcsRUFDSCx5QkFBeUIsRUFDekIsbUNBQW1DLEtBQUssRUFBRSxFQUMxQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUN2QyxDQUFDO0FBQ0osQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent-bff",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"forest-bff": "dist/cli.js"
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@asteasolutions/zod-to-openapi": "8.5.0",
|
|
35
|
-
"@forestadmin/agent-client": "1.13.
|
|
35
|
+
"@forestadmin/agent-client": "1.13.1",
|
|
36
36
|
"@forestadmin/datasource-toolkit": "1.54.0",
|
|
37
|
-
"@forestadmin/forestadmin-client": "1.
|
|
37
|
+
"@forestadmin/forestadmin-client": "1.42.0",
|
|
38
38
|
"@koa/bodyparser": "^6.1.0",
|
|
39
39
|
"jsonwebtoken": "^9.0.3",
|
|
40
40
|
"koa": "^3.0.1",
|