@forestadmin/agent 1.0.0-alpha.1

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 (119) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +0 -0
  3. package/dist/agent.d.ts +76 -0
  4. package/dist/agent.js +133 -0
  5. package/dist/framework-mounter.d.ts +43 -0
  6. package/dist/framework-mounter.js +157 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.js +15 -0
  9. package/dist/routes/access/api-chart.d.ts +16 -0
  10. package/dist/routes/access/api-chart.js +47 -0
  11. package/dist/routes/access/chart.d.ts +18 -0
  12. package/dist/routes/access/chart.js +162 -0
  13. package/dist/routes/access/count-related.d.ts +9 -0
  14. package/dist/routes/access/count-related.js +31 -0
  15. package/dist/routes/access/count.d.ts +9 -0
  16. package/dist/routes/access/count.js +31 -0
  17. package/dist/routes/access/csv-related.d.ts +9 -0
  18. package/dist/routes/access/csv-related.js +33 -0
  19. package/dist/routes/access/csv.d.ts +9 -0
  20. package/dist/routes/access/csv.js +31 -0
  21. package/dist/routes/access/get.d.ts +9 -0
  22. package/dist/routes/access/get.js +29 -0
  23. package/dist/routes/access/list-related.d.ts +9 -0
  24. package/dist/routes/access/list-related.js +25 -0
  25. package/dist/routes/access/list.d.ts +9 -0
  26. package/dist/routes/access/list.js +22 -0
  27. package/dist/routes/base-route.d.ts +13 -0
  28. package/dist/routes/base-route.js +13 -0
  29. package/dist/routes/collection-route.d.ts +12 -0
  30. package/dist/routes/collection-route.js +20 -0
  31. package/dist/routes/index.d.ts +30 -0
  32. package/dist/routes/index.js +108 -0
  33. package/dist/routes/modification/action.d.ts +16 -0
  34. package/dist/routes/modification/action.js +104 -0
  35. package/dist/routes/modification/associate-related.d.ts +12 -0
  36. package/dist/routes/modification/associate-related.js +51 -0
  37. package/dist/routes/modification/create.d.ts +14 -0
  38. package/dist/routes/modification/create.js +83 -0
  39. package/dist/routes/modification/delete.d.ts +11 -0
  40. package/dist/routes/modification/delete.js +41 -0
  41. package/dist/routes/modification/dissociate-delete-related.d.ts +20 -0
  42. package/dist/routes/modification/dissociate-delete-related.js +89 -0
  43. package/dist/routes/modification/update-field.d.ts +9 -0
  44. package/dist/routes/modification/update-field.js +39 -0
  45. package/dist/routes/modification/update-relation.d.ts +11 -0
  46. package/dist/routes/modification/update-relation.js +59 -0
  47. package/dist/routes/modification/update.d.ts +9 -0
  48. package/dist/routes/modification/update.js +31 -0
  49. package/dist/routes/relation-route.d.ts +10 -0
  50. package/dist/routes/relation-route.js +18 -0
  51. package/dist/routes/security/authentication.d.ts +15 -0
  52. package/dist/routes/security/authentication.js +74 -0
  53. package/dist/routes/security/ip-whitelist.d.ts +14 -0
  54. package/dist/routes/security/ip-whitelist.js +35 -0
  55. package/dist/routes/security/scope-invalidation.d.ts +11 -0
  56. package/dist/routes/security/scope-invalidation.js +28 -0
  57. package/dist/routes/system/error-handling.d.ts +13 -0
  58. package/dist/routes/system/error-handling.js +75 -0
  59. package/dist/routes/system/healthcheck.d.ts +11 -0
  60. package/dist/routes/system/healthcheck.js +22 -0
  61. package/dist/routes/system/logger.d.ts +10 -0
  62. package/dist/routes/system/logger.js +35 -0
  63. package/dist/services/authorization/authorization.d.ts +15 -0
  64. package/dist/services/authorization/authorization.js +45 -0
  65. package/dist/services/authorization/index.d.ts +5 -0
  66. package/dist/services/authorization/index.js +16 -0
  67. package/dist/services/authorization/internal/action-permission.d.ts +16 -0
  68. package/dist/services/authorization/internal/action-permission.js +68 -0
  69. package/dist/services/authorization/internal/generate-action-identifier.d.ts +4 -0
  70. package/dist/services/authorization/internal/generate-action-identifier.js +12 -0
  71. package/dist/services/authorization/internal/generate-actions-from-permissions.d.ts +8 -0
  72. package/dist/services/authorization/internal/generate-actions-from-permissions.js +87 -0
  73. package/dist/services/authorization/internal/types.d.ts +61 -0
  74. package/dist/services/authorization/internal/types.js +26 -0
  75. package/dist/services/index.d.ts +12 -0
  76. package/dist/services/index.js +16 -0
  77. package/dist/services/permissions.d.ts +19 -0
  78. package/dist/services/permissions.js +85 -0
  79. package/dist/services/serializer.d.ts +12 -0
  80. package/dist/services/serializer.js +120 -0
  81. package/dist/types.d.ts +41 -0
  82. package/dist/types.js +23 -0
  83. package/dist/utils/body-parser.d.ts +7 -0
  84. package/dist/utils/body-parser.js +18 -0
  85. package/dist/utils/condition-tree-parser.d.ts +11 -0
  86. package/dist/utils/condition-tree-parser.js +53 -0
  87. package/dist/utils/context-filter-factory.d.ts +7 -0
  88. package/dist/utils/context-filter-factory.js +28 -0
  89. package/dist/utils/csv-generator.d.ts +12 -0
  90. package/dist/utils/csv-generator.js +39 -0
  91. package/dist/utils/csv-route-context.d.ts +5 -0
  92. package/dist/utils/csv-route-context.js +14 -0
  93. package/dist/utils/forest-http-api.d.ts +68 -0
  94. package/dist/utils/forest-http-api.js +202 -0
  95. package/dist/utils/forest-schema/action-values.d.ts +34 -0
  96. package/dist/utils/forest-schema/action-values.js +144 -0
  97. package/dist/utils/forest-schema/emitter.d.ts +20 -0
  98. package/dist/utils/forest-schema/emitter.js +70 -0
  99. package/dist/utils/forest-schema/filterable.d.ts +16 -0
  100. package/dist/utils/forest-schema/filterable.js +68 -0
  101. package/dist/utils/forest-schema/generator-actions.d.ts +14 -0
  102. package/dist/utils/forest-schema/generator-actions.js +99 -0
  103. package/dist/utils/forest-schema/generator-collection.d.ts +7 -0
  104. package/dist/utils/forest-schema/generator-collection.js +36 -0
  105. package/dist/utils/forest-schema/generator-fields.d.ts +14 -0
  106. package/dist/utils/forest-schema/generator-fields.js +160 -0
  107. package/dist/utils/forest-schema/generator-segments.d.ts +6 -0
  108. package/dist/utils/forest-schema/generator-segments.js +9 -0
  109. package/dist/utils/forest-schema/types.d.ts +85 -0
  110. package/dist/utils/forest-schema/types.js +16 -0
  111. package/dist/utils/forest-schema/validation.d.ts +10 -0
  112. package/dist/utils/forest-schema/validation.js +28 -0
  113. package/dist/utils/id.d.ts +8 -0
  114. package/dist/utils/id.js +43 -0
  115. package/dist/utils/options-validator.d.ts +12 -0
  116. package/dist/utils/options-validator.js +92 -0
  117. package/dist/utils/query-string.d.ts +14 -0
  118. package/dist/utils/query-string.js +134 -0
  119. package/package.json +66 -0
