@forestadmin/agent 1.93.1 → 1.93.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,6 +6,6 @@ export default class AssociateRelatedRoute extends RelationRoute {
|
|
|
6
6
|
setupRoutes(router: Router): void;
|
|
7
7
|
handleAssociateRelatedRoute(context: Context): Promise<void>;
|
|
8
8
|
associateOneToMany(caller: Caller, scope: ConditionTree, relation: OneToManySchema, parentId: CompositeId, targetedRelationId: CompositeId, context: Context): Promise<void>;
|
|
9
|
-
associateManyToMany(caller: Caller, relation: ManyToManySchema, parentId: CompositeId, targetedRelationId: CompositeId): Promise<void>;
|
|
9
|
+
associateManyToMany(caller: Caller, scope: ConditionTree, relation: ManyToManySchema, parentId: CompositeId, targetedRelationId: CompositeId): Promise<void>;
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=associate-related.d.ts.map
|
|
@@ -14,7 +14,7 @@ class AssociateRelatedRoute extends relation_route_1.default {
|
|
|
14
14
|
router.post(`/${this.collectionUrlSlug}/:parentId/relationships/${this.relationUrlSlug}`, this.handleAssociateRelatedRoute.bind(this));
|
|
15
15
|
}
|
|
16
16
|
async handleAssociateRelatedRoute(context) {
|
|
17
|
-
await this.services.authorization.assertCanEdit(context, this.
|
|
17
|
+
await this.services.authorization.assertCanEdit(context, this.foreignCollection.name);
|
|
18
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
19
|
const body = context.request.body;
|
|
20
20
|
const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
|
|
@@ -26,7 +26,7 @@ class AssociateRelatedRoute extends relation_route_1.default {
|
|
|
26
26
|
await this.associateOneToMany(caller, scope, relation, parentId, targetedRelationId, context);
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
|
-
await this.associateManyToMany(caller, relation, parentId, targetedRelationId);
|
|
29
|
+
await this.associateManyToMany(caller, scope, relation, parentId, targetedRelationId);
|
|
30
30
|
}
|
|
31
31
|
context.response.status = types_1.HttpCode.NoContent;
|
|
32
32
|
}
|
|
@@ -39,15 +39,21 @@ class AssociateRelatedRoute extends relation_route_1.default {
|
|
|
39
39
|
value = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, caller, parentId, relation.originKeyTarget);
|
|
40
40
|
await this.foreignCollection.update(caller, filter, { [relation.originKey]: value });
|
|
41
41
|
}
|
|
42
|
-
async associateManyToMany(caller, relation, parentId, targetedRelationId) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
42
|
+
async associateManyToMany(caller, scope, relation, parentId, targetedRelationId) {
|
|
43
|
+
const foreignFilter = new datasource_toolkit_1.Filter({
|
|
44
|
+
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.foreignCollection.schema, [targetedRelationId]), scope),
|
|
45
|
+
});
|
|
46
|
+
const [foreignRecordInScope] = await this.foreignCollection.list(caller, foreignFilter, new datasource_toolkit_1.Projection(relation.foreignKeyTarget));
|
|
47
|
+
if (!foreignRecordInScope)
|
|
48
|
+
return;
|
|
49
|
+
const origin = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, caller, parentId, relation.originKeyTarget);
|
|
50
|
+
const record = {
|
|
51
|
+
[relation.originKey]: origin,
|
|
52
|
+
[relation.foreignKey]: foreignRecordInScope[relation.foreignKeyTarget],
|
|
53
|
+
};
|
|
48
54
|
const throughCollection = this.dataSource.getCollection(relation.throughCollection);
|
|
49
55
|
await throughCollection.create(caller, [record]);
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
exports.default = AssociateRelatedRoute;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzb2NpYXRlLXJlbGF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL21vZGlmaWNhdGlvbi9hc3NvY2lhdGUtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVVBLHdFQU95QztBQUV6Qyx1Q0FBdUM7QUFDdkMsZ0dBQXNFO0FBQ3RFLHdEQUFxQztBQUNyQyw0RUFBeUQ7QUFDekQsdUVBQThDO0FBRTlDLE1BQXFCLHFCQUFzQixTQUFRLHdCQUFhO0lBQzlELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLDRCQUE0QixJQUFJLENBQUMsZUFBZSxFQUFFLEVBQzVFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzVDLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQWdCO1FBQ3ZELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEYsOERBQThEO1FBQzlELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBVyxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixNQUFNLGtCQUFrQixHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxh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
|
|
@@ -6,6 +6,8 @@ export default class CreateRoute extends CollectionRoute {
|
|
|
6
6
|
handleCreate(context: Context): Promise<void>;
|
|
7
7
|
private makeRecord;
|
|
8
8
|
private createRecord;
|
|
9
|
+
private getLinkedOneToOneRelations;
|
|
10
|
+
private assertCanEditLinkedOneToOneRelations;
|
|
9
11
|
private linkOneToOneRelations;
|
|
10
12
|
private getRelationRecord;
|
|
11
13
|
private getManyToOneTarget;
|
|
@@ -15,6 +15,7 @@ class CreateRoute extends collection_route_1.default {
|
|
|
15
15
|
const { serializer } = this.services;
|
|
16
16
|
const rawRecord = serializer.deserialize(this.collection, context.request.body);
|
|
17
17
|
const [record, relations] = await this.makeRecord(context, rawRecord);
|
|
18
|
+
await this.assertCanEditLinkedOneToOneRelations(context, relations);
|
|
18
19
|
const newRecord = await this.createRecord(context, record);
|
|
19
20
|
await this.linkOneToOneRelations(context, newRecord, relations);
|
|
20
21
|
context.response.body = serializer.serialize(this.collection, { ...newRecord, ...relations });
|
|
@@ -45,16 +46,22 @@ class CreateRoute extends collection_route_1.default {
|
|
|
45
46
|
const [record] = await this.collection.create(caller, [patch]);
|
|
46
47
|
return record;
|
|
47
48
|
}
|
|
49
|
+
getLinkedOneToOneRelations(relations) {
|
|
50
|
+
return Object.entries(relations)
|
|
51
|
+
.map(([field, linked]) => ({
|
|
52
|
+
linked,
|
|
53
|
+
relation: datasource_toolkit_1.SchemaUtils.getRelation(this.collection.schema, field, this.collection.name),
|
|
54
|
+
}))
|
|
55
|
+
.filter((entry) => entry.linked !== null && entry.relation.type === 'OneToOne');
|
|
56
|
+
}
|
|
57
|
+
async assertCanEditLinkedOneToOneRelations(context, relations) {
|
|
58
|
+
await Promise.all(this.getLinkedOneToOneRelations(relations).map(({ relation }) => this.services.authorization.assertCanEdit(context, relation.foreignCollection)));
|
|
59
|
+
}
|
|
48
60
|
async linkOneToOneRelations(context, record, relations) {
|
|
49
61
|
const caller = query_string_1.default.parseCaller(context);
|
|
50
|
-
const promises =
|
|
51
|
-
const relation = datasource_toolkit_1.SchemaUtils.getRelation(this.collection.schema, field, this.collection.name);
|
|
52
|
-
if (linked === null || relation.type !== 'OneToOne')
|
|
53
|
-
return;
|
|
54
|
-
// Permissions
|
|
62
|
+
const promises = this.getLinkedOneToOneRelations(relations).map(async ({ linked, relation }) => {
|
|
55
63
|
const foreignCollection = this.dataSource.getCollection(relation.foreignCollection);
|
|
56
64
|
const scope = await this.services.authorization.getScope(foreignCollection, context);
|
|
57
|
-
await this.services.authorization.assertCanEdit(context, this.collection.name);
|
|
58
65
|
// Load the value that will be used as originKey (=== parentId[0] most of the time)
|
|
59
66
|
const originValue = record[relation.originKeyTarget];
|
|
60
67
|
// Break old relation (may update zero or one records).
|
|
@@ -84,4 +91,4 @@ class CreateRoute extends collection_route_1.default {
|
|
|
84
91
|
}
|
|
85
92
|
}
|
|
86
93
|
exports.default = CreateRoute;
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9tb2RpZmljYXRpb24vY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBU0Esd0VBT3lDO0FBRXpDLDRFQUF5RDtBQUN6RCwyRUFBa0Q7QUFFbEQsTUFBcUIsV0FBWSxTQUFRLDBCQUFlO0lBQ3RELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQWdCO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV0RSxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFcEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFD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
|