adminforth 1.3.54-next.3 → 1.3.54-next.31

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 (135) hide show
  1. package/dist/auth.js +42 -56
  2. package/dist/auth.js.map +1 -0
  3. package/dist/basePlugin.js +1 -0
  4. package/dist/basePlugin.js.map +1 -0
  5. package/dist/dataConnectors/baseConnector.js +108 -122
  6. package/dist/dataConnectors/baseConnector.js.map +1 -0
  7. package/dist/dataConnectors/clickhouse.js +132 -150
  8. package/dist/dataConnectors/clickhouse.js.map +1 -0
  9. package/dist/dataConnectors/mongo.js +75 -101
  10. package/dist/dataConnectors/mongo.js.map +1 -0
  11. package/dist/dataConnectors/postgres.js +124 -143
  12. package/dist/dataConnectors/postgres.js.map +1 -0
  13. package/dist/dataConnectors/sqlite.js +113 -130
  14. package/dist/dataConnectors/sqlite.js.map +1 -0
  15. package/dist/index.js +197 -217
  16. package/dist/index.js.map +1 -0
  17. package/dist/modules/codeInjector.js +480 -486
  18. package/dist/modules/codeInjector.js.map +1 -0
  19. package/dist/modules/configValidator.js +31 -22
  20. package/dist/modules/configValidator.js.map +1 -0
  21. package/dist/modules/operationalResource.js +50 -70
  22. package/dist/modules/operationalResource.js.map +1 -0
  23. package/dist/modules/restApi.js +104 -116
  24. package/dist/modules/restApi.js.map +1 -0
  25. package/dist/modules/styleGenerator.js +1 -0
  26. package/dist/modules/styleGenerator.js.map +1 -0
  27. package/dist/modules/styles.js +1 -0
  28. package/dist/modules/styles.js.map +1 -0
  29. package/dist/modules/utils.js +1 -0
  30. package/dist/modules/utils.js.map +1 -0
  31. package/dist/plugins/audit-log/types.js +2 -0
  32. package/dist/plugins/audit-log/types.js.map +1 -0
  33. package/dist/plugins/chat-gpt/types.js +2 -0
  34. package/dist/plugins/chat-gpt/types.js.map +1 -0
  35. package/dist/plugins/email-password-reset/types.js +2 -0
  36. package/dist/plugins/email-password-reset/types.js.map +1 -0
  37. package/dist/plugins/foreign-inline-list/types.js +2 -0
  38. package/dist/plugins/foreign-inline-list/types.js.map +1 -0
  39. package/dist/plugins/import-export/types.js +2 -0
  40. package/dist/plugins/import-export/types.js.map +1 -0
  41. package/dist/plugins/rich-editor/custom/async-queue.js +29 -0
  42. package/dist/plugins/rich-editor/custom/async-queue.js.map +1 -0
  43. package/dist/plugins/rich-editor/dist/async-queue.js +41 -0
  44. package/dist/plugins/rich-editor/dist/custom/async-queue.js +29 -0
  45. package/dist/plugins/rich-editor/dist/custom/async-queue.js.map +1 -0
  46. package/dist/plugins/rich-editor/types.js +16 -0
  47. package/dist/plugins/rich-editor/types.js.map +1 -0
  48. package/dist/plugins/two-factors-auth/types.js +2 -0
  49. package/dist/plugins/two-factors-auth/types.js.map +1 -0
  50. package/dist/plugins/upload/types.js +2 -0
  51. package/dist/plugins/upload/types.js.map +1 -0
  52. package/dist/servers/express.js +30 -42
  53. package/dist/servers/express.js.map +1 -0
  54. package/dist/types/AdminForthConfig.js +1 -0
  55. package/dist/types/AdminForthConfig.js.map +1 -0
  56. package/dist/types/FrontendAPI.js +1 -0
  57. package/dist/types/FrontendAPI.js.map +1 -0
  58. package/package.json +8 -5
  59. package/auth.ts +0 -140
  60. package/basePlugin.ts +0 -70
  61. package/dataConnectors/baseConnector.ts +0 -216
  62. package/dataConnectors/clickhouse.ts +0 -341
  63. package/dataConnectors/mongo.ts +0 -202
  64. package/dataConnectors/postgres.ts +0 -306
  65. package/dataConnectors/sqlite.ts +0 -254
  66. package/index.ts +0 -428
  67. package/modules/codeInjector.ts +0 -736
  68. package/modules/configValidator.ts +0 -571
  69. package/modules/operationalResource.ts +0 -98
  70. package/modules/restApi.ts +0 -718
  71. package/modules/styleGenerator.ts +0 -55
  72. package/modules/styles.ts +0 -126
  73. package/modules/utils.ts +0 -472
  74. package/servers/express.ts +0 -259
  75. package/spa/.eslintrc.cjs +0 -14
  76. package/spa/README.md +0 -39
  77. package/spa/env.d.ts +0 -1
  78. package/spa/index.html +0 -23
  79. package/spa/package-lock.json +0 -4573
  80. package/spa/package.json +0 -49
  81. package/spa/postcss.config.js +0 -6
  82. package/spa/public/assets/favicon.png +0 -0
  83. package/spa/src/App.vue +0 -418
  84. package/spa/src/assets/base.css +0 -2
  85. package/spa/src/assets/logo.svg +0 -19
  86. package/spa/src/components/AcceptModal.vue +0 -45
  87. package/spa/src/components/Breadcrumbs.vue +0 -41
  88. package/spa/src/components/BreadcrumbsWithButtons.vue +0 -26
  89. package/spa/src/components/CustomDatePicker.vue +0 -176
  90. package/spa/src/components/CustomDateRangePicker.vue +0 -218
  91. package/spa/src/components/CustomRangePicker.vue +0 -156
  92. package/spa/src/components/Dropdown.vue +0 -168
  93. package/spa/src/components/Filters.vue +0 -222
  94. package/spa/src/components/HelloWorld.vue +0 -17
  95. package/spa/src/components/MenuLink.vue +0 -27
  96. package/spa/src/components/ResourceForm.vue +0 -290
  97. package/spa/src/components/ResourceListTable.vue +0 -460
  98. package/spa/src/components/SingleSkeletLoader.vue +0 -13
  99. package/spa/src/components/SkeleteLoader.vue +0 -23
  100. package/spa/src/components/ThreeDotsMenu.vue +0 -43
  101. package/spa/src/components/Toast.vue +0 -78
  102. package/spa/src/components/ValueRenderer.vue +0 -114
  103. package/spa/src/components/icons/IconCalendar.vue +0 -5
  104. package/spa/src/components/icons/IconCommunity.vue +0 -7
  105. package/spa/src/components/icons/IconDocumentation.vue +0 -7
  106. package/spa/src/components/icons/IconEcosystem.vue +0 -7
  107. package/spa/src/components/icons/IconSupport.vue +0 -7
  108. package/spa/src/components/icons/IconTime.vue +0 -5
  109. package/spa/src/components/icons/IconTooling.vue +0 -19
  110. package/spa/src/composables/useFrontendApi.ts +0 -26
  111. package/spa/src/composables/useStores.ts +0 -131
  112. package/spa/src/index.scss +0 -31
  113. package/spa/src/main.ts +0 -18
  114. package/spa/src/router/index.ts +0 -59
  115. package/spa/src/spa_types/core.ts +0 -53
  116. package/spa/src/stores/core.ts +0 -148
  117. package/spa/src/stores/filters.ts +0 -27
  118. package/spa/src/stores/modal.ts +0 -48
  119. package/spa/src/stores/toast.ts +0 -31
  120. package/spa/src/stores/user.ts +0 -72
  121. package/spa/src/utils.ts +0 -149
  122. package/spa/src/views/CreateView.vue +0 -167
  123. package/spa/src/views/EditView.vue +0 -170
  124. package/spa/src/views/ListView.vue +0 -279
  125. package/spa/src/views/LoginView.vue +0 -192
  126. package/spa/src/views/ResourceParent.vue +0 -17
  127. package/spa/src/views/ShowView.vue +0 -186
  128. package/spa/tailwind.config.js +0 -17
  129. package/spa/tsconfig.app.json +0 -14
  130. package/spa/tsconfig.json +0 -11
  131. package/spa/tsconfig.node.json +0 -19
  132. package/spa/vite.config.ts +0 -56
  133. package/tsconfig.json +0 -112
  134. package/types/AdminForthConfig.ts +0 -1762
  135. package/types/FrontendAPI.ts +0 -143
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/AdminForthConfig.js';
11
2
  import AdminForthBaseConnector from './baseConnector.js';
