@forestadmin/agent 1.0.0-beta.8 → 1.0.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.
Files changed (149) hide show
  1. package/dist/agent.d.ts +76 -0
  2. package/dist/agent.js +133 -0
  3. package/dist/framework-mounter.d.ts +43 -0
  4. package/dist/framework-mounter.js +157 -0
  5. package/dist/index.d.ts +7 -4
  6. package/dist/index.js +10 -21
  7. package/dist/routes/access/api-chart.d.ts +16 -0
  8. package/dist/routes/access/api-chart.js +47 -0
  9. package/dist/{agent/routes → routes}/access/chart.d.ts +1 -0
  10. package/dist/routes/access/chart.js +162 -0
  11. package/dist/{agent/routes → routes}/access/count-related.d.ts +0 -0
  12. package/dist/routes/access/count-related.js +31 -0
  13. package/dist/{agent/routes → routes}/access/count.d.ts +0 -0
  14. package/dist/routes/access/count.js +31 -0
  15. package/dist/{agent/routes → routes}/access/csv-related.d.ts +0 -0
  16. package/dist/routes/access/csv-related.js +33 -0
  17. package/dist/{agent/routes → routes}/access/csv.d.ts +0 -0
  18. package/dist/routes/access/csv.js +31 -0
  19. package/dist/{agent/routes → routes}/access/get.d.ts +0 -0
  20. package/dist/routes/access/get.js +29 -0
  21. package/dist/{agent/routes → routes}/access/list-related.d.ts +0 -0
  22. package/dist/routes/access/list-related.js +25 -0
  23. package/dist/{agent/routes → routes}/access/list.d.ts +0 -0
  24. package/dist/routes/access/list.js +22 -0
  25. package/dist/{agent/routes → routes}/base-route.d.ts +0 -1
  26. package/dist/routes/base-route.js +13 -0
  27. package/dist/{agent/routes → routes}/collection-route.d.ts +0 -0
  28. package/dist/{agent/routes → routes}/collection-route.js +1 -1
  29. package/dist/{agent/routes → routes}/index.d.ts +0 -0
  30. package/dist/routes/index.js +108 -0
  31. package/dist/{agent/routes → routes}/modification/action.d.ts +0 -1
  32. package/dist/routes/modification/action.js +104 -0
  33. package/dist/routes/modification/associate-related.d.ts +12 -0
  34. package/dist/routes/modification/associate-related.js +51 -0
  35. package/dist/{agent/routes → routes}/modification/create.d.ts +0 -0
  36. package/dist/routes/modification/create.js +83 -0
  37. package/dist/{agent/routes → routes}/modification/delete.d.ts +0 -0
  38. package/dist/routes/modification/delete.js +41 -0
  39. package/dist/{agent/routes → routes}/modification/dissociate-delete-related.d.ts +0 -0
  40. package/dist/routes/modification/dissociate-delete-related.js +89 -0
  41. package/dist/routes/modification/update-field.d.ts +9 -0
  42. package/dist/routes/modification/update-field.js +39 -0
  43. package/dist/{agent/routes → routes}/modification/update-relation.d.ts +0 -0
  44. package/dist/routes/modification/update-relation.js +59 -0
  45. package/dist/{agent/routes → routes}/modification/update.d.ts +0 -0
  46. package/dist/routes/modification/update.js +31 -0
  47. package/dist/{agent/routes → routes}/relation-route.d.ts +0 -0
  48. package/dist/{agent/routes → routes}/relation-route.js +1 -1
  49. package/dist/{agent/routes → routes}/security/authentication.d.ts +1 -3
  50. package/dist/routes/security/authentication.js +74 -0
  51. package/dist/{agent/routes → routes}/security/ip-whitelist.d.ts +0 -0
  52. package/dist/{agent/routes → routes}/security/ip-whitelist.js +1 -1
  53. package/dist/{agent/routes → routes}/security/scope-invalidation.d.ts +0 -0
  54. package/dist/{agent/routes → routes}/security/scope-invalidation.js +1 -1
  55. package/dist/{agent/routes → routes}/system/error-handling.d.ts +2 -0
  56. package/dist/routes/system/error-handling.js +75 -0
  57. package/dist/{agent/routes → routes}/system/healthcheck.d.ts +0 -0
  58. package/dist/{agent/routes → routes}/system/healthcheck.js +1 -1
  59. package/dist/{agent/routes → routes}/system/logger.d.ts +0 -0
  60. package/dist/{agent/routes → routes}/system/logger.js +2 -2
  61. package/dist/{agent/services → services}/index.d.ts +0 -0
  62. package/dist/{agent/services → services}/index.js +2 -2
  63. package/dist/{agent/services → services}/permissions.d.ts +0 -0
  64. package/dist/services/permissions.js +85 -0
  65. package/dist/{agent/services → services}/serializer.d.ts +0 -5
  66. package/dist/services/serializer.js +120 -0
  67. package/dist/types.d.ts +28 -3
  68. package/dist/types.js +21 -1
  69. package/dist/{agent/utils → utils}/body-parser.d.ts +0 -0
  70. package/dist/{agent/utils → utils}/body-parser.js +1 -1
  71. package/dist/utils/condition-tree-parser.d.ts +11 -0
  72. package/dist/utils/condition-tree-parser.js +53 -0
  73. package/dist/{agent/utils → utils}/context-filter-factory.d.ts +0 -0
  74. package/dist/{agent/utils → utils}/context-filter-factory.js +1 -2
  75. package/dist/{agent/utils → utils}/csv-generator.d.ts +2 -2
  76. package/dist/utils/csv-generator.js +39 -0
  77. package/dist/{agent/utils → utils}/csv-route-context.d.ts +0 -0
  78. package/dist/utils/csv-route-context.js +14 -0
  79. package/dist/{agent/utils → utils}/forest-http-api.d.ts +5 -3
  80. package/dist/utils/forest-http-api.js +180 -0
  81. package/dist/{agent/utils → utils}/forest-schema/action-values.d.ts +2 -2
  82. package/dist/utils/forest-schema/action-values.js +144 -0
  83. package/dist/{agent/utils → utils}/forest-schema/emitter.d.ts +2 -2
  84. package/dist/utils/forest-schema/emitter.js +70 -0
  85. package/dist/{agent/utils → utils}/forest-schema/filterable.d.ts +0 -0
  86. package/dist/{agent/utils → utils}/forest-schema/filterable.js +1 -1
  87. package/dist/{agent/utils → utils}/forest-schema/generator-actions.d.ts +1 -1
  88. package/dist/utils/forest-schema/generator-actions.js +99 -0
  89. package/dist/{agent/utils → utils}/forest-schema/generator-collection.d.ts +1 -1
  90. package/dist/{agent/utils → utils}/forest-schema/generator-collection.js +3 -3
  91. package/dist/{agent/utils → utils}/forest-schema/generator-fields.d.ts +1 -0
  92. package/dist/utils/forest-schema/generator-fields.js +160 -0
  93. package/dist/{agent/utils → utils}/forest-schema/generator-segments.d.ts +0 -0
  94. package/dist/{agent/utils → utils}/forest-schema/generator-segments.js +1 -1
  95. package/dist/{agent/utils → utils}/forest-schema/types.d.ts +10 -4
  96. package/dist/{agent/utils → utils}/forest-schema/types.js +1 -1
  97. package/dist/{agent/utils → utils}/forest-schema/validation.d.ts +1 -1
  98. package/dist/utils/forest-schema/validation.js +28 -0
  99. package/dist/{agent/utils → utils}/id.d.ts +0 -0
  100. package/dist/utils/id.js +43 -0
  101. package/dist/{agent/utils/http-driver-options.d.ts → utils/options-validator.d.ts} +4 -5
  102. package/dist/utils/options-validator.js +92 -0
  103. package/dist/{agent/utils → utils}/query-string.d.ts +2 -2
  104. package/dist/utils/query-string.js +134 -0
  105. package/package.json +14 -3
  106. package/CHANGELOG.md +0 -457
  107. package/dist/agent/forestadmin-http-driver.d.ts +0 -34
  108. package/dist/agent/forestadmin-http-driver.js +0 -72
  109. package/dist/agent/routes/access/chart.js +0 -147
  110. package/dist/agent/routes/access/count-related.js +0 -24
  111. package/dist/agent/routes/access/count.js +0 -24
  112. package/dist/agent/routes/access/csv-related.js +0 -33
  113. package/dist/agent/routes/access/csv.js +0 -30
  114. package/dist/agent/routes/access/get.js +0 -28
  115. package/dist/agent/routes/access/list-related.js +0 -26
  116. package/dist/agent/routes/access/list.js +0 -23
  117. package/dist/agent/routes/base-route.js +0 -16
  118. package/dist/agent/routes/index.js +0 -90
  119. package/dist/agent/routes/modification/action.js +0 -103
  120. package/dist/agent/routes/modification/associate-related.d.ts +0 -12
  121. package/dist/agent/routes/modification/associate-related.js +0 -49
  122. package/dist/agent/routes/modification/create.js +0 -81
  123. package/dist/agent/routes/modification/delete.js +0 -40
  124. package/dist/agent/routes/modification/dissociate-delete-related.js +0 -88
  125. package/dist/agent/routes/modification/update-relation.js +0 -53
  126. package/dist/agent/routes/modification/update.js +0 -29
  127. package/dist/agent/routes/security/authentication.js +0 -86
  128. package/dist/agent/routes/system/error-handling.js +0 -56
  129. package/dist/agent/services/permissions.js +0 -79
  130. package/dist/agent/services/serializer.js +0 -120
  131. package/dist/agent/types.d.ts +0 -23
  132. package/dist/agent/types.js +0 -22
  133. package/dist/agent/utils/csv-generator.js +0 -39
  134. package/dist/agent/utils/csv-route-context.js +0 -14
  135. package/dist/agent/utils/forest-http-api.js +0 -173
  136. package/dist/agent/utils/forest-schema/action-values.js +0 -144
  137. package/dist/agent/utils/forest-schema/emitter.js +0 -70
  138. package/dist/agent/utils/forest-schema/generator-actions.js +0 -99
  139. package/dist/agent/utils/forest-schema/generator-fields.js +0 -131
  140. package/dist/agent/utils/forest-schema/validation.js +0 -26
  141. package/dist/agent/utils/http-driver-options.js +0 -93
  142. package/dist/agent/utils/id.js +0 -43
  143. package/dist/agent/utils/query-string.js +0 -130
  144. package/dist/builder/agent.d.ts +0 -82
  145. package/dist/builder/agent.js +0 -123
  146. package/dist/builder/collection.d.ts +0 -148
  147. package/dist/builder/collection.js +0 -226
  148. package/dist/builder/types.d.ts +0 -5
  149. package/dist/builder/types.js +0 -3
