@forestadmin/agent 1.0.0-beta.5 → 1.0.0-beta.52
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/CHANGELOG.md +500 -0
- package/dist/agent/forestadmin-http-driver.d.ts +5 -27
- package/dist/agent/forestadmin-http-driver.js +17 -47
- package/dist/agent/routes/access/api-chart.d.ts +16 -0
- package/dist/agent/routes/access/api-chart.js +47 -0
- package/dist/agent/routes/access/chart.js +47 -23
- package/dist/agent/routes/access/count-related.js +13 -6
- package/dist/agent/routes/access/count.js +14 -7
- package/dist/agent/routes/access/csv-related.js +3 -3
- package/dist/agent/routes/access/csv.js +4 -3
- package/dist/agent/routes/access/get.js +3 -2
- package/dist/agent/routes/access/list-related.js +2 -3
- package/dist/agent/routes/access/list.js +2 -3
- package/dist/agent/routes/base-route.d.ts +0 -1
- package/dist/agent/routes/base-route.js +1 -4
- package/dist/agent/routes/index.js +20 -2
- package/dist/agent/routes/modification/action.d.ts +0 -1
- package/dist/agent/routes/modification/action.js +11 -11
- package/dist/agent/routes/modification/associate-related.d.ts +3 -3
- package/dist/agent/routes/modification/associate-related.js +13 -11
- package/dist/agent/routes/modification/create.js +14 -12
- package/dist/agent/routes/modification/delete.js +3 -2
- package/dist/agent/routes/modification/dissociate-delete-related.js +19 -18
- package/dist/agent/routes/modification/update-field.d.ts +9 -0
- package/dist/agent/routes/modification/update-field.js +39 -0
- package/dist/agent/routes/modification/update-relation.js +19 -13
- package/dist/agent/routes/modification/update.js +5 -3
- package/dist/agent/routes/security/authentication.d.ts +1 -2
- package/dist/agent/routes/security/authentication.js +8 -12
- package/dist/agent/routes/system/error-handling.d.ts +2 -0
- package/dist/agent/routes/system/error-handling.js +28 -9
- package/dist/agent/routes/system/logger.js +4 -5
- package/dist/agent/services/index.js +2 -2
- package/dist/agent/services/serializer.d.ts +0 -5
- package/dist/agent/services/serializer.js +4 -4
- package/dist/agent/types.d.ts +2 -1
- package/dist/agent/types.js +2 -1
- package/dist/agent/utils/condition-tree-parser.d.ts +11 -0
- package/dist/agent/utils/condition-tree-parser.js +53 -0
- package/dist/agent/utils/context-filter-factory.js +1 -2
- package/dist/agent/utils/csv-generator.d.ts +2 -2
- package/dist/agent/utils/csv-generator.js +3 -3
- package/dist/agent/utils/forest-http-api.d.ts +1 -0
- package/dist/agent/utils/forest-http-api.js +58 -50
- package/dist/agent/utils/forest-schema/emitter.d.ts +1 -1
- package/dist/agent/utils/forest-schema/emitter.js +4 -4
- package/dist/agent/utils/forest-schema/generator-actions.d.ts +1 -1
- package/dist/agent/utils/forest-schema/generator-actions.js +4 -4
- package/dist/agent/utils/forest-schema/generator-collection.d.ts +1 -1
- package/dist/agent/utils/forest-schema/generator-collection.js +9 -4
- package/dist/agent/utils/forest-schema/generator-fields.d.ts +1 -0
- package/dist/agent/utils/forest-schema/generator-fields.js +56 -27
- package/dist/agent/utils/forest-schema/types.d.ts +9 -3
- package/dist/agent/utils/forest-schema/types.js +1 -1
- package/dist/agent/utils/query-string.d.ts +2 -2
- package/dist/agent/utils/query-string.js +8 -4
- package/dist/builder/agent.d.ts +63 -40
- package/dist/builder/agent.js +202 -53
- package/dist/builder/collection.d.ts +152 -53
- package/dist/builder/collection.js +219 -59
- package/dist/builder/decorators-stack.d.ts +24 -0
- package/dist/builder/decorators-stack.js +39 -0
- package/dist/builder/types.d.ts +15 -2
- package/dist/{agent/utils/http-driver-options.d.ts → builder/utils/options-validator.d.ts} +4 -4
- package/dist/builder/utils/options-validator.js +107 -0
- package/dist/builder/utils/typing-generator.d.ts +10 -0
- package/dist/builder/utils/typing-generator.js +98 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +13 -5
- package/dist/types.d.ts +6 -9
- package/dist/types.js +1 -9
- package/package.json +15 -5
- package/dist/agent/utils/http-driver-options.js +0 -86
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/// <reference types="koa__router" />
|
|
2
|
-
import { CompositeId, ConditionTree, ManyToManySchema, OneToManySchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Caller, CompositeId, ConditionTree, ManyToManySchema, OneToManySchema } from '@forestadmin/datasource-toolkit';
|
|
3
3
|
import { Context } from 'koa';
|
|
4
4
|
import Router from '@koa/router';
|
|
5
5
|
import RelationRoute from '../relation-route';
|
|
6
6
|
export default class AssociateRelatedRoute extends RelationRoute {
|
|
7
7
|
setupRoutes(router: Router): void;
|
|
8
8
|
handleAssociateRelatedRoute(context: Context): Promise<void>;
|
|
9
|
-
associateOneToMany(scope: ConditionTree, relation: OneToManySchema, parentId: CompositeId, targetedRelationId: CompositeId, context: Context): Promise<void>;
|
|
10
|
-
associateManyToMany(relation: ManyToManySchema, parentId: CompositeId, targetedRelationId: CompositeId): Promise<void>;
|
|
9
|
+
associateOneToMany(caller: Caller, scope: ConditionTree, relation: OneToManySchema, parentId: CompositeId, targetedRelationId: CompositeId, context: Context): Promise<void>;
|
|
10
|
+
associateManyToMany(caller: Caller, relation: ManyToManySchema, parentId: CompositeId, targetedRelationId: CompositeId): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=associate-related.d.ts.map
|
|
@@ -7,6 +7,7 @@ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
|
7
7
|
const types_1 = require("../../types");
|
|
8
8
|
const context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
|
|
9
9
|
const id_1 = __importDefault(require("../../utils/id"));
|
|
10
|
+
const query_string_1 = __importDefault(require("../../utils/query-string"));
|
|
10
11
|
const relation_route_1 = __importDefault(require("../relation-route"));
|
|
11
12
|
class AssociateRelatedRoute extends relation_route_1.default {
|
|
12
13
|
setupRoutes(router) {
|
|
@@ -18,32 +19,33 @@ class AssociateRelatedRoute extends relation_route_1.default {
|
|
|
18
19
|
const targetedRelationId = id_1.default.unpackId(this.foreignCollection.schema, context.request.body?.data[0].id);
|
|
19
20
|
const scope = await this.services.permissions.getScope(this.foreignCollection, context);
|
|
20
21
|
const relation = datasource_toolkit_1.SchemaUtils.getToManyRelation(this.collection.schema, this.relationName);
|
|
22
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
21
23
|
if (relation.type === 'OneToMany') {
|
|
22
|
-
await this.associateOneToMany(scope, relation, parentId, targetedRelationId, context);
|
|
24
|
+
await this.associateOneToMany(caller, scope, relation, parentId, targetedRelationId, context);
|
|
23
25
|
}
|
|
24
26
|
else {
|
|
25
|
-
await this.associateManyToMany(relation, parentId, targetedRelationId);
|
|
27
|
+
await this.associateManyToMany(caller, relation, parentId, targetedRelationId);
|
|
26
28
|
}
|
|
27
29
|
context.response.status = types_1.HttpCode.NoContent;
|
|
28
30
|
}
|
|
29
|
-
async associateOneToMany(scope, relation, parentId, targetedRelationId, context) {
|
|
31
|
+
async associateOneToMany(caller, scope, relation, parentId, targetedRelationId, context) {
|
|
30
32
|
const [id] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.foreignCollection.schema);
|
|
31
|
-
let value = await datasource_toolkit_1.CollectionUtils.getValue(this.foreignCollection, targetedRelationId, id);
|
|
33
|
+
let value = await datasource_toolkit_1.CollectionUtils.getValue(this.foreignCollection, caller, targetedRelationId, id);
|
|
32
34
|
const filter = context_filter_factory_1.default.build(this.collection, context, scope, {
|
|
33
35
|
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(new datasource_toolkit_1.ConditionTreeLeaf(id, 'Equal', value), scope),
|
|
34
36
|
});
|
|
35
|
-
value = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, parentId, relation.originKeyTarget);
|
|
36
|
-
await this.foreignCollection.update(filter, { [relation.originKey]: value });
|
|
37
|
+
value = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, caller, parentId, relation.originKeyTarget);
|
|
38
|
+
await this.foreignCollection.update(caller, filter, { [relation.originKey]: value });
|
|
37
39
|
}
|
|
38
|
-
async associateManyToMany(relation, parentId, targetedRelationId) {
|
|
40
|
+
async associateManyToMany(caller, relation, parentId, targetedRelationId) {
|
|
39
41
|
let [id] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.foreignCollection.schema);
|
|
40
|
-
const foreign = await datasource_toolkit_1.CollectionUtils.getValue(this.foreignCollection, targetedRelationId, id);
|
|
42
|
+
const foreign = await datasource_toolkit_1.CollectionUtils.getValue(this.foreignCollection, caller, targetedRelationId, id);
|
|
41
43
|
[id] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(this.collection.schema);
|
|
42
|
-
const origin = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, parentId, id);
|
|
44
|
+
const origin = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, caller, parentId, id);
|
|
43
45
|
const record = { [relation.originKey]: origin, [relation.foreignKey]: foreign };
|
|
44
46
|
const throughCollection = this.dataSource.getCollection(relation.throughCollection);
|
|
45
|
-
await throughCollection.create([record]);
|
|
47
|
+
await throughCollection.create(caller, [record]);
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
50
|
exports.default = AssociateRelatedRoute;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzb2NpYXRlLXJlbGF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL21vZGlmaWNhdGlvbi9hc3NvY2lhdGUtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQVV5QztBQUl6Qyx1Q0FBdUM7QUFDdkMsZ0dBQXNFO0FBQ3RFLHdEQUFxQztBQUNyQyw0RUFBeUQ7QUFDekQsdUVBQThDO0FBRTlDLE1BQXFCLHFCQUFzQixTQUFRLHdCQUFhO0lBQzlELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksNEJBQTRCLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFDdkUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDNUMsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsMkJBQTJCLENBQUMsT0FBZ0I7UUFDdkQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sUUFBUSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixNQUFNLGtCQUFrQixHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQzdCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pDLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FB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
|
|
@@ -14,12 +14,12 @@ class CreateRoute extends collection_route_1.default {
|
|
|
14
14
|
await this.services.permissions.can(context, `add:${this.collection.name}`);
|
|
15
15
|
const { serializer } = this.services;
|
|
16
16
|
const rawRecord = serializer.deserialize(this.collection, context.request.body);
|
|
17
|
-
const [record, relations] = await this.makeRecord(rawRecord);
|
|
18
|
-
const newRecord = await this.createRecord(record);
|
|
17
|
+
const [record, relations] = await this.makeRecord(context, rawRecord);
|
|
18
|
+
const newRecord = await this.createRecord(context, record);
|
|
19
19
|
await this.linkOneToOneRelations(context, newRecord, relations);
|
|
20
20
|
context.response.body = serializer.serialize(this.collection, { ...newRecord, ...relations });
|
|
21
21
|
}
|
|
22
|
-
async makeRecord(record) {
|
|
22
|
+
async makeRecord(context, record) {
|
|
23
23
|
const patch = {};
|
|
24
24
|
const relations = {};
|
|
25
25
|
const promises = Object.entries(record).map(async ([field, value]) => {
|
|
@@ -28,7 +28,7 @@ class CreateRoute extends collection_route_1.default {
|
|
|
28
28
|
relations[field] = this.getRelationRecord(field, value);
|
|
29
29
|
}
|
|
30
30
|
if (schema?.type === 'ManyToOne') {
|
|
31
|
-
patch[schema.foreignKey] = await this.getManyToOneTarget(field, value);
|
|
31
|
+
patch[schema.foreignKey] = await this.getManyToOneTarget(context, field, value);
|
|
32
32
|
}
|
|
33
33
|
if (schema?.type === 'Column') {
|
|
34
34
|
patch[field] = value;
|
|
@@ -37,15 +37,16 @@ class CreateRoute extends collection_route_1.default {
|
|
|
37
37
|
await Promise.all(promises);
|
|
38
38
|
return [patch, relations];
|
|
39
39
|
}
|
|
40
|
-
async createRecord(patch) {
|
|
40
|
+
async createRecord(context, patch) {
|
|
41
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
41
42
|
if (Object.keys(patch).length) {
|
|
42
43
|
datasource_toolkit_1.RecordValidator.validate(this.collection, patch);
|
|
43
44
|
}
|
|
44
|
-
const [record] = await this.collection.create([patch]);
|
|
45
|
+
const [record] = await this.collection.create(caller, [patch]);
|
|
45
46
|
return record;
|
|
46
47
|
}
|
|
47
48
|
async linkOneToOneRelations(context, record, relations) {
|
|
48
|
-
const
|
|
49
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
49
50
|
const promises = Object.entries(relations).map(async ([field, linked]) => {
|
|
50
51
|
const relation = this.collection.schema.fields[field];
|
|
51
52
|
if (relation.type !== 'OneToOne')
|
|
@@ -58,10 +59,10 @@ class CreateRoute extends collection_route_1.default {
|
|
|
58
59
|
const originValue = record[relation.originKeyTarget];
|
|
59
60
|
// Break old relation (may update zero or one records).
|
|
60
61
|
const oldFkOwner = new datasource_toolkit_1.ConditionTreeLeaf(relation.originKey, 'Equal', originValue);
|
|
61
|
-
await foreignCollection.update(new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(oldFkOwner, scope)
|
|
62
|
+
await foreignCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(oldFkOwner, scope) }), { [relation.originKey]: null });
|
|
62
63
|
// Create new relation (will update exactly one record).
|
|
63
64
|
const newFkOwner = datasource_toolkit_1.ConditionTreeFactory.matchRecords(foreignCollection.schema, [linked]);
|
|
64
|
-
await foreignCollection.update(new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(newFkOwner, scope)
|
|
65
|
+
await foreignCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(newFkOwner, scope) }), { [relation.originKey]: originValue });
|
|
65
66
|
});
|
|
66
67
|
await Promise.all(promises);
|
|
67
68
|
}
|
|
@@ -71,11 +72,12 @@ class CreateRoute extends collection_route_1.default {
|
|
|
71
72
|
const pkName = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(foreignCollection.schema);
|
|
72
73
|
return pkName.reduce((memo, key, index) => ({ ...memo, [key]: id[index] }), {});
|
|
73
74
|
}
|
|
74
|
-
async getManyToOneTarget(field, id) {
|
|
75
|
+
async getManyToOneTarget(context, field, id) {
|
|
76
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
75
77
|
const schema = this.collection.schema.fields[field];
|
|
76
78
|
const foreignCollection = this.dataSource.getCollection(schema.foreignCollection);
|
|
77
|
-
return datasource_toolkit_1.CollectionUtils.getValue(foreignCollection, id, schema.foreignKeyTarget);
|
|
79
|
+
return datasource_toolkit_1.CollectionUtils.getValue(foreignCollection, caller, id, schema.foreignKeyTarget);
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
exports.default = CreateRoute;
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9tb2RpZmljYXRpb24vY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBV3lDO0FBSXpDLDJFQUFrRDtBQUNsRCw0RUFBeUQ7QUFFekQsTUFBcUIsV0FBWSxTQUFRLDBCQUFlO0lBQ3RELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBZ0I7UUFDeEMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFaEUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJ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
|
|
@@ -30,11 +30,12 @@ class DeleteRoute extends collection_route_1.default {
|
|
|
30
30
|
let selectedIds = datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, selectionIds.ids);
|
|
31
31
|
if (selectionIds.areExcluded)
|
|
32
32
|
selectedIds = selectedIds.inverse();
|
|
33
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
33
34
|
const filter = context_filter_factory_1.default.build(this.collection, context, null, {
|
|
34
35
|
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(query_string_1.default.parseConditionTree(this.collection, context), await this.services.permissions.getScope(this.collection, context), selectedIds),
|
|
35
36
|
});
|
|
36
|
-
await this.collection.delete(filter);
|
|
37
|
+
await this.collection.delete(caller, filter);
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
exports.default = DeleteRoute;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9tb2RpZmljYXRpb24vZGVsZXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBQXVFO0FBSXZFLHVDQUFxRDtBQUNyRCwwRUFBaUQ7QUFDakQsMkVBQWtEO0FBQ2xELGdHQUFzRTtBQUN0RSx3REFBcUM7QUFDckMsNEVBQXlEO0FBRXpELE1BQXFCLFdBQVksU0FBUSwwQkFBZTtJQUN0RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFnQjtRQUN4QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UsTUFBTSxFQUFFLEdBQUcsWUFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUVyRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxnQkFBUSxDQUFDLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWdCO1FBQzVDLE1BQU0sWUFBWSxHQUFHLHFCQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkYsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVoRCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxnQkFBUSxDQUFDLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFnQixFQUFFLFlBQTBCO1FBQ3RFLElBQUksV0FBVyxHQUFHLHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUYsSUFBSSxZQUFZLENBQUMsV0FBVztZQUFFLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEUsTUFBTSxNQUFNLEdBQUcsc0JBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLGdDQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDeEUsYUFBYSxFQUFFLHlDQUFvQixDQUFDLFNBQVMsQ0FDM0Msc0JBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFDOUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFDbEUsV0FBVyxDQUNaO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBckNELDhCQXFDQyJ9
|
|
@@ -19,44 +19,45 @@ class DissociateDeleteRelatedRoute extends relation_route_1.default {
|
|
|
19
19
|
// Parse route params
|
|
20
20
|
const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
|
|
21
21
|
const isDeleteMode = Boolean(context.request.query?.delete);
|
|
22
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
22
23
|
const filter = await this.getBaseForeignFilter(context);
|
|
23
24
|
// Dissociating a one to many or many many is quite a different job => delegate
|
|
24
25
|
const relation = datasource_toolkit_1.SchemaUtils.getToManyRelation(this.collection.schema, this.relationName);
|
|
25
26
|
if (relation.type === 'OneToMany') {
|
|
26
|
-
await this.dissociateOrDeleteOneToMany(relation, parentId, isDeleteMode, filter);
|
|
27
|
+
await this.dissociateOrDeleteOneToMany(caller, relation, parentId, isDeleteMode, filter);
|
|
27
28
|
}
|
|
28
29
|
else {
|
|
29
|
-
await this.dissociateOrDeleteManyToMany(relation, parentId, isDeleteMode, filter);
|
|
30
|
+
await this.dissociateOrDeleteManyToMany(caller, relation, parentId, isDeleteMode, filter);
|
|
30
31
|
}
|
|
31
32
|
context.response.status = types_1.HttpCode.NoContent;
|
|
32
33
|
}
|
|
33
|
-
async dissociateOrDeleteOneToMany(schema, parentId, isDeleteMode, baseTargetFilter) {
|
|
34
|
+
async dissociateOrDeleteOneToMany(caller, schema, parentId, isDeleteMode, baseTargetFilter) {
|
|
34
35
|
// Restrict baseTargetFilter to match only records under the parent record
|
|
35
|
-
const foreignFilter = await this.makeForeignFilter(parentId, baseTargetFilter);
|
|
36
|
+
const foreignFilter = await this.makeForeignFilter(caller, parentId, baseTargetFilter);
|
|
36
37
|
if (isDeleteMode) {
|
|
37
|
-
await this.foreignCollection.delete(foreignFilter);
|
|
38
|
+
await this.foreignCollection.delete(caller, foreignFilter);
|
|
38
39
|
}
|
|
39
40
|
else {
|
|
40
|
-
await this.foreignCollection.update(foreignFilter, { [schema.originKey]: null });
|
|
41
|
+
await this.foreignCollection.update(caller, foreignFilter, { [schema.originKey]: null });
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
|
-
async dissociateOrDeleteManyToMany(schema, parentId, isDeleteMode, baseTargetFilter) {
|
|
44
|
+
async dissociateOrDeleteManyToMany(caller, schema, parentId, isDeleteMode, baseTargetFilter) {
|
|
44
45
|
const throughCollection = this.collection.dataSource.getCollection(schema.throughCollection);
|
|
45
46
|
if (isDeleteMode) {
|
|
46
47
|
// Generate filters _BEFORE_ deleting stuff, otherwise things break.
|
|
47
|
-
const throughFilter = await this.makeThroughFilter(parentId, baseTargetFilter);
|
|
48
|
-
const foreignFilter = await this.makeForeignFilter(parentId, baseTargetFilter);
|
|
48
|
+
const throughFilter = await this.makeThroughFilter(caller, parentId, baseTargetFilter);
|
|
49
|
+
const foreignFilter = await this.makeForeignFilter(caller, parentId, baseTargetFilter);
|
|
49
50
|
// Delete records from through collection
|
|
50
|
-
await throughCollection.delete(throughFilter);
|
|
51
|
+
await throughCollection.delete(caller, throughFilter);
|
|
51
52
|
// Let the datasource crash when:
|
|
52
53
|
// - the records in the foreignCollection are linked to other records in the origin collection
|
|
53
54
|
// - the underlying database/api is not cascading deletes
|
|
54
|
-
await this.foreignCollection.delete(foreignFilter);
|
|
55
|
+
await this.foreignCollection.delete(caller, foreignFilter);
|
|
55
56
|
}
|
|
56
57
|
else {
|
|
57
58
|
// Only delete records from through collection
|
|
58
|
-
const thoughFilter = await this.makeThroughFilter(parentId, baseTargetFilter);
|
|
59
|
-
await throughCollection.delete(thoughFilter);
|
|
59
|
+
const thoughFilter = await this.makeThroughFilter(caller, parentId, baseTargetFilter);
|
|
60
|
+
await throughCollection.delete(caller, thoughFilter);
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
/**
|
|
@@ -76,13 +77,13 @@ class DissociateDeleteRelatedRoute extends relation_route_1.default {
|
|
|
76
77
|
});
|
|
77
78
|
}
|
|
78
79
|
/** Wrapper around the util to simplify the call */
|
|
79
|
-
makeForeignFilter(parentId, baseForeignFilter) {
|
|
80
|
-
return datasource_toolkit_1.FilterFactory.makeForeignFilter(this.collection, parentId, this.relationName, baseForeignFilter);
|
|
80
|
+
makeForeignFilter(caller, parentId, baseForeignFilter) {
|
|
81
|
+
return datasource_toolkit_1.FilterFactory.makeForeignFilter(this.collection, parentId, this.relationName, caller, baseForeignFilter);
|
|
81
82
|
}
|
|
82
83
|
/** Wrapper around the util to simplify the call */
|
|
83
|
-
makeThroughFilter(parentId, baseForeignFilter) {
|
|
84
|
-
return datasource_toolkit_1.FilterFactory.makeThroughFilter(this.collection, parentId, this.relationName, baseForeignFilter);
|
|
84
|
+
makeThroughFilter(caller, parentId, baseForeignFilter) {
|
|
85
|
+
return datasource_toolkit_1.FilterFactory.makeThroughFilter(this.collection, parentId, this.relationName, caller, baseForeignFilter);
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
exports.default = DissociateDeleteRelatedRoute;
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzc29jaWF0ZS1kZWxldGUtcmVsYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC9yb3V0ZXMvbW9kaWZpY2F0aW9uL2Rpc3NvY2lhdGUtZGVsZXRlLXJlbGF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFVeUM7QUFJekMsdUNBQXVDO0FBQ3ZDLDBFQUFpRDtBQUNqRCxnR0FBc0U7QUFDdEUsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUN6RCx1RUFBOEM7QUFFOUMsTUFBcUIsNEJBQTZCLFNBQVEsd0JBQWE7SUFDckUsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FDWCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUN2RSxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFnQjtRQUM5RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UscUJBQXFCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsc0JBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFD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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="koa__router" />
|
|
2
|
+
import { Context } from 'koa';
|
|
3
|
+
import Router from '@koa/router';
|
|
4
|
+
import CollectionRoute from '../collection-route';
|
|
5
|
+
export default class UpdateField extends CollectionRoute {
|
|
6
|
+
setupRoutes(router: Router): void;
|
|
7
|
+
handleUpdate(context: Context): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=update-field.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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const types_1 = require("../../types");
|
|
8
|
+
const collection_route_1 = __importDefault(require("../collection-route"));
|
|
9
|
+
const id_1 = __importDefault(require("../../utils/id"));
|
|
10
|
+
const query_string_1 = __importDefault(require("../../utils/query-string"));
|
|
11
|
+
class UpdateField extends collection_route_1.default {
|
|
12
|
+
setupRoutes(router) {
|
|
13
|
+
router.put(`/${this.collection.name}/:id/relationships/:field/:index(\\d+)`, this.handleUpdate.bind(this));
|
|
14
|
+
}
|
|
15
|
+
async handleUpdate(context) {
|
|
16
|
+
await this.services.permissions.can(context, `edit:${this.collection.name}`);
|
|
17
|
+
const { field, index, id } = context.params;
|
|
18
|
+
const subRecord = context.request.body?.data?.attributes;
|
|
19
|
+
// Validate parameters
|
|
20
|
+
// @fixme At the time of writing this route, the Validator does not support composite types
|
|
21
|
+
datasource_toolkit_1.FieldValidator.validate(this.collection, field, [{ [field]: [subRecord] }]);
|
|
22
|
+
// Create caller & filter
|
|
23
|
+
const unpackedId = id_1.default.unpackId(this.collection.schema, id);
|
|
24
|
+
const conditionTree = datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [unpackedId]), await this.services.permissions.getScope(this.collection, context));
|
|
25
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
26
|
+
const filter = new datasource_toolkit_1.Filter({ conditionTree });
|
|
27
|
+
// Load & check record
|
|
28
|
+
const [record] = await this.collection.list(caller, filter, new datasource_toolkit_1.Projection(field));
|
|
29
|
+
if (index > record[field]?.length) {
|
|
30
|
+
throw new datasource_toolkit_1.ValidationError(`Field '${field}' is too short`);
|
|
31
|
+
}
|
|
32
|
+
record[field][index] = subRecord;
|
|
33
|
+
// Update record
|
|
34
|
+
await this.collection.update(caller, filter, { [field]: record[field] });
|
|
35
|
+
context.response.status = types_1.HttpCode.NoContent;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.default = UpdateField;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9tb2RpZmljYXRpb24vdXBkYXRlLWZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBTXlDO0FBSXpDLHVDQUF1QztBQUN2QywyRUFBa0Q7QUFDbEQsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUV6RCxNQUFxQixXQUFZLFNBQVEsMEJBQWU7SUFDdEQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FDUixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSx3Q0FBd0MsRUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFnQjtRQUN4QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFN0UsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO1FBRXpELHNCQUFzQjtRQUN0QiwyRkFBMkY7UUFDM0YsbUNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RSx5QkFBeUI7UUFDekIsTUFBTSxVQUFVLEdBQUcsWUFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLGFBQWEsR0FBRyx5Q0FBb0IsQ0FBQyxTQUFTLENBQ2xELHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ25FLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ25FLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUU3QyxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLCtCQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVuRixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLFVBQVUsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVqQyxnQkFBZ0I7UUFDaEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLGdCQUFRLENBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQTFDRCw4QkEwQ0MifQ==
|
|
@@ -14,40 +14,46 @@ class UpdateRelation extends relation_route_1.default {
|
|
|
14
14
|
}
|
|
15
15
|
async handleUpdateRelationRoute(context) {
|
|
16
16
|
const relation = this.collection.schema.fields[this.relationName];
|
|
17
|
-
const
|
|
17
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
18
18
|
const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
|
|
19
|
-
const linkedId =
|
|
19
|
+
const linkedId = context.request.body?.data?.id
|
|
20
|
+
? id_1.default.unpackId(this.foreignCollection.schema, context.request.body.data.id)
|
|
21
|
+
: null;
|
|
20
22
|
if (relation.type === 'ManyToOne') {
|
|
21
|
-
await this.updateManyToOne(context, relation, parentId, linkedId,
|
|
23
|
+
await this.updateManyToOne(context, relation, parentId, linkedId, caller);
|
|
22
24
|
}
|
|
23
25
|
else if (relation.type === 'OneToOne') {
|
|
24
|
-
await this.updateOneToOne(context, relation, parentId, linkedId,
|
|
26
|
+
await this.updateOneToOne(context, relation, parentId, linkedId, caller);
|
|
25
27
|
}
|
|
26
28
|
context.response.status = types_1.HttpCode.NoContent;
|
|
27
29
|
}
|
|
28
|
-
async updateManyToOne(context, relation, parentId, linkedId,
|
|
30
|
+
async updateManyToOne(context, relation, parentId, linkedId, caller) {
|
|
29
31
|
// Perms
|
|
30
32
|
const scope = await this.services.permissions.getScope(this.collection, context);
|
|
31
33
|
await this.services.permissions.can(context, `edit:${this.collection.name}`);
|
|
32
34
|
// Load the value that will be used as foreignKey (=== linkedId[0] most of the time)
|
|
33
|
-
const foreignValue =
|
|
35
|
+
const foreignValue = linkedId
|
|
36
|
+
? await datasource_toolkit_1.CollectionUtils.getValue(this.foreignCollection, caller, linkedId, relation.foreignKeyTarget)
|
|
37
|
+
: null;
|
|
34
38
|
// Overwrite old foreign key with new one (only one query needed).
|
|
35
39
|
const fkOwner = datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [parentId]);
|
|
36
|
-
await this.collection.update(new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(fkOwner, scope)
|
|
40
|
+
await this.collection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(fkOwner, scope) }), { [relation.foreignKey]: foreignValue });
|
|
37
41
|
}
|
|
38
|
-
async updateOneToOne(context, relation, parentId, linkedId,
|
|
42
|
+
async updateOneToOne(context, relation, parentId, linkedId, caller) {
|
|
39
43
|
// Permissions
|
|
40
44
|
const scope = await this.services.permissions.getScope(this.foreignCollection, context);
|
|
41
45
|
await this.services.permissions.can(context, `edit:${this.foreignCollection.name}`);
|
|
42
46
|
// Load the value that will be used as originKey (=== parentId[0] most of the time)
|
|
43
|
-
const originValue = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, parentId, relation.originKeyTarget);
|
|
47
|
+
const originValue = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, caller, parentId, relation.originKeyTarget);
|
|
44
48
|
// Break old relation (may update zero or one records).
|
|
45
49
|
const oldFkOwner = new datasource_toolkit_1.ConditionTreeLeaf(relation.originKey, 'Equal', originValue);
|
|
46
|
-
await this.foreignCollection.update(new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(oldFkOwner, scope)
|
|
50
|
+
await this.foreignCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(oldFkOwner, scope) }), { [relation.originKey]: null });
|
|
47
51
|
// Create new relation (will update exactly one record).
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
if (linkedId) {
|
|
53
|
+
const newFkOwner = datasource_toolkit_1.ConditionTreeFactory.matchIds(this.foreignCollection.schema, [linkedId]);
|
|
54
|
+
await this.foreignCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(newFkOwner, scope) }), { [relation.originKey]: originValue });
|
|
55
|
+
}
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
exports.default = UpdateRelation;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXJlbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9tb2RpZmljYXRpb24vdXBkYXRlLXJlbGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBU3lDO0FBSXpDLHVDQUF1QztBQUN2Qyx3REFBcUM7QUFDckMsNEVBQXlEO0FBQ3pELHVFQUE4QztBQUU5QyxNQUFxQixjQUFlLFNBQVEsd0JBQWE7SUFDdkQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FDUixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUN2RSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxPQUFnQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDN0MsQ0FBQyxDQUFDLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9FLENB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
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
7
|
const collection_route_1 = __importDefault(require("../collection-route"));
|
|
8
8
|
const id_1 = __importDefault(require("../../utils/id"));
|
|
9
|
+
const query_string_1 = __importDefault(require("../../utils/query-string"));
|
|
9
10
|
class UpdateRoute extends collection_route_1.default {
|
|
10
11
|
setupRoutes(router) {
|
|
11
12
|
router.put(`/${this.collection.name}/:id`, this.handleUpdate.bind(this));
|
|
@@ -20,10 +21,11 @@ class UpdateRoute extends collection_route_1.default {
|
|
|
20
21
|
const record = this.services.serializer.deserialize(this.collection, body);
|
|
21
22
|
datasource_toolkit_1.RecordValidator.validate(this.collection, record);
|
|
22
23
|
const conditionTree = datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]), await this.services.permissions.getScope(this.collection, context));
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
25
|
+
await this.collection.update(caller, new datasource_toolkit_1.Filter({ conditionTree }), record);
|
|
26
|
+
const [updateResult] = await this.collection.list(caller, new datasource_toolkit_1.Filter({ conditionTree }), datasource_toolkit_1.ProjectionFactory.all(this.collection));
|
|
25
27
|
context.response.body = this.services.serializer.serialize(this.collection, updateResult);
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
exports.default = UpdateRoute;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9tb2RpZmljYXRpb24vdXBkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBS3lDO0FBSXpDLDJFQUFrRDtBQUNsRCx3REFBcUM7QUFDckMsNEVBQXlEO0FBRXpELE1BQXFCLFdBQVksU0FBUSwwQkFBZTtJQUN0RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQWdCO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3RSxNQUFNLEVBQUUsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFFakMsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQ2hDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0Usb0NBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCxNQUFNLGFBQWEsR0FBRyx5Q0FBb0IsQ0FBQyxTQUFTLENBQ2xELHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ25FLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSwyQkFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDL0MsTUFBTSxFQUNOLElBQUksMkJBQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQzdCLHNDQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3ZDLENBQUM7UUFFRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUFqQ0QsOEJBaUNDIn0=
|
|
@@ -11,7 +11,6 @@ export default class Authentication extends BaseRoute {
|
|
|
11
11
|
setupRoutes(router: Router): void;
|
|
12
12
|
handleAuthentication(context: Context): Promise<void>;
|
|
13
13
|
handleAuthenticationCallback(context: Context): Promise<void>;
|
|
14
|
-
|
|
15
|
-
private checkRenderingId;
|
|
14
|
+
private static checkRenderingId;
|
|
16
15
|
}
|
|
17
16
|
//# sourceMappingURL=authentication.d.ts.map
|
|
@@ -5,9 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const openid_client_1 = require("openid-client");
|
|
7
7
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
8
|
-
const path_1 = require("path");
|
|
9
8
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
10
9
|
const koa_jwt_1 = __importDefault(require("koa-jwt"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
11
|
const types_1 = require("../../types");
|
|
12
12
|
const base_route_1 = __importDefault(require("../base-route"));
|
|
13
13
|
const forest_http_api_1 = __importDefault(require("../../utils/forest-http-api"));
|
|
@@ -17,9 +17,9 @@ class Authentication extends base_route_1.default {
|
|
|
17
17
|
this.type = types_1.RouteType.Authentication;
|
|
18
18
|
}
|
|
19
19
|
get redirectUrl() {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
const externalUrl = new URL(this.options.agentUrl);
|
|
21
|
+
return (externalUrl.origin +
|
|
22
|
+
path_1.default.posix.join('/', externalUrl.pathname, '/forest/authentication/callback'));
|
|
23
23
|
}
|
|
24
24
|
async bootstrap() {
|
|
25
25
|
// Retrieve OpenId Issuer from forestadmin-server
|
|
@@ -39,11 +39,10 @@ class Authentication extends base_route_1.default {
|
|
|
39
39
|
router.post('/authentication', this.handleAuthentication.bind(this));
|
|
40
40
|
router.get('/authentication/callback', this.handleAuthenticationCallback.bind(this));
|
|
41
41
|
router.use((0, koa_jwt_1.default)({ secret: this.options.authSecret, cookie: 'forest_session_token' }));
|
|
42
|
-
router.post('/authentication/logout', this.handleAuthenticationLogout.bind(this));
|
|
43
42
|
}
|
|
44
43
|
async handleAuthentication(context) {
|
|
45
44
|
const renderingId = Number(context.request.body?.renderingId);
|
|
46
|
-
|
|
45
|
+
Authentication.checkRenderingId(renderingId);
|
|
47
46
|
const authorizationUrl = this.client.authorizationUrl({
|
|
48
47
|
scope: 'openid email profile',
|
|
49
48
|
state: JSON.stringify({ renderingId }),
|
|
@@ -57,7 +56,7 @@ class Authentication extends base_route_1.default {
|
|
|
57
56
|
let renderingId;
|
|
58
57
|
try {
|
|
59
58
|
renderingId = JSON.parse(state).renderingId;
|
|
60
|
-
|
|
59
|
+
Authentication.checkRenderingId(renderingId);
|
|
61
60
|
}
|
|
62
61
|
catch {
|
|
63
62
|
throw new datasource_toolkit_1.ValidationError('Failed to retrieve renderingId from query[state]');
|
|
@@ -73,14 +72,11 @@ class Authentication extends base_route_1.default {
|
|
|
73
72
|
tokenData: jsonwebtoken_1.default.decode(token),
|
|
74
73
|
};
|
|
75
74
|
}
|
|
76
|
-
|
|
77
|
-
context.response.status = types_1.HttpCode.NoContent;
|
|
78
|
-
}
|
|
79
|
-
checkRenderingId(renderingId) {
|
|
75
|
+
static checkRenderingId(renderingId) {
|
|
80
76
|
if (Number.isNaN(renderingId)) {
|
|
81
77
|
throw new datasource_toolkit_1.ValidationError('Rendering id must be a number');
|
|
82
78
|
}
|
|
83
79
|
}
|
|
84
80
|
}
|
|
85
81
|
exports.default = Authentication;
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL3NlY3VyaXR5L2F1dGhlbnRpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQWlFO0FBQ2pFLHdFQUFrRTtBQUVsRSxnRUFBd0M7QUFDeEMsc0RBQTBCO0FBQzFCLGdEQUF3QjtBQUd4Qix1Q0FBd0M7QUFDeEMsK0RBQXNDO0FBQ3RDLGtGQUF3RDtBQUV4RCxNQUFxQixjQUFlLFNBQVEsb0JBQVM7SUFBckQ7O1FBQ1csU0FBSSxHQUFHLGlCQUFTLENBQUMsY0FBYyxDQUFDO0lBaUYzQyxDQUFDO0lBN0VDLElBQVksV0FBVztRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sQ0FDTCxXQUFXLENBQUMsTUFBTTtZQUNsQixjQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVRLEtBQUssQ0FBQyxTQUFTO1FBQ3RCLGlEQUFpRDtRQUNqRCxpRkFBaUY7UUFDakYsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQkFBTSxDQUFDLE1BQU0seUJBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVyRixrREFBa0Q7UUFDbEQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUNoQywwQkFBMEIsRUFBRSxNQUEwQjtZQUN0RCxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ2xDLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxTQUFTO1lBQ2xDLENBQUMs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
|
|
@@ -6,6 +6,8 @@ export default class ErrorHandling extends BaseRoute {
|
|
|
6
6
|
type: RouteType;
|
|
7
7
|
setupRoutes(router: Router): void;
|
|
8
8
|
private errorHandler;
|
|
9
|
+
private getErrorStatus;
|
|
10
|
+
private getErrorMessage;
|
|
9
11
|
private debugLogError;
|
|
10
12
|
}
|
|
11
13
|
//# sourceMappingURL=error-handling.d.ts.map
|