12
3
  import dayjs from 'dayjs';
@@ -53,68 +44,66 @@ class ClickhouseConnector extends AdminForthBaseConnector {
53
44
  // }
54
45
  });
55
46
  }
56
- discoverFields(resource) {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- const tableName = resource.table;
59
- let rows;
60
- try {
61
- const q = yield this.client.query({
62
- query: `SELECT * FROM system.columns WHERE table = '${tableName}' and database = '${this.dbName}'`,
63
- format: 'JSONEachRow',
64
- });
65
- rows = yield q.json();
47
+ async discoverFields(resource) {
48
+ const tableName = resource.table;
49
+ let rows;
50
+ try {
51
+ const q = await this.client.query({
52
+ query: `SELECT * FROM system.columns WHERE table = '${tableName}' and database = '${this.dbName}'`,
53
+ format: 'JSONEachRow',
54
+ });
55
+ rows = await q.json();
56
+ }
57
+ catch (e) {
58
+ console.error(` 🛑Error connecting to datasource URL ${this.url}:`, e);
59
+ return null;
60
+ }
61
+ const fieldTypes = {};
62
+ rows.forEach((row) => {
63
+ const field = {};
64
+ const baseType = row.type;
65
+ if (baseType.startsWith('Int') || baseType.startsWith('UInt')) {
66
+ field.type = AdminForthDataTypes.INTEGER;
66
67
  }
67
- catch (e) {
68
- console.error(` 🛑Error connecting to datasource URL ${this.url}:`, e);
69
- return null;
68
+ else if (baseType === 'FixedString' || baseType === 'String') {
69
+ field.type = AdminForthDataTypes.STRING;
70
+ // TODO
71
+ // const length = baseType.match(/\d+/g);
72
+ // field.maxLength = length ? parseInt(length[0]) : null;
70
73
  }
71
- const fieldTypes = {};
72
- rows.forEach((row) => {
73
- const field = {};
74
- const baseType = row.type;
75
- if (baseType.startsWith('Int') || baseType.startsWith('UInt')) {
76
- field.type = AdminForthDataTypes.INTEGER;
77
- }
78
- else if (baseType === 'FixedString' || baseType === 'String') {
79
- field.type = AdminForthDataTypes.STRING;
80
- // TODO
81
- // const length = baseType.match(/\d+/g);
82
- // field.maxLength = length ? parseInt(length[0]) : null;
83
- }
84
- else if (baseType == 'UUID') {
85
- field.type = AdminForthDataTypes.STRING;
86
- }
87
- else if (baseType.startsWith('Decimal')) {
88
- field.type = AdminForthDataTypes.DECIMAL;
89
- const [precision, scale] = baseType.match(/\d+/g);
90
- field.precision = parseInt(precision);
91
- field.scale = parseInt(scale);
92
- }
93
- else if (baseType.startsWith('Float')) {
94
- field.type = AdminForthDataTypes.FLOAT;
95
- }
96
- else if (baseType == 'DateTime64' || baseType == 'DateTime') {
97
- field.type = AdminForthDataTypes.DATETIME;
98
- }
99
- else if (baseType == 'Date' || baseType == 'Date64') {
100
- field.type = AdminForthDataTypes.DATE;
101
- }
102
- else if (baseType == 'Boolean') {
103
- field.type = AdminForthDataTypes.BOOLEAN;
104
- field._underlineType = 'boolean';
105
- }
106
- else {
107
- field.type = 'unknown';
108
- }
109
- field._underlineType = baseType;
110
- field._baseTypeDebug = baseType;
111
- field.required = row.notnull == 1;
112
- field.primaryKey = row.pk == 1;
113
- field.default = row.dflt_value;
114
- fieldTypes[row.name] = field;
115
- });
116
- return fieldTypes;
74
+ else if (baseType == 'UUID') {
75
+ field.type = AdminForthDataTypes.STRING;
76
+ }
77
+ else if (baseType.startsWith('Decimal')) {
78
+ field.type = AdminForthDataTypes.DECIMAL;
79
+ const [precision, scale] = baseType.match(/\d+/g);
80
+ field.precision = parseInt(precision);
81
+ field.scale = parseInt(scale);
82
+ }
83
+ else if (baseType.startsWith('Float')) {
84
+ field.type = AdminForthDataTypes.FLOAT;
85
+ }
86
+ else if (baseType == 'DateTime64' || baseType == 'DateTime' || baseType.startsWith('DateTime64(')) {
87
+ field.type = AdminForthDataTypes.DATETIME;
88
+ }
89
+ else if (baseType == 'Date' || baseType == 'Date64') {
90
+ field.type = AdminForthDataTypes.DATE;
91
+ }
92
+ else if (baseType == 'Boolean' || baseType == 'Bool') {
93
+ field.type = AdminForthDataTypes.BOOLEAN;
94
+ field._underlineType = 'boolean';
95
+ }
96
+ else {
97
+ field.type = 'unknown';
98
+ }
99
+ field._underlineType = baseType;
100
+ field._baseTypeDebug = baseType;
101
+ field.required = row.notnull == 1;
102
+ field.primaryKey = row.pk == 1;
103
+ field.default = row.dflt_value;
104
+ fieldTypes[row.name] = field;
117
105
  });
106
+ return fieldTypes;
118
107
  }
119
108
  getFieldValue(field, value) {
120
109
  if (field.type == AdminForthDataTypes.DATETIME) {
@@ -145,7 +134,12 @@ class ClickhouseConnector extends AdminForthBaseConnector {
145
134
  }
146
135
  else if (field.type == AdminForthDataTypes.JSON) {
147
136
  if (field._underlineType.startsWith('String') || field._underlineType.startsWith('FixedString')) {
148
- return JSON.parse(value);
137
+ try {
138
+ return JSON.parse(value);
139
+ }
140
+ catch (e) {
141
+ return { 'error': `Failed to parse JSON: ${e.message}` };
142
+ }
149
143
  }
150
144
  else {
151
145
  console.error(`AdminForth: JSON field is not a string but ${field._underlineType}, this is not supported yet`);
@@ -215,101 +209,89 @@ class ClickhouseConnector extends AdminForthBaseConnector {
215
209
  }) : [];
216
210
  return params;
217
211
  }
218
- getDataWithOriginalTypes(_a) {
219
- return __awaiter(this, arguments, void 0, function* ({ resource, limit, offset, sort, filters }) {
220
- console.log('getDataWithOriginalTypes', resource, limit, offset, sort, filters);
221
- const columns = resource.dataSourceColumns.map((col) => col.name).join(', ');
222
- const tableName = resource.table;
223
- const where = this.whereClause(resource, filters);
224
- const params = this.whereParams(filters);
225
- const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `${s.field} ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
226
- const q = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} LIMIT {limit:Int} OFFSET {offset:Int}`;
227
- const d = Object.assign(Object.assign({}, params), { limit,
228
- offset });
229
- const stmt = yield this.client.query({
230
- query: q,
231
- format: 'JSONEachRow',
232
- query_params: d,
233
- });
234
- const rows = yield stmt.json();
235
- return rows.map((row) => {
236
- const newRow = {};
237
- for (const [key, value] of Object.entries(row)) {
238
- newRow[key] = value;
239
- }
240
- return newRow;
241
- });
212
+ async getDataWithOriginalTypes({ resource, limit, offset, sort, filters }) {
213
+ console.log('getDataWithOriginalTypes', resource, limit, offset, sort, filters);
214
+ const columns = resource.dataSourceColumns.map((col) => col.name).join(', ');
215
+ const tableName = resource.table;
216
+ const where = this.whereClause(resource, filters);
217
+ const params = this.whereParams(filters);
218
+ const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `${s.field} ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
219
+ const q = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} LIMIT {limit:Int} OFFSET {offset:Int}`;
220
+ const d = Object.assign(Object.assign({}, params), { limit,
221
+ offset });
222
+ const stmt = await this.client.query({
223
+ query: q,
224
+ format: 'JSONEachRow',
225
+ query_params: d,
242
226
  });
243
- }
244
- getCount(_a) {
245
- return __awaiter(this, arguments, void 0, function* ({ resource, filters, }) {
246
- const tableName = resource.table;
247
- const where = this.whereClause(resource, filters);
248
- const d = this.whereParams(filters);
249
- const countQ = yield this.client.query({
250
- query: `SELECT COUNT(*) FROM ${tableName} ${where}`,
251
- format: 'JSONEachRow',
252
- query_params: d,
253
- });
254
- const countResp = yield countQ.json();
255
- process.env.HEAVY_DEBUG && console.log('🪲🪲⏲️ Clickhouse COUNT', `SELECT COUNT(*) FROM ${tableName} ${where}`, d, 'resp', countResp);
256
- return countResp[0]['COUNT()'];
227
+ const rows = await stmt.json();
228
+ return rows.map((row) => {
229
+ const newRow = {};
230
+ for (const [key, value] of Object.entries(row)) {
231
+ newRow[key] = value;
232
+ }
233
+ return newRow;
257
234
  });
258
235
  }
259
- getMinMaxForColumnsWithOriginalTypes(_a) {
260
- return __awaiter(this, arguments, void 0, function* ({ resource, columns }) {
261
- const tableName = resource.table;
262
- const result = {};
263
- yield Promise.all(columns.map((col) => __awaiter(this, void 0, void 0, function* () {
264
- const stmt = yield this.client.query({
265
- query: `SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`,
266
- format: 'JSONEachRow',
267
- });
268
- const rows = yield stmt.json();
269
- result[col.name] = {
270
- min: rows[0].min,
271
- max: rows[0].max,
272
- };
273
- })));
274
- return result;
236
+ async getCount({ resource, filters, }) {
237
+ const tableName = resource.table;
238
+ const where = this.whereClause(resource, filters);
239
+ const d = this.whereParams(filters);
240
+ const countQ = await this.client.query({
241
+ query: `SELECT COUNT(*) as count FROM ${tableName} ${where}`,
242
+ format: 'JSONEachRow',
243
+ query_params: d,
275
244
  });
245
+ const countResp = await countQ.json();
246
+ return +countResp[0]['count'];
276
247
  }
277
- createRecordOriginalValues(_a) {
278
- return __awaiter(this, arguments, void 0, function* ({ resource, record }) {
279
- const tableName = resource.table;
280
- const columns = Object.keys(record);
281
- yield this.client.insert({
282
- database: this.dbName,
283
- table: tableName,
284
- columns: columns,
285
- values: [Object.values(record)],
248
+ async getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
249
+ const tableName = resource.table;
250
+ const result = {};
251
+ await Promise.all(columns.map(async (col) => {
252
+ const stmt = await this.client.query({
253
+ query: `SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`,
254
+ format: 'JSONEachRow',
286
255
  });
256
+ const rows = await stmt.json();
257
+ result[col.name] = {
258
+ min: rows[0].min,
259
+ max: rows[0].max,
260
+ };
261
+ }));
262
+ return result;
263
+ }
264
+ async createRecordOriginalValues({ resource, record }) {
265
+ const tableName = resource.table;
266
+ const columns = Object.keys(record);
267
+ await this.client.insert({
268
+ database: this.dbName,
269
+ table: tableName,
270
+ columns: columns,
271
+ values: [Object.values(record)],
287
272
  });
288
273
  }
289
- updateRecordOriginalValues(_a) {
290
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId, newValues }) {
291
- const columnsWithPlaceholders = Object.keys(newValues).map((col) => {
292
- return `${col} = {${col}:${resource.dataSourceColumns.find((c) => c.name == col)._underlineType}}`;
293
- });
294
- yield this.client.command({
295
- query: `ALTER TABLE ${this.dbName}.${resource.table} UPDATE ${columnsWithPlaceholders.join(', ')} WHERE ${this.getPrimaryKey(resource)} = {recordId:${resource.dataSourceColumns.find((c) => c.primaryKey)._underlineType}}`,
296
- query_params: Object.assign(Object.assign({}, newValues), { recordId }),
297
- });
274
+ async updateRecordOriginalValues({ resource, recordId, newValues }) {
275
+ const columnsWithPlaceholders = Object.keys(newValues).map((col) => {
276
+ return `${col} = {${col}:${resource.dataSourceColumns.find((c) => c.name == col)._underlineType}}`;
277
+ });
278
+ await this.client.command({
279
+ query: `ALTER TABLE ${this.dbName}.${resource.table} UPDATE ${columnsWithPlaceholders.join(', ')} WHERE ${this.getPrimaryKey(resource)} = {recordId:${resource.dataSourceColumns.find((c) => c.primaryKey)._underlineType}}`,
280
+ query_params: Object.assign(Object.assign({}, newValues), { recordId }),
298
281
  });
299
282
  }
300
- deleteRecord(_a) {
301
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId }) {
302
- const pkColumn = resource.dataSourceColumns.find((col) => col.primaryKey);
303
- const res = yield this.client.command({
304
- query: `ALTER TABLE ${this.dbName}.${resource.table} DELETE WHERE ${pkColumn.name} = {recordId:${pkColumn._underlineType}}`,
305
- query_params: { recordId },
306
- });
307
- // todo test what is in res
308
- return res;
283
+ async deleteRecord({ resource, recordId }) {
284
+ const pkColumn = resource.dataSourceColumns.find((col) => col.primaryKey);
285
+ const res = await this.client.command({
286
+ query: `ALTER TABLE ${this.dbName}.${resource.table} DELETE WHERE ${pkColumn.name} = {recordId:${pkColumn._underlineType}}`,
287
+ query_params: { recordId },
309
288
  });
289
+ // todo test what is in res
290
+ return res;
310
291
  }
311
292
  close() {
312
293
  this.client.disconnect();
313
294
  }
314
295
  }
315
296
  export default ClickhouseConnector;
297
+ //# sourceMappingURL=clickhouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../dataConnectors/clickhouse.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import dayjs from 'dayjs';
11
2
  import { MongoClient } from 'mongodb';
12
3
  import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/AdminForthConfig.js';
@@ -31,9 +22,9 @@ class MongoConnector extends AdminForthBaseConnector {
31
22
  [AdminForthSortDirections.desc]: -1,
32
23
  };
33
24
  this.db = new MongoClient(url);
34
- (() => __awaiter(this, void 0, void 0, function* () {
25
+ (async () => {
35
26
  try {
36
- yield this.db.connect();
27
+ await this.db.connect();
37
28
  this.db.on('error', (err) => {
38
29
  console.log('Mongo error: ', err.message);
39
30
  });
@@ -42,24 +33,22 @@ class MongoConnector extends AdminForthBaseConnector {
42
33
  catch (e) {
43
34
  console.error('ERROR: Failed to connect to Mongo', e);
44
35
  }
45
- }))();
36
+ })();
46
37
  }
47
- discoverFields(resource) {
48
- return __awaiter(this, void 0, void 0, function* () {
49
- return resource.columns.filter((col) => !col.virtual).reduce((acc, col) => {
50
- if (!col.type) {
51
- throw new Error(`Type is not defined for column ${col.name} in resource ${resource.table}`);
52
- }
53
- acc[col.name] = {
54
- name: col.name,
55
- type: col.type,
56
- primaryKey: col.primaryKey,
57
- virtual: col.virtual,
58
- _underlineType: col._underlineType,
59
- };
60
- return acc;
61
- }, {});
62
- });
38
+ async discoverFields(resource) {
39
+ return resource.columns.filter((col) => !col.virtual).reduce((acc, col) => {
40
+ if (!col.type) {
41
+ throw new Error(`Type is not defined for column ${col.name} in resource ${resource.table}`);
42
+ }
43
+ acc[col.name] = {
44
+ name: col.name,
45
+ type: col.type,
46
+ primaryKey: col.primaryKey,
47
+ virtual: col.virtual,
48
+ _underlineType: col._underlineType,
49
+ };
50
+ return acc;
51
+ }, {});
63
52
  }
64
53
  getPrimaryKey(resource) {
65
54
  for (const col of resource.dataSourceColumns) {
@@ -108,87 +97,72 @@ class MongoConnector extends AdminForthBaseConnector {
108
97
  }
109
98
  return value;
110
99
  }
111
- genQuery(_a) {
112
- return __awaiter(this, arguments, void 0, function* ({ filters }) {
113
- const query = {};
114
- for (const filter of filters) {
115
- query[filter.field] = this.OperatorsMap[filter.operator](filter.value);
116
- }
117
- return query;
118
- });
100
+ async genQuery({ filters }) {
101
+ const query = {};
102
+ for (const filter of filters) {
103
+ query[filter.field] = this.OperatorsMap[filter.operator](filter.value);
104
+ }
105
+ return query;
119
106
  }
120
- getDataWithOriginalTypes(_a) {
121
- return __awaiter(this, arguments, void 0, function* ({ resource, limit, offset, sort, filters }) {
122
- // const columns = resource.dataSourceColumns.filter(c=> !c.virtual).map((col) => col.name).join(', ');
123
- const tableName = resource.table;
124
- const collection = this.db.db().collection(tableName);
125
- const query = yield this.genQuery({ filters });
126
- const sortArray = sort.map((s) => {
127
- return [s.field, this.SortDirectionsMap[s.direction]];
128
- });
129
- const result = yield collection.find(query)
130
- .sort(sortArray)
131
- .skip(offset)
132
- .limit(limit)
133
- .toArray();
134
- return result;
107
+ async getDataWithOriginalTypes({ resource, limit, offset, sort, filters }) {
108
+ // const columns = resource.dataSourceColumns.filter(c=> !c.virtual).map((col) => col.name).join(', ');
109
+ const tableName = resource.table;
110
+ const collection = this.db.db().collection(tableName);
111
+ const query = await this.genQuery({ filters });
112
+ const sortArray = sort.map((s) => {
113
+ return [s.field, this.SortDirectionsMap[s.direction]];
135
114
  });
115
+ const result = await collection.find(query)
116
+ .sort(sortArray)
117
+ .skip(offset)
118
+ .limit(limit)
119
+ .toArray();
120
+ return result;
136
121
  }
137
- getCount(_a) {
138
- return __awaiter(this, arguments, void 0, function* ({ resource, filters }) {
139
- const collection = this.db.db().collection(resource.table);
140
- const query = {};
141
- for (const filter of filters) {
142
- query[filter.field] = this.OperatorsMap[filter.operator](filter.value);
143
- }
144
- return yield collection.countDocuments(query);
145
- });
122
+ async getCount({ resource, filters }) {
123
+ const collection = this.db.db().collection(resource.table);
124
+ const query = {};
125
+ for (const filter of filters) {
126
+ query[filter.field] = this.OperatorsMap[filter.operator](filter.value);
127
+ }
128
+ return await collection.countDocuments(query);
146
129
  }
147
- getMinMaxForColumnsWithOriginalTypes(_a) {
148
- return __awaiter(this, arguments, void 0, function* ({ resource, columns }) {
149
- const tableName = resource.table;
150
- const collection = this.db.db().collection(tableName);
151
- const result = {};
152
- for (const column of columns) {
153
- result[column] = yield collection
154
- .aggregate([
155
- { $group: { _id: null, min: { $min: `$${column}` }, max: { $max: `$${column}` } } },
156
- ])
157
- .toArray();
158
- }
159
- return result;
160
- });
130
+ async getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
131
+ const tableName = resource.table;
132
+ const collection = this.db.db().collection(tableName);
133
+ const result = {};
134
+ for (const column of columns) {
135
+ result[column] = await collection
136
+ .aggregate([
137
+ { $group: { _id: null, min: { $min: `$${column}` }, max: { $max: `$${column}` } } },
138
+ ])
139
+ .toArray();
140
+ }
141
+ return result;
161
142
  }
162
- createRecordOriginalValues(_a) {
163
- return __awaiter(this, arguments, void 0, function* ({ resource, record }) {
164
- const tableName = resource.table;
165
- const collection = this.db.db().collection(tableName);
166
- const columns = Object.keys(record);
167
- const newRecord = {};
168
- for (const colName of columns) {
169
- newRecord[colName] = record[colName];
170
- }
171
- yield collection.insertOne(newRecord);
172
- });
143
+ async createRecordOriginalValues({ resource, record }) {
144
+ const tableName = resource.table;
145
+ const collection = this.db.db().collection(tableName);
146
+ const columns = Object.keys(record);
147
+ const newRecord = {};
148
+ for (const colName of columns) {
149
+ newRecord[colName] = record[colName];
150
+ }
151
+ await collection.insertOne(newRecord);
173
152
  }
174
- updateRecordOriginalValues(_a) {
175
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId, newValues }) {
176
- const collection = this.db.db().collection(resource.table);
177
- yield collection.updateOne({ [this.getPrimaryKey(resource)]: recordId }, { $set: newValues });
178
- });
153
+ async updateRecordOriginalValues({ resource, recordId, newValues }) {
154
+ const collection = this.db.db().collection(resource.table);
155
+ await collection.updateOne({ [this.getPrimaryKey(resource)]: recordId }, { $set: newValues });
179
156
  }
180
- deleteRecord(_a) {
181
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId }) {
182
- const primaryKey = this.getPrimaryKey(resource);
183
- const collection = this.db.db().collection(resource.table);
184
- const res = yield collection.deleteOne({ [primaryKey]: recordId });
185
- return res.deletedCount > 0;
186
- });
157
+ async deleteRecord({ resource, recordId }) {
158
+ const primaryKey = this.getPrimaryKey(resource);
159
+ const collection = this.db.db().collection(resource.table);
160
+ const res = await collection.deleteOne({ [primaryKey]: recordId });
161
+ return res.deletedCount > 0;
187
162
  }
188
- close() {
189
- return __awaiter(this, void 0, void 0, function* () {
190
- yield this.db.close();
191
- });
163
+ async close() {
164
+ await this.db.close();
192
165
  }
193
166
  }
194
167
  export default MongoConnector;
168
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../dataConnectors/mongo.ts"],"names":[],"mappings":"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"}