@@ -0,0 +1,162 @@
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
+ const query_string_1 = __importDefault(require("../../utils/query-string"));
12
+ var ChartType;
13
+ (function (ChartType) {
14
+ ChartType["Value"] = "Value";
15
+ ChartType["Objective"] = "Objective";
16
+ ChartType["Pie"] = "Pie";
17
+ ChartType["Line"] = "Line";
18
+ ChartType["Leaderboard"] = "Leaderboard";
19
+ })(ChartType || (ChartType = {}));
20
+ class Chart extends collection_route_1.default {
21
+ setupRoutes(router) {
22
+ router.post(`/stats/${this.collection.name}`, this.handleChart.bind(this));
23
+ }
24
+ async handleChart(context) {
25
+ await this.services.permissions.canChart(context);
26
+ context.response.body = {
27
+ data: {
28
+ id: (0, uuid_1.v1)(),
29
+ type: 'stats',
30
+ attributes: { value: await this.makeChart(context) },
31
+ },
32
+ };
33
+ }
34
+ async makeChart(context) {
35
+ const { body } = context.request;
36
+ switch (body.type) {
37
+ case ChartType.Value:
38
+ return this.makeValueChart(context);
39
+ case ChartType.Leaderboard:
40
+ return this.makeLeaderboardChart(context);
41
+ case ChartType.Objective:
42
+ return this.makeObjectiveChart(context);
43
+ case ChartType.Pie:
44
+ return this.makePieChart(context);
45
+ case ChartType.Line:
46
+ return this.makeLineChart(context);
47
+ default:
48
+ throw new datasource_toolkit_1.ValidationError(`Invalid Chart type "${body.type}"`);
49
+ }
50
+ }
51
+ async makeValueChart(context) {
52
+ const caller = query_string_1.default.parseCaller(context);
53
+ const currentFilter = await this.getFilter(context);
54
+ const result = {
55
+ countCurrent: await this.computeValue(context, currentFilter),
56
+ countPrevious: undefined,
57
+ };
58
+ const isAndAggregator = currentFilter.conditionTree?.aggregator === 'And';
59
+ const withCountPrevious = currentFilter.conditionTree?.someLeaf(leaf => leaf.useIntervalOperator);
60
+ if (withCountPrevious && !isAndAggregator) {
61
+ result.countPrevious = await this.computeValue(context, datasource_toolkit_1.FilterFactory.getPreviousPeriodFilter(currentFilter, caller.timezone));
62
+ }
63
+ return result;
64
+ }
65
+ async makeObjectiveChart(context) {
66
+ return { value: await this.computeValue(context, await this.getFilter(context)) };
67
+ }
68
+ async makePieChart(context) {
69
+ const { group_by_field: groupByField, aggregate, aggregate_field: aggregateField, } = context.request.body;
70
+ const rows = await this.collection.aggregate(query_string_1.default.parseCaller(context), await this.getFilter(context), new datasource_toolkit_1.Aggregation({
71
+ operation: aggregate,
72
+ field: aggregateField,
73
+ groups: [{ field: groupByField }],
74
+ }));
75
+ return rows.map(row => ({
76
+ key: row.group[groupByField],
77
+ value: row.value,
78
+ }));
79
+ }
80
+ async makeLineChart(context) {
81
+ const { aggregate, aggregate_field: aggregateField, group_by_date_field: groupByDateField, time_range: timeRange, } = context.request.body;
82
+ const rows = await this.collection.aggregate(query_string_1.default.parseCaller(context), await this.getFilter(context), new datasource_toolkit_1.Aggregation({
83
+ operation: aggregate,
84
+ field: aggregateField,
85
+ groups: [{ field: groupByDateField, operation: timeRange }],
86
+ }));
87
+ const values = {};
88
+ rows.forEach(row => {
89
+ values[luxon_1.DateTime.fromISO(row.group[groupByDateField]).toISODate()] = Number(row.value);
90
+ });
91
+ const dates = Object.keys(values).sort((dateA, dateB) => dateA.localeCompare(dateB));
92
+ const last = luxon_1.DateTime.fromISO(dates[dates.length - 1]);
93
+ const dataPoints = [];
94
+ const format = Chart.formats[timeRange];
95
+ for (let current = luxon_1.DateTime.fromISO(dates[0]); current <= last; current = current.plus({ [timeRange]: 1 })) {
96
+ const label = current.toFormat(format);
97
+ const value = values[current.toISODate()] ?? 0;
98
+ dataPoints.push({ label, values: { value } });
99
+ }
100
+ return dataPoints;
101
+ }
102
+ async makeLeaderboardChart(context) {
103
+ const { body } = context.request;
104
+ const field = this.collection.schema.fields[body.relationship_field];
105
+ let collection;
106
+ let filter;
107
+ let aggregation;
108
+ if (field?.type === 'OneToMany') {
109
+ const inverse = datasource_toolkit_1.CollectionUtils.getInverseRelation(this.collection, body.relationship_field);
110
+ if (inverse) {
111
+ collection = field.foreignCollection;
112
+ filter = (await this.getFilter(context)).nest(inverse);
113
+ aggregation = new datasource_toolkit_1.Aggregation({
114
+ operation: body.aggregate,
115
+ field: body.aggregate_field,
116
+ groups: [{ field: `${inverse}:${body.label_field}` }],
117
+ });
118
+ }
119
+ }
120
+ if (field?.type === 'ManyToMany') {
121
+ const origin = datasource_toolkit_1.CollectionUtils.getThroughOrigin(this.collection, body.relationship_field);
122
+ const target = datasource_toolkit_1.CollectionUtils.getThroughTarget(this.collection, body.relationship_field);
123
+ if (origin && target) {
124
+ collection = field.throughCollection;
125
+ filter = (await this.getFilter(context)).nest(origin);
126
+ aggregation = new datasource_toolkit_1.Aggregation({
127
+ operation: body.aggregate,
128
+ field: body.aggregate_field ? `${target}:${body.aggregate_field}` : null,
129
+ groups: [{ field: `${origin}:${body.label_field}` }],
130
+ });
131
+ }
132
+ }
133
+ if (collection && filter && aggregation) {
134
+ const rows = await this.dataSource
135
+ .getCollection(collection)
136
+ .aggregate(query_string_1.default.parseCaller(context), filter, aggregation, Number(body.limit));
137
+ return rows.map(row => ({
138
+ key: row.group[aggregation.groups[0].field],
139
+ value: row.value,
140
+ }));
141
+ }
142
+ throw new datasource_toolkit_1.ValidationError(`Failed to generate leaderboard chart: parameters do not match pre-requisites`);
143
+ }
144
+ async computeValue(context, filter) {
145
+ const { aggregate, aggregate_field: aggregateField } = context.request.body;
146
+ const aggregation = new datasource_toolkit_1.Aggregation({ operation: aggregate, field: aggregateField });
147
+ const rows = await this.collection.aggregate(query_string_1.default.parseCaller(context), filter, aggregation);
148
+ return rows.length ? rows[0].value : 0;
149
+ }
150
+ async getFilter(context) {
151
+ const scope = await this.services.permissions.getScope(this.collection, context);
152
+ return context_filter_factory_1.default.build(this.collection, context, scope);
153
+ }
154
+ }
155
+ exports.default = Chart;
156
+ Chart.formats = {
157
+ Day: 'dd/MM/yyyy',
158
+ Week: "'W'W-yyyy",
159
+ Month: 'MMM yy',
160
+ Year: 'yyyy',
161
+ };
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL2FjY2Vzcy9jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQVN5QztBQUV6QyxpQ0FBaUM7QUFDakMsK0JBQW9DO0FBR3BDLDJFQUFrRDtBQUNsRCxnR0FBc0U7QUFDdEUsNEVBQXlEO0FBRXpELElBQUssU0FNSjtBQU5ELFdBQUssU0FBUztJQUNaLDRCQUFlLENBQUE7SUFDZixvQ0FBdUIsQ0FBQTtJQUN2Qix3QkFBVyxDQUFBO0lBQ1gsMEJBQWEsQ0FBQTtJQUNiLHdDQUEyQixDQUFBO0FBQzdCLENBQUMsRUFOSSxTQUFTLEtBQVQsU0FBUyxRQU1iO0FBRUQsTUFBcUIsS0FBTSxTQUFRLDBCQUFlO0lBUWhELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBZ0I7UUFDaEMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUc7WUFDdEIsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSxJQUFBLFNBQU0sR0FBRTtnQkFDWixJQUFJLEVBQUUsT0FBTztnQkFDYixVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2FBQ3JEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQWdCO1FBQ3RDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FB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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 RelationRoute from '../relation-route';
5
+ export default class CountRelatedRoute extends RelationRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleCountRelated(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=count-related.d.ts.map
@@ -0,0 +1,31 @@
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 CountRelatedRoute extends relation_route_1.default {
12
+ setupRoutes(router) {
13
+ router.get(`/${this.collection.name}/:parentId/relationships/${this.relationName}/count`, this.handleCountRelated.bind(this));
14
+ }
15
+ async handleCountRelated(context) {
16
+ await this.services.authorization.assertCanBrowse(context, this.collection.name);
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
+ }
28
+ }
29
+ }
30
+ exports.default = CountRelatedRoute;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQtcmVsYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXMvYWNjZXNzL2NvdW50LXJlbGF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFBK0U7QUFJL0UsZ0dBQXNFO0FBQ3RFLHdEQUFxQztBQUNyQyw0RUFBeUQ7QUFDekQsdUVBQThDO0FBRTlDLE1BQXFCLGlCQUFrQixTQUFRLHdCQUFhO0lBQzFELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQ1IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksNEJBQTRCLElBQUksQ0FBQyxZQUFZLFFBQVEsRUFDN0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBZ0I7UUFDOUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUMzQyxNQUFNLFFBQVEsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hGLE1BQU0sTUFBTSxHQUFHLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxnQ0FBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sb0NBQWUsQ0FBQyxpQkFBaUIsQ0FDL0QsSUFBSSxDQUFDLFVBQVUsRUFDZixRQUFRLEVBQ1IsSUFBSSxDQUFDLFlBQVksRUFDakIsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLGdDQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDeEMsQ0FBQztZQUVGLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztDQUNGO0FBL0JELG9DQStCQyJ9
@@ -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 CountRoute extends CollectionRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleCount(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=count.d.ts.map
@@ -0,0 +1,31 @@
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
+ const query_string_1 = __importDefault(require("../../utils/query-string"));
10
+ class CountRoute extends collection_route_1.default {
11
+ setupRoutes(router) {
12
+ router.get(`/${this.collection.name}/count`, this.handleCount.bind(this));
13
+ }
14
+ async handleCount(context) {
15
+ await this.services.authorization.assertCanBrowse(context, this.collection.name);
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
+ }
28
+ }
29
+ }
30
+ exports.default = CountRoute;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL2FjY2Vzcy9jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUE4RDtBQUk5RCwyRUFBa0Q7QUFDbEQsZ0dBQXNFO0FBQ3RFLDRFQUF5RDtBQUV6RCxNQUFxQixVQUFXLFNBQVEsMEJBQWU7SUFDckQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFnQjtRQUN2QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sTUFBTSxHQUFHLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxnQ0FBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFM0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxnQ0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDdkYsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBRWpELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDbkM7YUFBTTtZQUNMLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0NBQ0Y7QUF0QkQsNkJBc0JDIn0=
@@ -0,0 +1,9 @@
1
+ /// <reference types="koa__router" />
2
+ import { Context } from 'koa';
3
+ import Router from '@koa/router';
4
+ import RelationRoute from '../relation-route';
5
+ export default class CsvRelatedRoute extends RelationRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleRelatedCsv(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=csv-related.d.ts.map
@@ -0,0 +1,33 @@
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.authorization.assertCanBrowse(context, this.collection.name);
20
+ await this.services.authorization.assertCanExport(context, 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 caller = query_string_1.default.parseCaller(context);
26
+ const filter = context_filter_factory_1.default.buildPaginated(this.foreignCollection, context, scope);
27
+ const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
28
+ const gen = csv_generator_1.default.generate(caller, projection, header, filter, this.foreignCollection, async (cal, fil, proj) => datasource_toolkit_1.CollectionUtils.listRelation(this.collection, parentId, this.relationName, cal, fil, proj));
29
+ context.response.body = stream_1.Readable.from(gen);
30
+ }
31
+ }
32
+ exports.default = CsvRelatedRoute;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LXJlbGF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL2FjY2Vzcy9jc3YtcmVsYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUt5QztBQUV6QyxtQ0FBa0M7QUFHbEMsZ0dBQXNFO0FBQ3RFLDhFQUFxRDtBQUNyRCxzRkFBNEQ7QUFDNUQsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUN6RCx1RUFBOEM7QUFFOUMsTUFBcUIsZUFBZ0IsU0FBUSx3QkFBYTtJQUN4RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLDRCQUE0QixJQUFJLENBQUMsWUFBWSxNQUFNLEVBQzNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWdCO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpGLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQStCLENBQUM7UUFDbkUsMkJBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkMsTUFBTSxVQUFVLEdBQUcsc0JBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEYsTUFBTSxNQUFNLEdBQUcsc0JBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLGdDQUFvQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNGLE1BQU0sUUFBUSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRixNQUFNLEdBQUcsR0FBRyx1QkFBWSxDQUFDLFFBQVEsQ0FDL0IsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsS0FBSyxFQUFFLEdBQVcsRUFBRSxHQUFvQixFQUFFLElBQWdCLEVBQUUsRUFBRSxDQUM1RCxvQ0FBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQzdGLENBQUM7UUFDRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxpQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFoQ0Qsa0NBZ0NDIn0=
@@ -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 CsvRoute extends CollectionRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleCsv(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1,31 @@
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.authorization.assertCanBrowse(context, this.collection.name);
18
+ await this.services.authorization.assertCanExport(context, 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 caller = query_string_1.default.parseCaller(context);
24
+ const filter = context_filter_factory_1.default.buildPaginated(this.collection, context, scope);
25
+ const list = this.collection.list.bind(this.collection);
26
+ const gen = csv_generator_1.default.generate(caller, projection, header, filter, this.collection, list);
27
+ context.response.body = stream_1.Readable.from(gen);
28
+ }
29
+ }
30
+ exports.default = CsvRoute;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9hY2Nlc3MvY3N2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EsbUNBQWtDO0FBRWxDLDJFQUFrRDtBQUNsRCxnR0FBc0U7QUFDdEUsOEVBQXFEO0FBQ3JELHNGQUE0RDtBQUM1RCw0RUFBeUQ7QUFFekQsTUFBcUIsUUFBUyxTQUFRLDBCQUFlO0lBQ25ELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBZ0I7UUFDOUIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakYsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakYsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBK0IsQ0FBQztRQUNuRSwyQkFBZSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2QyxNQUFNLFVBQVUsR0FBRyxzQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxnQ0FBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyx1QkFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxpQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFyQkQsMkJBcUJDIn0=
@@ -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 GetRoute extends CollectionRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleGet(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1,29 @@
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 GetRoute extends collection_route_1.default {
12
+ setupRoutes(router) {
13
+ router.get(`/${this.collection.name}/:id`, this.handleGet.bind(this));
14
+ }
15
+ async handleGet(context) {
16
+ await this.services.authorization.assertCanRead(context, this.collection.name);
17
+ const id = id_1.default.unpackId(this.collection.schema, context.params.id);
18
+ const filter = new datasource_toolkit_1.PaginatedFilter({
19
+ conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]), await this.services.permissions.getScope(this.collection, context)),
20
+ });
21
+ const records = await this.collection.list(query_string_1.default.parseCaller(context), filter, datasource_toolkit_1.ProjectionFactory.all(this.collection));
22
+ if (!records.length) {
23
+ context.throw(types_1.HttpCode.NotFound, 'Record does not exists');
24
+ }
25
+ context.response.body = this.services.serializer.serialize(this.collection, records[0]);
26
+ }
27
+ }
28
+ exports.default = GetRoute;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9hY2Nlc3MvZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBSXlDO0FBSXpDLHVDQUF1QztBQUN2QywyRUFBa0Q7QUFDbEQsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUV6RCxNQUFxQixRQUFTLFNBQVEsMEJBQWU7SUFDbkQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFnQjtRQUNyQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvRSxNQUFNLEVBQUUsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQ0FBZSxDQUFDO1lBQ2pDLGFBQWEsRUFBRSx5Q0FBb0IsQ0FBQyxTQUFTLENBQzNDLHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ25FO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDeEMsc0JBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUN0QyxNQUFNLEVBQ04sc0NBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdkMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQVEsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztTQUM1RDtRQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQTVCRCwyQkE0QkMifQ==
@@ -0,0 +1,9 @@
1
+ /// <reference types="koa__router" />
2
+ import { Context } from 'koa';
3
+ import Router from '@koa/router';
4
+ import RelationRoute from '../relation-route';
5
+ export default class ListRelatedRoute extends RelationRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleListRelated(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=list-related.d.ts.map
@@ -0,0 +1,25 @@
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.authorization.assertCanBrowse(context, 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 records = await datasource_toolkit_1.CollectionUtils.listRelation(this.collection, parentId, this.relationName, query_string_1.default.parseCaller(context), paginatedFilter, query_string_1.default.parseProjectionWithPks(this.foreignCollection, context));
21
+ context.response.body = this.services.serializer.serializeWithSearchMetadata(this.foreignCollection, records, paginatedFilter.search);
22
+ }
23
+ }
24
+ exports.default = ListRelatedRoute;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZWxhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9hY2Nlc3MvbGlzdC1yZWxhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBQWtFO0FBSWxFLGdHQUFzRTtBQUN0RSx3REFBcUM7QUFDckMsNEVBQXlEO0FBQ3pELHVFQUE4QztBQUU5QyxNQUFxQixnQkFBaUIsU0FBUSx3QkFBYTtJQUN6RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLDRCQUE0QixJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2xDLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQWdCO1FBQzdDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpGLE1BQU0sUUFBUSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEYsTUFBTSxlQUFlLEdBQUcsZ0NBQW9CLENBQUMsY0FBYyxDQUN6RCxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLE9BQU8sRUFDUCxLQUFLLENBQ04sQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLE1BQU0sb0NBQWUsQ0FBQyxZQUFZLENBQ2hELElBQUksQ0FBQyxVQUFVLEVBQ2YsUUFBUSxFQUNSLElBQUksQ0FBQyxZQUFZLEVBQ2pCLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFDdEMsZUFBZSxFQUNmLHNCQUFpQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FDMUUsQ0FBQztRQUVGLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUMxRSxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLE9BQU8sRUFDUCxlQUFlLENBQUMsTUFBTSxDQUN2QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbENELG1DQWtDQyJ9
@@ -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 ListRoute extends CollectionRoute {
6
+ setupRoutes(router: Router): void;
7
+ handleList(context: Context): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1,22 @@
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.authorization.assertCanBrowse(context, 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 records = await this.collection.list(query_string_1.default.parseCaller(context), paginatedFilter, query_string_1.default.parseProjectionWithPks(this.collection, context));
18
+ context.response.body = this.services.serializer.serializeWithSearchMetadata(this.collection, records, paginatedFilter.search);
19
+ }
20
+ }
21
+ exports.default = ListRoute;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXMvYWNjZXNzL2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSwyRUFBa0Q7QUFDbEQsZ0dBQXNFO0FBQ3RFLDRFQUF5RDtBQUV6RCxNQUFxQixTQUFVLFNBQVEsMEJBQWU7SUFDcEQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFnQjtRQUN0QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sZUFBZSxHQUFHLGdDQUFvQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU3RixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN4QyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQ3RDLGVBQWUsRUFDZixzQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUNuRSxDQUFDO1FBRUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQzFFLElBQUksQ0FBQyxVQUFVLEVBQ2YsT0FBTyxFQUNQLGVBQWUsQ0FBQyxNQUFNLENBQ3ZCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2QkQsNEJBdUJDIn0=
@@ -0,0 +1,13 @@
1
+ /// <reference types="koa__router" />
2
+ import Router from '@koa/router';
3
+ import { AgentOptionsWithDefaults, RouteType } from '../types';
4
+ import { ForestAdminHttpDriverServices } from '../services';
5
+ export default abstract class BaseRoute {
6
+ protected readonly services: ForestAdminHttpDriverServices;
7
+ protected readonly options: AgentOptionsWithDefaults;
8
+ abstract get type(): RouteType;
9
+ constructor(services: ForestAdminHttpDriverServices, options: AgentOptionsWithDefaults);
10
+ bootstrap(): Promise<void>;
11
+ abstract setupRoutes(router: Router): void;
12
+ }
13
+ //# sourceMappingURL=base-route.d.ts.map
@@ -0,0 +1,13 @@
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
+ }
12
+ exports.default = BaseRoute;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yb3V0ZXMvYmFzZS1yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLE1BQThCLFNBQVM7SUFNckMsWUFBWSxRQUF1QyxFQUFFLE9BQWlDO1FBQ3BGLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLHdCQUF3QjtJQUMxQixDQUFDO0NBR0Y7QUFoQkQsNEJBZ0JDIn0=
@@ -0,0 +1,12 @@
1
+ import { Collection, DataSource } from '@forestadmin/datasource-toolkit';
2
+ import { AgentOptionsWithDefaults, RouteType } from '../types';
3
+ import { ForestAdminHttpDriverServices } from '../services';
4
+ import BaseRoute from './base-route';
5
+ export default abstract class CollectionRoute extends BaseRoute {
6
+ type: RouteType;
7
+ private readonly collectionName;
8
+ protected readonly dataSource: DataSource;
9
+ protected get collection(): Collection;
10
+ constructor(services: ForestAdminHttpDriverServices, options: AgentOptionsWithDefaults, dataSource: DataSource, collectionName: string);
11
+ }
12
+ //# sourceMappingURL=collection-route.d.ts.map
@@ -0,0 +1,20 @@
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 types_1 = require("../types");
7
+ const base_route_1 = __importDefault(require("./base-route"));
8
+ class CollectionRoute extends base_route_1.default {
9
+ constructor(services, options, dataSource, collectionName) {
10
+ super(services, options);
11
+ this.type = types_1.RouteType.PrivateRoute;
12
+ this.collectionName = collectionName;
13
+ this.dataSource = dataSource;
14
+ }
15
+ get collection() {
16
+ return this.dataSource.getCollection(this.collectionName);
17
+ }
18
+ }
19
+ exports.default = CollectionRoute;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yb3V0ZXMvY29sbGVjdGlvbi1yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLG9DQUErRDtBQUUvRCw4REFBcUM7QUFFckMsTUFBOEIsZUFBZ0IsU0FBUSxvQkFBUztJQVU3RCxZQUNFLFFBQXVDLEVBQ3ZDLE9BQWlDLEVBQ2pDLFVBQXNCLEVBQ3RCLGNBQXNCO1FBRXRCLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFmM0IsU0FBSSxHQUFHLGlCQUFTLENBQUMsWUFBWSxDQUFDO1FBZ0I1QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBYkQsSUFBYyxVQUFVO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FZRjtBQXBCRCxrQ0FvQkMifQ==
@@ -0,0 +1,30 @@
1
+ import { DataSource } from '@forestadmin/datasource-toolkit';
2
+ import { AgentOptionsWithDefaults as Options } from '../types';
3
+ import { ForestAdminHttpDriverServices as Services } from '../services';
4
+ import AssociateRelated from './modification/associate-related';
5
+ import Authentication from './security/authentication';
6
+ import BaseRoute from './base-route';
7
+ import Chart from './access/chart';
8
+ import Count from './access/count';
9
+ import CountRelated from './access/count-related';
10
+ import Create from './modification/create';
11
+ import Csv from './access/csv';
12
+ import CsvRelated from './access/csv-related';
13
+ import Delete from './modification/delete';
14
+ import DissociateDeleteRelated from './modification/dissociate-delete-related';
15
+ import ErrorHandling from './system/error-handling';
16
+ import Get from './access/get';
17
+ import HealthCheck from './system/healthcheck';
18
+ import IpWhitelist from './security/ip-whitelist';
19
+ import List from './access/list';
20
+ import ListRelated from './access/list-related';
21
+ import Logger from './system/logger';
22
+ import ScopeInvalidation from './security/scope-invalidation';
23
+ import Update from './modification/update';
24
+ import UpdateRelation from './modification/update-relation';
25
+ export declare const ROOT_ROUTES_CTOR: (typeof Authentication | typeof ErrorHandling | typeof HealthCheck | typeof IpWhitelist | typeof Logger | typeof ScopeInvalidation)[];
26
+ export declare const COLLECTION_ROUTES_CTOR: (typeof Chart | typeof Count | typeof Create | typeof Csv | typeof Delete | typeof Get | typeof List | typeof Update)[];
27
+ export declare const RELATED_ROUTES_CTOR: (typeof AssociateRelated | typeof CountRelated | typeof CsvRelated | typeof DissociateDeleteRelated | typeof ListRelated)[];
28
+ export declare const RELATED_RELATION_ROUTES_CTOR: (typeof UpdateRelation)[];
29
+ export default function makeRoutes(dataSource: DataSource, options: Options, services: Services): BaseRoute[];
30
+ //# sourceMappingURL=index.d.ts.map