@@ -1,72 +0,0 @@
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 koa_1 = __importDefault(require("koa"));
7
- const router_1 = __importDefault(require("@koa/router"));
8
- const koa_bodyparser_1 = __importDefault(require("koa-bodyparser"));
9
- const cors_1 = __importDefault(require("@koa/cors"));
10
- const path_1 = __importDefault(require("path"));
11
- const forest_http_api_1 = __importDefault(require("./utils/forest-http-api"));
12
- const http_driver_options_1 = __importDefault(require("./utils/http-driver-options"));
13
- const emitter_1 = __importDefault(require("./utils/forest-schema/emitter"));
14
- const routes_1 = __importDefault(require("./routes"));
15
- const services_1 = __importDefault(require("./services"));
16
- class ForestAdminHttpDriver {
17
- constructor(dataSource, options) {
18
- this.routes = [];
19
- this.app = new koa_1.default();
20
- this.status = 'waiting';
21
- this.dataSource = dataSource;
22
- this.options = http_driver_options_1.default.withDefaults(options);
23
- this.services = (0, services_1.default)(this.options);
24
- http_driver_options_1.default.validate(this.options);
25
- }
26
- /**
27
- * Native request handler.
28
- * Can be used directly with express.js or the Node.js http module.
29
- * Other frameworks will require adapters.
30
- */
31
- get handler() {
32
- return this.app.callback();
33
- }
34
- /**
35
- * Builds the underlying application from the datasource.
36
- * This method can only be called once.
37
- */
38
- async start() {
39
- if (this.status !== 'waiting') {
40
- throw new Error('Agent cannot be restarted.');
41
- }
42
- this.status = 'running';
43
- // Build http application
44
- const router = new router_1.default({ prefix: path_1.default.join('/', this.options.prefix) });
45
- this.routes = (0, routes_1.default)(this.dataSource, this.options, this.services);
46
- this.routes.forEach(route => route.setupRoutes(router));
47
- await Promise.all(this.routes.map(route => route.bootstrap()));
48
- this.app
49
- .use((0, cors_1.default)({ credentials: true, maxAge: 24 * 3600, privateNetworkAccess: true }))
50
- .use((0, koa_bodyparser_1.default)({ jsonLimit: '50mb' }))
51
- .use(router.routes());
52
- // Send schema to forestadmin-server (if relevant).
53
- const schema = await emitter_1.default.getSerializedSchema(this.options, this.dataSource);
54
- const schemaIsKnown = await forest_http_api_1.default.hasSchema(this.options, schema.meta.schemaFileHash);
55
- if (!schemaIsKnown) {
56
- await forest_http_api_1.default.uploadSchema(this.options, schema);
57
- }
58
- this.options?.logger('Info', 'Started');
59
- }
60
- /**
61
- * Tear down all routes (close open sockets, ...)
62
- */
63
- async stop() {
64
- if (this.status !== 'running') {
65
- throw new Error('Agent is not running.');
66
- }
67
- this.status = 'done';
68
- await Promise.all(this.routes.map(route => route.tearDown()));
69
- }
70
- }
71
- exports.default = ForestAdminHttpDriver;
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZXN0YWRtaW4taHR0cC1kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQvZm9yZXN0YWRtaW4taHR0cC1kcml2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSw4Q0FBc0I7QUFDdEIseURBQWlDO0FBQ2pDLG9FQUF3QztBQUN4QyxxREFBNkI7QUFDN0IsZ0RBQXdCO0FBS3hCLDhFQUFvRDtBQUNwRCxzRkFBdUQ7QUFDdkQsNEVBQTBEO0FBQzFELHNEQUFrQztBQUNsQywwREFBeUU7QUFLekUsTUFBcUIscUJBQXFCO0lBa0J4QyxZQUFZLFVBQXNCLEVBQUUsT0FBcUI7UUFkbEQsV0FBTSxHQUFnQixFQUFFLENBQUM7UUFFZixRQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUN6QixXQUFNLEdBQW1DLFNBQVMsQ0FBQztRQVl6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLDZCQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBQSxrQkFBWSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUzQyw2QkFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQWZEOzs7O09BSUc7SUFDSCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQVVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDL0M7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUV4Qix5QkFBeUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxnQkFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxnQkFBVSxFQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsR0FBRzthQUNMLEdBQUcsQ0FBQyxJQUFBLGNBQUksRUFBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUMvRSxHQUFHLENBQUMsSUFBQSx3QkFBVSxFQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDdEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXhCLG1EQUFtRDtRQUNuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEYsTUFBTSxhQUFhLEdBQUcsTUFBTSx5QkFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFOUYsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixNQUFNLHlCQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDeEQ7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNGO0FBdEVELHdDQXNFQyJ9
@@ -1,147 +0,0 @@
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 luxon_1 = require("luxon");
8
- const uuid_1 = require("uuid");
9
- const collection_route_1 = __importDefault(require("../collection-route"));
10
- const context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
11
- var ChartType;
12
- (function (ChartType) {
13
- ChartType["Value"] = "Value";
14
- ChartType["Objective"] = "Objective";
15
- ChartType["Pie"] = "Pie";
16
- ChartType["Line"] = "Line";
17
- ChartType["Leaderboard"] = "Leaderboard";
18
- })(ChartType || (ChartType = {}));
19
- class Chart extends collection_route_1.default {
20
- setupRoutes(router) {
21
- router.post(`/stats/${this.collection.name}`, this.handleChart.bind(this));
22
- }
23
- async handleChart(context) {
24
- const { body } = context.request;
25
- await this.services.permissions.canChart(context);
26
- if (!Object.values(ChartType).includes(body.type)) {
27
- throw new datasource_toolkit_1.ValidationError(`Invalid Chart type "${body.type}"`);
28
- }
29
- context.response.body = {
30
- data: {
31
- id: (0, uuid_1.v1)(),
32
- type: 'stats',
33
- attributes: { value: await this[`make${body.type}Chart`](context) },
34
- },
35
- };
36
- }
37
- async makeValueChart(context) {
38
- const currentFilter = await this.getFilter(context);
39
- const result = {
40
- countCurrent: await this.computeValue(context, currentFilter),
41
- countPrevious: undefined,
42
- };
43
- const isAndAggregator = currentFilter.conditionTree?.aggregator === 'And';
44
- const withCountPrevious = currentFilter.conditionTree?.someLeaf(leaf => leaf.useIntervalOperator);
45
- if (withCountPrevious && !isAndAggregator) {
46
- result.countPrevious = await this.computeValue(context, datasource_toolkit_1.FilterFactory.getPreviousPeriodFilter(currentFilter));
47
- }
48
- return result;
49
- }
50
- async makeObjectiveChart(context) {
51
- return { value: await this.computeValue(context, await this.getFilter(context)) };
52
- }
53
- async makePieChart(context) {
54
- const { group_by_field: groupByField, aggregate, aggregate_field: aggregateField, } = context.request.body;
55
- const rows = await this.collection.aggregate(await this.getFilter(context), new datasource_toolkit_1.Aggregation({
56
- operation: aggregate,
57
- field: aggregateField,
58
- groups: [{ field: groupByField }],
59
- }));
60
- return rows.map(row => ({
61
- key: row.group[groupByField],
62
- value: row.value,
63
- }));
64
- }
65
- async makeLineChart(context) {
66
- const { aggregate, aggregate_field: aggregateField, group_by_date_field: groupByDateField, time_range: timeRange, } = context.request.body;
67
- const rows = await this.collection.aggregate(await this.getFilter(context), new datasource_toolkit_1.Aggregation({
68
- operation: aggregate,
69
- field: aggregateField,
70
- groups: [{ field: groupByDateField, operation: timeRange }],
71
- }));
72
- const values = {};
73
- rows.forEach(row => {
74
- values[luxon_1.DateTime.fromISO(row.group[groupByDateField]).toISODate()] = Number(row.value);
75
- });
76
- const dates = Object.keys(values).sort((dateA, dateB) => dateA.localeCompare(dateB));
77
- const last = luxon_1.DateTime.fromISO(dates[dates.length - 1]);
78
- const dataPoints = [];
79
- const format = Chart.formats[timeRange];
80
- for (let current = luxon_1.DateTime.fromISO(dates[0]); current <= last; current = current.plus({ [timeRange]: 1 })) {
81
- const label = current.toFormat(format);
82
- const value = values[current.toISODate()] ?? 0;
83
- dataPoints.push({ label, values: { value } });
84
- }
85
- return dataPoints;
86
- }
87
- async makeLeaderboardChart(context) {
88
- const { body } = context.request;
89
- const field = this.collection.schema.fields[body.relationship_field];
90
- let collection;
91
- let filter;
92
- let aggregation;
93
- if (field?.type === 'OneToMany') {
94
- const inverse = datasource_toolkit_1.CollectionUtils.getInverseRelation(this.collection, body.relationship_field);
95
- if (inverse) {
96
- collection = field.foreignCollection;
97
- filter = (await this.getFilter(context)).nest(inverse);
98
- aggregation = new datasource_toolkit_1.Aggregation({
99
- operation: body.aggregate,
100
- field: body.aggregate_field,
101
- groups: [{ field: `${inverse}:${body.label_field}` }],
102
- });
103
- }
104
- }
105
- if (field?.type === 'ManyToMany') {
106
- const origin = datasource_toolkit_1.CollectionUtils.getThroughOrigin(this.collection, body.relationship_field);
107
- const target = datasource_toolkit_1.CollectionUtils.getThroughTarget(this.collection, body.relationship_field);
108
- if (origin && target) {
109
- collection = field.throughCollection;
110
- filter = (await this.getFilter(context)).nest(origin);
111
- aggregation = new datasource_toolkit_1.Aggregation({
112
- operation: body.aggregate,
113
- field: body.aggregate_field ? `${target}:${body.aggregate_field}` : null,
114
- groups: [{ field: `${origin}:${body.label_field}` }],
115
- });
116
- }
117
- }
118
- if (collection && filter && aggregation) {
119
- const rows = await this.dataSource
120
- .getCollection(collection)
121
- .aggregate(filter, aggregation, Number(body.limit));
122
- return rows.map(row => ({
123
- key: row.group[aggregation.groups[0].field],
124
- value: row.value,
125
- }));
126
- }
127
- throw new datasource_toolkit_1.ValidationError(`Failed to generate leaderboard chart: parameters do not match pre-requisites`);
128
- }
129
- async computeValue(context, filter) {
130
- const { aggregate, aggregate_field: aggregateField } = context.request.body;
131
- const aggregation = new datasource_toolkit_1.Aggregation({ operation: aggregate, field: aggregateField });
132
- const rows = await this.collection.aggregate(filter, aggregation);
133
- return rows.length ? rows[0].value : 0;
134
- }
135
- async getFilter(context) {
136
- const scope = await this.services.permissions.getScope(this.collection, context);
137
- return context_filter_factory_1.default.build(this.collection, context, scope);
138
- }
139
- }
140
- exports.default = Chart;
141
- Chart.formats = {
142
- Day: 'dd/MM/yyyy',
143
- Week: "'W'W-yyyy",
144
- Month: 'MMM yy',
145
- Year: 'yyyy',
146
- };
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL2FjY2Vzcy9jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQVN5QztBQUV6QyxpQ0FBaUM7QUFDakMsK0JBQW9DO0FBR3BDLDJFQUFrRDtBQUNsRCxnR0FBc0U7QUFFdEUsSUFBSyxTQU1KO0FBTkQsV0FBSyxTQUFTO0lBQ1osNEJBQWUsQ0FBQTtJQUNmLG9DQUF1QixDQUFBO0lBQ3ZCLHdCQUFXLENBQUE7SUFDWCwwQkFBYSxDQUFBO0lBQ2Isd0NBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQU5JLFNBQVMsS0FBVCxTQUFTLFFBTWI7QUFFRCxNQUFxQixLQUFNLFNBQVEsMEJBQWU7SUFRaEQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFnQjtRQUNoQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUVqQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pELE1BQU0sSUFBSSxvQ0FBZSxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNoRTtRQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHO1lBQ3RCLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsSUFBQSxT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
@@ -1,24 +0,0 @@
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 context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
8
- const id_1 = __importDefault(require("../../utils/id"));
9
- const relation_route_1 = __importDefault(require("../relation-route"));
10
- class CountRelatedRoute extends relation_route_1.default {
11
- setupRoutes(router) {
12
- router.get(`/${this.collection.name}/:parentId/relationships/${this.relationName}/count`, this.handleCountRelated.bind(this));
13
- }
14
- async handleCountRelated(context) {
15
- await this.services.permissions.can(context, `browse:${this.collection.name}`);
16
- const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
17
- const scope = await this.services.permissions.getScope(this.foreignCollection, context);
18
- const filter = context_filter_factory_1.default.build(this.foreignCollection, context, scope);
19
- const aggregationResult = await datasource_toolkit_1.CollectionUtils.aggregateRelation(this.collection, parentId, this.relationName, filter, new datasource_toolkit_1.Aggregation({ operation: 'Count' }));
20
- context.response.body = { count: aggregationResult?.[0]?.value ?? 0 };
21
- }
22
- }
23
- exports.default = CountRelatedRoute;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQtcmVsYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC9yb3V0ZXMvYWNjZXNzL2NvdW50LXJlbGF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFBK0U7QUFJL0UsZ0dBQXNFO0FBQ3RFLHdEQUFxQztBQUNyQyx1RUFBOEM7QUFFOUMsTUFBcUIsaUJBQWtCLFNBQVEsd0JBQWE7SUFDMUQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FDUixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFlBQVksUUFBUSxFQUM3RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFnQjtRQUM5QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UsTUFBTSxRQUFRLEdBQUcsWUFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RixNQUFNLE1BQU0sR0FBRyxnQ0FBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sb0NBQWUsQ0FBQyxpQkFBaUIsQ0FDL0QsSUFBSSxDQUFDLFVBQVUsRUFDZixRQUFRLEVBQ1IsSUFBSSxDQUFDLFlBQVksRUFDakIsTUFBTSxFQUNOLElBQUksZ0NBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUN4QyxDQUFDO1FBRUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDeEUsQ0FBQztDQUNGO0FBekJELG9DQXlCQyJ9
@@ -1,24 +0,0 @@
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 collection_route_1 = __importDefault(require("../collection-route"));
8
- const context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
9
- class CountRoute extends collection_route_1.default {
10
- setupRoutes(router) {
11
- router.get(`/${this.collection.name}/count`, this.handleCount.bind(this));
12
- }
13
- async handleCount(context) {
14
- await this.services.permissions.can(context, `browse:${this.collection.name}`);
15
- const scope = await this.services.permissions.getScope(this.collection, context);
16
- const filter = context_filter_factory_1.default.build(this.collection, context, scope);
17
- const aggregation = new datasource_toolkit_1.Aggregation({ operation: 'Count' });
18
- const aggregationResult = await this.collection.aggregate(filter, aggregation);
19
- const count = aggregationResult?.[0]?.value ?? 0;
20
- context.response.body = { count };
21
- }
22
- }
23
- exports.default = CountRoute;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL2FjY2Vzcy9jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUE4RDtBQUk5RCwyRUFBa0Q7QUFDbEQsZ0dBQXNFO0FBRXRFLE1BQXFCLFVBQVcsU0FBUSwwQkFBZTtJQUNyRCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQWdCO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLGdDQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzRSxNQUFNLFdBQVcsR0FBRyxJQUFJLGdDQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVqRCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQWpCRCw2QkFpQkMifQ==
@@ -1,33 +0,0 @@
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 stream_1 = require("stream");
8
- const context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
9
- const csv_generator_1 = __importDefault(require("../../utils/csv-generator"));
10
- const csv_route_context_1 = __importDefault(require("../../utils/csv-route-context"));
11
- const id_1 = __importDefault(require("../../utils/id"));
12
- const query_string_1 = __importDefault(require("../../utils/query-string"));
13
- const relation_route_1 = __importDefault(require("../relation-route"));
14
- class CsvRelatedRoute extends relation_route_1.default {
15
- setupRoutes(router) {
16
- router.get(`/${this.collection.name}/:parentId/relationships/${this.relationName}.csv`, this.handleRelatedCsv.bind(this));
17
- }
18
- async handleRelatedCsv(context) {
19
- await this.services.permissions.can(context, `browse:${this.collection.name}`);
20
- await this.services.permissions.can(context, `export:${this.collection.name}`);
21
- const { header } = context.request.query;
22
- csv_route_context_1.default.buildResponse(context);
23
- const projection = query_string_1.default.parseProjection(this.foreignCollection, context);
24
- const scope = await this.services.permissions.getScope(this.foreignCollection, context);
25
- const filter = context_filter_factory_1.default.buildPaginated(this.foreignCollection, context, scope);
26
- const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
27
- const list = async (paginatedFilter, projectionParam) => datasource_toolkit_1.CollectionUtils.listRelation(this.collection, parentId, this.relationName, paginatedFilter, projectionParam);
28
- const gen = csv_generator_1.default.generate(projection, header, filter, this.foreignCollection, list);
29
- context.response.body = stream_1.Readable.from(gen);
30
- }
31
- }
32
- exports.default = CsvRelatedRoute;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LXJlbGF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL2FjY2Vzcy9jc3YtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUErRjtBQUkvRixtQ0FBa0M7QUFDbEMsZ0dBQXNFO0FBQ3RFLDhFQUFxRDtBQUNyRCxzRkFBNEQ7QUFDNUQsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUN6RCx1RUFBOEM7QUFFOUMsTUFBcUIsZUFBZ0IsU0FBUSx3QkFBYTtJQUN4RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLDRCQUE0QixJQUFJLENBQUMsWUFBWSxNQUFNLEVBQzNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWdCO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBK0IsQ0FBQztRQUNuRSwyQkFBZSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2QyxNQUFNLFVBQVUsR0FBRyxzQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RixNQUFNLE1BQU0sR0FBRyxnQ0FBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkYsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLGVBQWdDLEVBQUUsZUFBMkIsRUFBRSxFQUFFLENBQ25GLG9DQUFlLENBQUMsWUFBWSxDQUMxQixJQUFJLENBQUMsVUFBVSxFQUNmLFFBQVEsRUFDUixJQUFJLENBQUMsWUFBWSxFQUNqQixlQUFlLEVBQ2YsZUFBZSxDQUNoQixDQUFDO1FBRUosTUFBTSxHQUFHLEdBQUcsdUJBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVGLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLGlCQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQWhDRCxrQ0FnQ0MifQ==
@@ -1,30 +0,0 @@
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 stream_1 = require("stream");
7
- const collection_route_1 = __importDefault(require("../collection-route"));
8
- const context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
9
- const csv_generator_1 = __importDefault(require("../../utils/csv-generator"));
10
- const csv_route_context_1 = __importDefault(require("../../utils/csv-route-context"));
11
- const query_string_1 = __importDefault(require("../../utils/query-string"));
12
- class CsvRoute extends collection_route_1.default {
13
- setupRoutes(router) {
14
- router.get(`/${this.collection.name}.csv`, this.handleCsv.bind(this));
15
- }
16
- async handleCsv(context) {
17
- await this.services.permissions.can(context, `read:${this.collection.name}`);
18
- await this.services.permissions.can(context, `export:${this.collection.name}`);
19
- const { header } = context.request.query;
20
- csv_route_context_1.default.buildResponse(context);
21
- const projection = query_string_1.default.parseProjection(this.collection, context);
22
- const scope = await this.services.permissions.getScope(this.collection, context);
23
- const filter = context_filter_factory_1.default.buildPaginated(this.collection, context, scope);
24
- const list = this.collection.list.bind(this.collection);
25
- const gen = csv_generator_1.default.generate(projection, header, filter, this.collection, list);
26
- context.response.body = stream_1.Readable.from(gen);
27
- }
28
- }
29
- exports.default = CsvRoute;
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9hY2Nlc3MvY3N2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EsbUNBQWtDO0FBQ2xDLDJFQUFrRDtBQUNsRCxnR0FBc0U7QUFDdEUsOEVBQXFEO0FBQ3JELHNGQUE0RDtBQUM1RCw0RUFBeUQ7QUFFekQsTUFBcUIsUUFBUyxTQUFRLDBCQUFlO0lBQ25ELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBZ0I7UUFDOUIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUErQixDQUFDO1FBQ25FLDJCQUFlLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLE1BQU0sVUFBVSxHQUFHLHNCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9FLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakYsTUFBTSxNQUFNLEdBQUcsZ0NBQW9CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsdUJBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxpQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFwQkQsMkJBb0JDIn0=
@@ -1,28 +0,0 @@
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
- class GetRoute extends collection_route_1.default {
11
- setupRoutes(router) {
12
- router.get(`/${this.collection.name}/:id`, this.handleGet.bind(this));
13
- }
14
- async handleGet(context) {
15
- await this.services.permissions.can(context, `read:${this.collection.name}`);
16
- const id = id_1.default.unpackId(this.collection.schema, context.params.id);
17
- const filter = new datasource_toolkit_1.PaginatedFilter({
18
- conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]), await this.services.permissions.getScope(this.collection, context)),
19
- });
20
- const records = await this.collection.list(filter, datasource_toolkit_1.ProjectionFactory.all(this.collection));
21
- if (!records.length) {
22
- context.throw(types_1.HttpCode.NotFound, 'Record does not exists');
23
- }
24
- context.response.body = this.services.serializer.serialize(this.collection, records[0]);
25
- }
26
- }
27
- exports.default = GetRoute;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9hY2Nlc3MvZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBSXlDO0FBSXpDLHVDQUF1QztBQUN2QywyRUFBa0Q7QUFDbEQsd0RBQXFDO0FBRXJDLE1BQXFCLFFBQVMsU0FBUSwwQkFBZTtJQUNuRCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQWdCO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3RSxNQUFNLEVBQUUsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQ0FBZSxDQUFDO1lBQ2pDLGFBQWEsRUFBRSx5Q0FBb0IsQ0FBQyxTQUFTLENBQzNDLHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ25FO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsc0NBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRTNGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQVEsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztTQUM1RDtRQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQXhCRCwyQkF3QkMifQ==
@@ -1,26 +0,0 @@
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 context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
8
- const id_1 = __importDefault(require("../../utils/id"));
9
- const query_string_1 = __importDefault(require("../../utils/query-string"));
10
- const relation_route_1 = __importDefault(require("../relation-route"));
11
- class ListRelatedRoute extends relation_route_1.default {
12
- setupRoutes(router) {
13
- router.get(`/${this.collection.name}/:parentId/relationships/${this.relationName}`, this.handleListRelated.bind(this));
14
- }
15
- async handleListRelated(context) {
16
- await this.services.permissions.can(context, `browse:${this.collection.name}`);
17
- const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
18
- const scope = await this.services.permissions.getScope(this.foreignCollection, context);
19
- const paginatedFilter = context_filter_factory_1.default.buildPaginated(this.foreignCollection, context, scope);
20
- const projection = query_string_1.default.parseProjectionWithPks(this.foreignCollection, context);
21
- const records = await datasource_toolkit_1.CollectionUtils.listRelation(this.collection, parentId, this.relationName, paginatedFilter, projection);
22
- context.response.body = this.services.serializer.serializeWithSearchMetadata(this.foreignCollection, records, paginatedFilter.search);
23
- }
24
- }
25
- exports.default = ListRelatedRoute;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZWxhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3JvdXRlcy9hY2Nlc3MvbGlzdC1yZWxhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBQWtFO0FBSWxFLGdHQUFzRTtBQUN0RSx3REFBcUM7QUFDckMsNEVBQXlEO0FBQ3pELHVFQUE4QztBQUU5QyxNQUFxQixnQkFBaUIsU0FBUSx3QkFBYTtJQUN6RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLDRCQUE0QixJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2xDLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQWdCO1FBQzdDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvRSxNQUFNLFFBQVEsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sZUFBZSxHQUFHLGdDQUFvQixDQUFDLGNBQWMsQ0FDekQsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixPQUFPLEVBQ1AsS0FBSyxDQUNOLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxzQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFN0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxvQ0FBZSxDQUFDLFlBQVksQ0FDaEQsSUFBSSxDQUFDLFVBQVUsRUFDZixRQUFRLEVBQ1IsSUFBSSxDQUFDLFlBQVksRUFDakIsZUFBZSxFQUNmLFVBQVUsQ0FDWCxDQUFDO1FBRUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQzFFLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsT0FBTyxFQUNQLGVBQWUsQ0FBQyxNQUFNLENBQ3ZCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuQ0QsbUNBbUNDIn0=
@@ -1,23 +0,0 @@
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 collection_route_1 = __importDefault(require("../collection-route"));
7
- const context_filter_factory_1 = __importDefault(require("../../utils/context-filter-factory"));
8
- const query_string_1 = __importDefault(require("../../utils/query-string"));
9
- class ListRoute extends collection_route_1.default {
10
- setupRoutes(router) {
11
- router.get(`/${this.collection.name}`, this.handleList.bind(this));
12
- }
13
- async handleList(context) {
14
- await this.services.permissions.can(context, `browse:${this.collection.name}`);
15
- const scope = await this.services.permissions.getScope(this.collection, context);
16
- const paginatedFilter = context_filter_factory_1.default.buildPaginated(this.collection, context, scope);
17
- const projection = query_string_1.default.parseProjectionWithPks(this.collection, context);
18
- const records = await this.collection.list(paginatedFilter, projection);
19
- context.response.body = this.services.serializer.serializeWithSearchMetadata(this.collection, records, paginatedFilter.search);
20
- }
21
- }
22
- exports.default = ListRoute;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC9yb3V0ZXMvYWNjZXNzL2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSwyRUFBa0Q7QUFDbEQsZ0dBQXNFO0FBQ3RFLDRFQUF5RDtBQUV6RCxNQUFxQixTQUFVLFNBQVEsMEJBQWU7SUFDcEQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFnQjtRQUN0QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRixNQUFNLGVBQWUsR0FBRyxnQ0FBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0YsTUFBTSxVQUFVLEdBQUcsc0JBQWlCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQywyQkFBMkIsQ0FDMUUsSUFBSSxDQUFDLFVBQVUsRUFDZixPQUFPLEVBQ1AsZUFBZSxDQUFDLE1BQU0sQ0FDdkIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWxCRCw0QkFrQkMifQ==
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class BaseRoute {
4
- constructor(services, options) {
5
- this.services = services;
6
- this.options = options;
7
- }
8
- async bootstrap() {
9
- // Do nothing by default
10
- }
11
- async tearDown() {
12
- // Do nothing by default
13
- }
14
- }
15
- exports.default = BaseRoute;
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZ2VudC9yb3V0ZXMvYmFzZS1yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLE1BQThCLFNBQVM7SUFNckMsWUFBWSxRQUF1QyxFQUFFLE9BQWlDO1FBQ3BGLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLHdCQUF3QjtJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWix3QkFBd0I7SUFDMUIsQ0FBQztDQUdGO0FBcEJELDRCQW9CQyJ9
@@ -1,90 +0,0 @@
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.RELATED_RELATION_ROUTES_CTOR = exports.RELATED_ROUTES_CTOR = exports.COLLECTION_ROUTES_CTOR = exports.ROOT_ROUTES_CTOR = void 0;
7
- const action_1 = __importDefault(require("./modification/action"));
8
- const associate_related_1 = __importDefault(require("./modification/associate-related"));
9
- const authentication_1 = __importDefault(require("./security/authentication"));
10
- const chart_1 = __importDefault(require("./access/chart"));
11
- const count_1 = __importDefault(require("./access/count"));
12
- const count_related_1 = __importDefault(require("./access/count-related"));
13
- const create_1 = __importDefault(require("./modification/create"));
14
- const csv_1 = __importDefault(require("./access/csv"));
15
- const csv_related_1 = __importDefault(require("./access/csv-related"));
16
- const delete_1 = __importDefault(require("./modification/delete"));
17
- const dissociate_delete_related_1 = __importDefault(require("./modification/dissociate-delete-related"));
18
- const error_handling_1 = __importDefault(require("./system/error-handling"));
19
- const get_1 = __importDefault(require("./access/get"));
20
- const healthcheck_1 = __importDefault(require("./system/healthcheck"));
21
- const ip_whitelist_1 = __importDefault(require("./security/ip-whitelist"));
22
- const list_1 = __importDefault(require("./access/list"));
23
- const list_related_1 = __importDefault(require("./access/list-related"));
24
- const logger_1 = __importDefault(require("./system/logger"));
25
- const scope_invalidation_1 = __importDefault(require("./security/scope-invalidation"));
26
- const update_1 = __importDefault(require("./modification/update"));
27
- const update_relation_1 = __importDefault(require("./modification/update-relation"));
28
- exports.ROOT_ROUTES_CTOR = [
29
- authentication_1.default,
30
- error_handling_1.default,
31
- healthcheck_1.default,
32
- ip_whitelist_1.default,
33
- logger_1.default,
34
- scope_invalidation_1.default,
35
- ];
36
- exports.COLLECTION_ROUTES_CTOR = [chart_1.default, count_1.default, create_1.default, csv_1.default, delete_1.default, get_1.default, list_1.default, update_1.default];
37
- exports.RELATED_ROUTES_CTOR = [
38
- associate_related_1.default,
39
- count_related_1.default,
40
- csv_related_1.default,
41
- dissociate_delete_related_1.default,
42
- list_related_1.default,
43
- ];
44
- exports.RELATED_RELATION_ROUTES_CTOR = [update_relation_1.default];
45
- function getRootRoutes(options, services) {
46
- return exports.ROOT_ROUTES_CTOR.map(Route => new Route(services, options));
47
- }
48
- function getCrudRoutes(dataSource, options, services) {
49
- const routes = [];
50
- dataSource.collections.forEach(collection => {
51
- routes.push(...exports.COLLECTION_ROUTES_CTOR.map(Route => new Route(services, options, dataSource, collection.name)));
52
- });
53
- return routes;
54
- }
55
- function getRelatedRoutes(dataSource, options, services) {
56
- const routes = [];
57
- const routesToBuild = [
58
- { list: exports.RELATED_ROUTES_CTOR, relations: ['ManyToMany', 'OneToMany'] },
59
- { list: exports.RELATED_RELATION_ROUTES_CTOR, relations: ['OneToOne', 'ManyToOne'] },
60
- ];
61
- dataSource.collections.forEach(collection => {
62
- routesToBuild.forEach(route => {
63
- const fields = Object.entries(collection.schema.fields);
64
- const relationFields = fields.filter(([, schema]) => route.relations.includes(schema.type));
65
- relationFields.forEach(([relationName]) => {
66
- routes.push(...route.list.map(Route => new Route(services, options, dataSource, collection.name, relationName)));
67
- });
68
- });
69
- });
70
- return routes;
71
- }
72
- function getActionRoutes(dataSource, options, services) {
73
- const routes = [];
74
- for (const collection of dataSource.collections)
75
- for (const actionName of Object.keys(collection.schema.actions))
76
- routes.push(new action_1.default(services, options, dataSource, collection.name, actionName));
77
- return routes;
78
- }
79
- function makeRoutes(dataSource, options, services) {
80
- const routes = [
81
- ...getRootRoutes(options, services),
82
- ...getCrudRoutes(dataSource, options, services),
83
- ...getRelatedRoutes(dataSource, options, services),
84
- ...getActionRoutes(dataSource, options, services),
85
- ];
86
- // Ensure routes and middlewares are loaded in the right order.
87
- return routes.sort((a, b) => a.type - b.type);
88
- }
89
- exports.default = makeRoutes;
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWdlbnQvcm91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBLG1FQUFnRDtBQUNoRCx5RkFBZ0U7QUFDaEUsK0VBQXVEO0FBRXZELDJEQUFtQztBQUNuQywyREFBbUM7QUFDbkMsMkVBQWtEO0FBQ2xELG1FQUEyQztBQUMzQyx1REFBK0I7QUFDL0IsdUVBQThDO0FBQzlDLG1FQUEyQztBQUMzQyx5R0FBK0U7QUFDL0UsNkVBQW9EO0FBQ3BELHVEQUErQjtBQUMvQix1RUFBK0M7QUFDL0MsMkVBQWtEO0FBQ2xELHlEQUFpQztBQUNqQyx5RUFBZ0Q7QUFDaEQsNkRBQXFDO0FBQ3JDLHVGQUE4RDtBQUM5RCxtRUFBMkM7QUFDM0MscUZBQTREO0FBRS9DLFFBQUEsZ0JBQWdCLEdBQUc7SUFDOUIsd0JBQWM7SUFDZCx3QkFBYTtJQUNiLHFCQUFXO0lBQ1gsc0JBQVc7SUFDWCxnQkFBTTtJQUNOLDRCQUFpQjtDQUNsQixDQUFDO0FBQ1csUUFBQSxzQkFBc0IsR0FBRyxDQUFDLGVBQUssRUFBRSxlQUFLLEVBQUUsZ0JBQU0sRUFBRSxhQUFHLEVBQUUsZ0JBQU0sRUFBRSxhQUFHLEVBQUUsY0FBSSxFQUFFLGdCQUFNLENBQUMsQ0FBQztBQUNoRixRQUFBLG1CQUFtQixHQUFHO0lBQ2pDLDJCQUFnQjtJQUNoQix1QkFBWTtJQUNaLHFCQUFVO0lBQ1YsbUNBQXVCO0lBQ3ZCLHNCQUFXO0NBQ1osQ0FBQztBQUNXLFFBQUEsNEJBQTRCLEdBQUcsQ0FBQyx5QkFBYyxDQUFDLENBQUM7QUFFN0QsU0FBUyxhQUFhLENBQUMsT0FBZ0IsRUFBRSxRQUFrQjtJQUN6RCxPQUFPLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFF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