@forestadmin/agent 1.0.0-beta.32 → 1.0.0-beta.35
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 +40 -0
- package/dist/agent/routes/access/count-related.js +12 -7
- package/dist/agent/routes/access/count.js +13 -8
- package/dist/builder/collection.d.ts +32 -9
- package/dist/builder/collection.js +43 -9
- package/dist/builder/decorators-stack.d.ts +2 -1
- package/dist/builder/decorators-stack.js +2 -1
- package/dist/builder/types.d.ts +6 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,43 @@
|
|
|
1
|
+
# @forestadmin/agent [1.0.0-beta.35](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/agent@1.0.0-beta.34...@forestadmin/agent@1.0.0-beta.35) (2022-06-01)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **builder:** add helper method to create embedded relationships ([#311](https://github.com/ForestAdmin/agent-nodejs/issues/311)) ([662cf58](https://github.com/ForestAdmin/agent-nodejs/commit/662cf5885c8b7c4fa17fed59f20f54625d4e5660))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Dependencies
|
|
13
|
+
|
|
14
|
+
* **@forestadmin/datasource-toolkit:** upgraded to 1.0.0-beta.21
|
|
15
|
+
|
|
16
|
+
# @forestadmin/agent [1.0.0-beta.34](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/agent@1.0.0-beta.33...@forestadmin/agent@1.0.0-beta.34) (2022-05-31)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* make count an optional feature ([#327](https://github.com/ForestAdmin/agent-nodejs/issues/327)) ([b6f688c](https://github.com/ForestAdmin/agent-nodejs/commit/b6f688ca5f84aa29740761ff848c4beca5ee61d6))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Dependencies
|
|
28
|
+
|
|
29
|
+
* **@forestadmin/datasource-toolkit:** upgraded to 1.0.0-beta.20
|
|
30
|
+
|
|
31
|
+
# @forestadmin/agent [1.0.0-beta.33](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/agent@1.0.0-beta.32...@forestadmin/agent@1.0.0-beta.33) (2022-05-25)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Dependencies
|
|
38
|
+
|
|
39
|
+
* **@forestadmin/datasource-toolkit:** upgraded to 1.0.0-beta.19
|
|
40
|
+
|
|
1
41
|
# @forestadmin/agent [1.0.0-beta.32](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/agent@1.0.0-beta.31...@forestadmin/agent@1.0.0-beta.32) (2022-05-24)
|
|
2
42
|
|
|
3
43
|
|
|
@@ -14,13 +14,18 @@ class CountRelatedRoute extends relation_route_1.default {
|
|
|
14
14
|
}
|
|
15
15
|
async handleCountRelated(context) {
|
|
16
16
|
await this.services.permissions.can(context, `browse:${this.collection.name}`);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
if (this.foreignCollection.schema.countable) {
|
|
18
|
+
const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
|
|
19
|
+
const scope = await this.services.permissions.getScope(this.foreignCollection, context);
|
|
20
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
21
|
+
const filter = context_filter_factory_1.default.build(this.foreignCollection, context, scope);
|
|
22
|
+
const aggregationResult = await datasource_toolkit_1.CollectionUtils.aggregateRelation(this.collection, parentId, this.relationName, caller, filter, new datasource_toolkit_1.Aggregation({ operation: 'Count' }));
|
|
23
|
+
context.response.body = { count: aggregationResult?.[0]?.value ?? 0 };
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
context.response.body = { meta: { count: 'deactivated' } };
|
|
27
|
+
}
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
30
|
exports.default = CountRelatedRoute;
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQtcmVsYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC9yb3V0ZXMvYWNjZXNzL2NvdW50LXJlbGF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFBK0U7QUFJL0UsZ0dBQXNFO0FBQ3RFLHdEQUFxQztBQUNyQyw0RUFBeUQ7QUFDekQsdUVBQThDO0FBRTlDLE1BQXFCLGlCQUFrQixTQUFRLHdCQUFhO0lBQzFELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQ1IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksNEJBQTRCLElBQUksQ0FBQyxZQUFZLFFBQVEsRUFDN0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBZ0I7UUFDOUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9FLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDM0MsTUFBTSxRQUFRLEdBQUcsWUFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RixNQUFNLE1BQU0sR0FBRyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsZ0NBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbEYsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLG9DQUFlLENBQUMsaUJBQWlCLENBQy9ELElBQUksQ0FBQyxVQUFVLEVBQ2YsUUFBUSxFQUNSLElBQUksQ0FBQyxZQUFZLEVBQ2pCLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxnQ0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQ3hDLENBQUM7WUFFRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUN2RTthQUFNO1lBQ0wsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQztTQUM1RDtJQUNILENBQUM7Q0FDRjtBQS9CRCxvQ0ErQkMifQ==
|
|
@@ -13,14 +13,19 @@ class CountRoute extends collection_route_1.default {
|
|
|
13
13
|
}
|
|
14
14
|
async handleCount(context) {
|
|
15
15
|
await this.services.permissions.can(context, `browse:${this.collection.name}`);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
if (this.collection.schema.countable) {
|
|
17
|
+
const scope = await this.services.permissions.getScope(this.collection, context);
|
|
18
|
+
const caller = query_string_1.default.parseCaller(context);
|
|
19
|
+
const filter = context_filter_factory_1.default.build(this.collection, context, scope);
|
|
20
|
+
const aggregation = new datasource_toolkit_1.Aggregation({ operation: 'Count' });
|
|
21
|
+
const aggregationResult = await this.collection.aggregate(caller, filter, aggregation);
|
|
22
|
+
const count = aggregationResult?.[0]?.value ?? 0;
|
|
23
|
+
context.response.body = { count };
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
context.response.body = { meta: { count: 'deactivated' } };
|
|
27
|
+
}
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
30
|
exports.default = CountRoute;
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL2FjY2Vzcy9jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUE4RDtBQUk5RCwyRUFBa0Q7QUFDbEQsZ0dBQXNFO0FBQ3RFLDRFQUF5RDtBQUV6RCxNQUFxQixVQUFXLFNBQVEsMEJBQWU7SUFDckQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFnQjtRQUN2QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRixNQUFNLE1BQU0sR0FBRyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsZ0NBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRTNFLE1BQU0sV0FBVyxHQUFHLElBQUksZ0NBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUVqRCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ25DO2FBQU07WUFDTCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztDQUNGO0FBdEJELDZCQXNCQyJ9
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { ActionDefinition, Operator, OperatorDefinition, PlainSortClause, SearchDefinition, SegmentDefinition, TCollectionName, TColumnName, TFieldName, TSchema, WriteDefinition } from '@forestadmin/datasource-toolkit';
|
|
2
|
-
import { FieldDefinition } from './types';
|
|
2
|
+
import { FieldDefinition, OneToManyEmbeddedDefinition } from './types';
|
|
3
3
|
import DecoratorsStack from './decorators-stack';
|
|
4
4
|
export default class CollectionBuilder<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> {
|
|
5
5
|
private readonly name;
|
|
6
6
|
private readonly stack;
|
|
7
7
|
constructor(stack: DecoratorsStack, name: string);
|
|
8
|
+
/**
|
|
9
|
+
* Disable count in list view pagination for improved performance.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* .disableCount()
|
|
13
|
+
*/
|
|
14
|
+
disableCount(): this;
|
|
8
15
|
/**
|
|
9
16
|
* Import a field from a many to one or one to one relation.
|
|
10
17
|
*
|
|
@@ -63,9 +70,9 @@ export default class CollectionBuilder<S extends TSchema = TSchema, N extends TC
|
|
|
63
70
|
* @param foreignCollection name of the targeted collection
|
|
64
71
|
* @param options extra information about the relation
|
|
65
72
|
* @example
|
|
66
|
-
* books.
|
|
73
|
+
* books.addManyToOneRelation('myAuthor', 'persons', { foreignKey: 'author_id' })
|
|
67
74
|
*/
|
|
68
|
-
|
|
75
|
+
addManyToOneRelation<T extends TCollectionName<S>>(name: string, foreignCollection: T, options: {
|
|
69
76
|
foreignKey: TColumnName<S, N>;
|
|
70
77
|
foreignKeyTarget?: TColumnName<S, T>;
|
|
71
78
|
}): this;
|
|
@@ -75,9 +82,9 @@ export default class CollectionBuilder<S extends TSchema = TSchema, N extends TC
|
|
|
75
82
|
* @param foreignCollection name of the targeted collection
|
|
76
83
|
* @param options extra information about the relation
|
|
77
84
|
* @example
|
|
78
|
-
* persons.
|
|
85
|
+
* persons.addOneToManyRelation('writtenBooks', 'books', { originKey: 'author_id' })
|
|
79
86
|
*/
|
|
80
|
-
|
|
87
|
+
addOneToManyRelation<T extends TCollectionName<S>>(name: string, foreignCollection: T, options: {
|
|
81
88
|
originKey: TColumnName<S, T>;
|
|
82
89
|
originKeyTarget?: TColumnName<S, N>;
|
|
83
90
|
}): this;
|
|
@@ -87,9 +94,9 @@ export default class CollectionBuilder<S extends TSchema = TSchema, N extends TC
|
|
|
87
94
|
* @param foreignCollection name of the targeted collection
|
|
88
95
|
* @param options extra information about the relation
|
|
89
96
|
* @example
|
|
90
|
-
* persons.
|
|
97
|
+
* persons.addOneToOneRelation('bestFriend', 'persons', { originKey: 'best_friend_id' })
|
|
91
98
|
*/
|
|
92
|
-
|
|
99
|
+
addOneToOneRelation<T extends TCollectionName<S>>(name: string, foreignCollection: T, options: {
|
|
93
100
|
originKey: TColumnName<S, T>;
|
|
94
101
|
originKeyTarget?: TColumnName<S, N>;
|
|
95
102
|
}): this;
|
|
@@ -100,17 +107,33 @@ export default class CollectionBuilder<S extends TSchema = TSchema, N extends TC
|
|
|
100
107
|
* @param throughCollection name of the intermediary collection
|
|
101
108
|
* @param options extra information about the relation
|
|
102
109
|
* @example
|
|
103
|
-
* dvds.
|
|
110
|
+
* dvds.addManyToManyRelation('rentalsOfThisDvd', 'rentals', 'dvd_rentals', {
|
|
104
111
|
* originKey: 'dvd_id',
|
|
105
112
|
* foreignKey: 'rental_id'
|
|
106
113
|
* })
|
|
107
114
|
*/
|
|
108
|
-
|
|
115
|
+
addManyToManyRelation<Foreign extends TCollectionName<S>, Through extends TCollectionName<S>>(name: string, foreignCollection: Foreign, throughCollection: Through, options: {
|
|
109
116
|
originKey: TColumnName<S, Through>;
|
|
110
117
|
foreignKey: TColumnName<S, Through>;
|
|
111
118
|
originKeyTarget?: TColumnName<S, N>;
|
|
112
119
|
foreignKeyTarget?: TColumnName<S, Foreign>;
|
|
113
120
|
}): this;
|
|
121
|
+
/**
|
|
122
|
+
* Add a virtual collection into the related data of a record.
|
|
123
|
+
*
|
|
124
|
+
* @param name name of the relation
|
|
125
|
+
* @param definition the definition of the new relation
|
|
126
|
+
* @example
|
|
127
|
+
* .addExternalRelation('states', {
|
|
128
|
+
* schema: { code: 'Number', name: 'String' },
|
|
129
|
+
* listRecords: ({ id }) => {
|
|
130
|
+
* return record.id == 34 ?
|
|
131
|
+
* [{ code: 'AL', name: 'Alabama' }, { code: 'AK', name: 'Alaska' }] :
|
|
132
|
+
* [{ code: 'AZ', name: 'Arizona' }, { code: 'TX', name: 'Texas' }];
|
|
133
|
+
* }
|
|
134
|
+
* })
|
|
135
|
+
*/
|
|
136
|
+
addExternalRelation(name: string, definition: OneToManyEmbeddedDefinition<S, N>): this;
|
|
114
137
|
/**
|
|
115
138
|
* Add a new segment on the collection.
|
|
116
139
|
* @param name the name of the segment
|
|
@@ -10,6 +10,16 @@ class CollectionBuilder {
|
|
|
10
10
|
this.name = name;
|
|
11
11
|
this.stack = stack;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Disable count in list view pagination for improved performance.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* .disableCount()
|
|
18
|
+
*/
|
|
19
|
+
disableCount() {
|
|
20
|
+
this.stack.schema.getCollection(this.name).overrideSchema({ countable: false });
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
13
23
|
/**
|
|
14
24
|
* Import a field from a many to one or one to one relation.
|
|
15
25
|
*
|
|
@@ -107,9 +117,9 @@ class CollectionBuilder {
|
|
|
107
117
|
* @param foreignCollection name of the targeted collection
|
|
108
118
|
* @param options extra information about the relation
|
|
109
119
|
* @example
|
|
110
|
-
* books.
|
|
120
|
+
* books.addManyToOneRelation('myAuthor', 'persons', { foreignKey: 'author_id' })
|
|
111
121
|
*/
|
|
112
|
-
|
|
122
|
+
addManyToOneRelation(name, foreignCollection, options) {
|
|
113
123
|
this.addRelation(name, {
|
|
114
124
|
type: 'ManyToOne',
|
|
115
125
|
foreignCollection,
|
|
@@ -124,9 +134,9 @@ class CollectionBuilder {
|
|
|
124
134
|
* @param foreignCollection name of the targeted collection
|
|
125
135
|
* @param options extra information about the relation
|
|
126
136
|
* @example
|
|
127
|
-
* persons.
|
|
137
|
+
* persons.addOneToManyRelation('writtenBooks', 'books', { originKey: 'author_id' })
|
|
128
138
|
*/
|
|
129
|
-
|
|
139
|
+
addOneToManyRelation(name, foreignCollection, options) {
|
|
130
140
|
this.addRelation(name, {
|
|
131
141
|
type: 'OneToMany',
|
|
132
142
|
foreignCollection,
|
|
@@ -141,9 +151,9 @@ class CollectionBuilder {
|
|
|
141
151
|
* @param foreignCollection name of the targeted collection
|
|
142
152
|
* @param options extra information about the relation
|
|
143
153
|
* @example
|
|
144
|
-
* persons.
|
|
154
|
+
* persons.addOneToOneRelation('bestFriend', 'persons', { originKey: 'best_friend_id' })
|
|
145
155
|
*/
|
|
146
|
-
|
|
156
|
+
addOneToOneRelation(name, foreignCollection, options) {
|
|
147
157
|
this.addRelation(name, {
|
|
148
158
|
type: 'OneToOne',
|
|
149
159
|
foreignCollection,
|
|
@@ -159,12 +169,12 @@ class CollectionBuilder {
|
|
|
159
169
|
* @param throughCollection name of the intermediary collection
|
|
160
170
|
* @param options extra information about the relation
|
|
161
171
|
* @example
|
|
162
|
-
* dvds.
|
|
172
|
+
* dvds.addManyToManyRelation('rentalsOfThisDvd', 'rentals', 'dvd_rentals', {
|
|
163
173
|
* originKey: 'dvd_id',
|
|
164
174
|
* foreignKey: 'rental_id'
|
|
165
175
|
* })
|
|
166
176
|
*/
|
|
167
|
-
|
|
177
|
+
addManyToManyRelation(name, foreignCollection, throughCollection, options) {
|
|
168
178
|
this.addRelation(name, {
|
|
169
179
|
type: 'ManyToMany',
|
|
170
180
|
foreignCollection,
|
|
@@ -176,6 +186,30 @@ class CollectionBuilder {
|
|
|
176
186
|
});
|
|
177
187
|
return this;
|
|
178
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Add a virtual collection into the related data of a record.
|
|
191
|
+
*
|
|
192
|
+
* @param name name of the relation
|
|
193
|
+
* @param definition the definition of the new relation
|
|
194
|
+
* @example
|
|
195
|
+
* .addExternalRelation('states', {
|
|
196
|
+
* schema: { code: 'Number', name: 'String' },
|
|
197
|
+
* listRecords: ({ id }) => {
|
|
198
|
+
* return record.id == 34 ?
|
|
199
|
+
* [{ code: 'AL', name: 'Alabama' }, { code: 'AK', name: 'Alaska' }] :
|
|
200
|
+
* [{ code: 'AZ', name: 'Arizona' }, { code: 'TX', name: 'Texas' }];
|
|
201
|
+
* }
|
|
202
|
+
* })
|
|
203
|
+
*/
|
|
204
|
+
addExternalRelation(name, definition) {
|
|
205
|
+
const { schema } = this.stack.action.getCollection(this.name);
|
|
206
|
+
const primaryKeys = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(schema);
|
|
207
|
+
return this.addField(name, {
|
|
208
|
+
dependencies: definition.dependencies ?? primaryKeys,
|
|
209
|
+
columnType: [definition.schema],
|
|
210
|
+
getValues: async (records, context) => Promise.all(records.map(async (record) => definition.listRecords(record, context))),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
179
213
|
/**
|
|
180
214
|
* Add a new segment on the collection.
|
|
181
215
|
* @param name the name of the segment
|
|
@@ -318,4 +352,4 @@ class CollectionBuilder {
|
|
|
318
352
|
}
|
|
319
353
|
}
|
|
320
354
|
exports.default = CollectionBuilder;
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
355
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVyL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFpQnlDO0FBR3pDLHlGQUE4RTtBQUU5RSxNQUFxQixpQkFBaUI7SUFPcEMsWUFBWSxLQUFzQixFQUFFLElBQVk7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWTtRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFaEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxJQUFZLEVBQUUsT0FBOEQ7UUFDdEYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxvQ0FBZSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBaUIsQ0FBQztRQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNsQixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVB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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ActionCollectionDecorator, ChartDataSourceDecorator, ComputedCollectionDecorator, DataSource, DataSourceDecorator, EmptyCollectionDecorator, OperatorsEmulateCollectionDecorator, OperatorsReplaceCollectionDecorator, PublicationCollectionDecorator, RelationCollectionDecorator, RenameCollectionDecorator, SearchCollectionDecorator, SegmentCollectionDecorator, SortEmulateCollectionDecorator, WriteCollectionDecorator } from '@forestadmin/datasource-toolkit';
|
|
1
|
+
import { ActionCollectionDecorator, ChartDataSourceDecorator, ComputedCollectionDecorator, DataSource, DataSourceDecorator, EmptyCollectionDecorator, OperatorsEmulateCollectionDecorator, OperatorsReplaceCollectionDecorator, PublicationCollectionDecorator, RelationCollectionDecorator, RenameCollectionDecorator, SchemaCollectionDecorator, SearchCollectionDecorator, SegmentCollectionDecorator, SortEmulateCollectionDecorator, WriteCollectionDecorator } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
export default class DecoratorsStack {
|
|
3
3
|
action: DataSourceDecorator<ActionCollectionDecorator>;
|
|
4
4
|
chart: ChartDataSourceDecorator;
|
|
@@ -12,6 +12,7 @@ export default class DecoratorsStack {
|
|
|
12
12
|
lateOpReplace: DataSourceDecorator<OperatorsReplaceCollectionDecorator>;
|
|
13
13
|
publication: DataSourceDecorator<PublicationCollectionDecorator>;
|
|
14
14
|
rename: DataSourceDecorator<RenameCollectionDecorator>;
|
|
15
|
+
schema: DataSourceDecorator<SchemaCollectionDecorator>;
|
|
15
16
|
search: DataSourceDecorator<SearchCollectionDecorator>;
|
|
16
17
|
segment: DataSourceDecorator<SegmentCollectionDecorator>;
|
|
17
18
|
sortEmulate: DataSourceDecorator<SortEmulateCollectionDecorator>;
|
|
@@ -25,6 +25,7 @@ class DecoratorsStack {
|
|
|
25
25
|
last = this.write = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.WriteCollectionDecorator);
|
|
26
26
|
// Step 3: Access to all fields AND emulated capabilities
|
|
27
27
|
last = this.action = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.ActionCollectionDecorator);
|
|
28
|
+
last = this.schema = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.SchemaCollectionDecorator);
|
|
28
29
|
// Step 4: Renaming must be either the very first or very last so that naming in customer code
|
|
29
30
|
// is consistent.
|
|
30
31
|
last = this.publication = new datasource_toolkit_1.DataSourceDecorator(last, datasource_toolkit_1.PublicationCollectionDecorator);
|
|
@@ -34,4 +35,4 @@ class DecoratorsStack {
|
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
exports.default = DecoratorsStack;
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVyL2RlY29yYXRvcnMtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3RUFpQnlDO0FBRXpDLE1BQXFCLGVBQWU7SUFvQmxDLFlBQVksVUFBc0I7UUFDaEMsSUFBSSxJQUFJLEdBQWUsVUFBVSxDQUFDO1FBRWxDLG9DQUFvQztRQUNwQyxtRkFBbUY7UUFDbkYsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsNkNBQXdCLENBQUMsQ0FBQztRQUU1RSw2RkFBNkY7UUFDN0Ysc0VBQXNFO1FBQ3RFLDJGQUEyRjtRQUMzRixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSxnREFBMkIsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLHdEQUFtQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsd0RBQW1DLENBQUMsQ0FBQztRQUNoRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSxnREFBMkIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLGdEQUEyQixDQUFDLENBQUM7UUFDdEYsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsd0RBQW1DLENBQUMsQ0FBQztRQUMvRixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSx3REFBbUMsQ0FBQyxDQUFDO1FBRS9GLDRFQUE0RTtRQUM1RSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLDZDQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLDhDQUF5QixDQUFDLENBQUM7UUFDOUUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsK0NBQTBCLENBQUMsQ0FBQztRQUNoRixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHdDQUFtQixDQUFDLElBQUksRUFBRSxtREFBOEIsQ0FBQyxDQUFDO1FBQ3hGLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLDZDQUF3QixDQUFDLENBQUM7UUFFNUUseURBQXlEO1FBQ3pELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLDhDQUF5QixDQUFDLENBQUM7UUFDOUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsOENBQXlCLENBQUMsQ0FBQztRQUU5RSw4RkFBOEY7UUFDOUYsaUJBQWlCO1FBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksd0NBQW1CLENBQUMsSUFBSSxFQUFFLG1EQUE4QixDQUFDLENBQUM7UUFDeEYsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsOENBQXlCLENBQUMsQ0FBQztRQUM5RSxtQ0FBbUM7UUFFbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBekRELGtDQXlEQyJ9
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { ComputedDefinition, TCollectionName, TSchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { CollectionCustomizationContext, ComputedDefinition, PrimitiveTypes, TCollectionName, TFieldName, TRow, TSchema } from '@forestadmin/datasource-toolkit';
|
|
3
3
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
4
4
|
export declare type FieldDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = ComputedDefinition<S, N> & {
|
|
5
5
|
beforeRelations?: boolean;
|
|
6
6
|
};
|
|
7
|
+
export declare type OneToManyEmbeddedDefinition<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
|
|
8
|
+
schema: Record<string, PrimitiveTypes>;
|
|
9
|
+
dependencies?: TFieldName<S, N>[];
|
|
10
|
+
listRecords(records: TRow<S, N>, context: CollectionCustomizationContext<S, N>): Promise<unknown[]> | unknown[];
|
|
11
|
+
};
|
|
7
12
|
export declare type HttpCallback = (req: IncomingMessage, res: ServerResponse) => void;
|
|
8
13
|
//# sourceMappingURL=types.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.35",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@fast-csv/format": "^4.3.5",
|
|
16
16
|
"@fastify/express": "^1.1.0",
|
|
17
|
-
"@forestadmin/datasource-toolkit": "1.0.0-beta.
|
|
17
|
+
"@forestadmin/datasource-toolkit": "1.0.0-beta.21",
|
|
18
18
|
"@koa/cors": "^3.3.0",
|
|
19
19
|
"@koa/router": "^10.1.1",
|
|
20
20
|
"forest-ip-utils": "^1.0.1",
|