adminforth 1.3.54-next.3 → 1.3.54-next.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.js +42 -56
- package/dist/auth.js.map +1 -0
- package/dist/basePlugin.js +1 -0
- package/dist/basePlugin.js.map +1 -0
- package/dist/dataConnectors/baseConnector.js +108 -122
- package/dist/dataConnectors/baseConnector.js.map +1 -0
- package/dist/dataConnectors/clickhouse.js +132 -150
- package/dist/dataConnectors/clickhouse.js.map +1 -0
- package/dist/dataConnectors/mongo.js +75 -101
- package/dist/dataConnectors/mongo.js.map +1 -0
- package/dist/dataConnectors/postgres.js +124 -143
- package/dist/dataConnectors/postgres.js.map +1 -0
- package/dist/dataConnectors/sqlite.js +113 -130
- package/dist/dataConnectors/sqlite.js.map +1 -0
- package/dist/index.js +197 -217
- package/dist/index.js.map +1 -0
- package/dist/modules/codeInjector.js +480 -486
- package/dist/modules/codeInjector.js.map +1 -0
- package/dist/modules/configValidator.js +31 -22
- package/dist/modules/configValidator.js.map +1 -0
- package/dist/modules/operationalResource.js +50 -70
- package/dist/modules/operationalResource.js.map +1 -0
- package/dist/modules/restApi.js +104 -116
- package/dist/modules/restApi.js.map +1 -0
- package/dist/modules/styleGenerator.js +1 -0
- package/dist/modules/styleGenerator.js.map +1 -0
- package/dist/modules/styles.js +1 -0
- package/dist/modules/styles.js.map +1 -0
- package/dist/modules/utils.js +1 -0
- package/dist/modules/utils.js.map +1 -0
- package/dist/plugins/audit-log/types.js +2 -0
- package/dist/plugins/audit-log/types.js.map +1 -0
- package/dist/plugins/chat-gpt/types.js +2 -0
- package/dist/plugins/chat-gpt/types.js.map +1 -0
- package/dist/plugins/email-password-reset/types.js +2 -0
- package/dist/plugins/email-password-reset/types.js.map +1 -0
- package/dist/plugins/foreign-inline-list/types.js +2 -0
- package/dist/plugins/foreign-inline-list/types.js.map +1 -0
- package/dist/plugins/import-export/types.js +2 -0
- package/dist/plugins/import-export/types.js.map +1 -0
- package/dist/plugins/rich-editor/custom/async-queue.js +29 -0
- package/dist/plugins/rich-editor/custom/async-queue.js.map +1 -0
- package/dist/plugins/rich-editor/dist/async-queue.js +41 -0
- package/dist/plugins/rich-editor/dist/custom/async-queue.js +29 -0
- package/dist/plugins/rich-editor/dist/custom/async-queue.js.map +1 -0
- package/dist/plugins/rich-editor/types.js +16 -0
- package/dist/plugins/rich-editor/types.js.map +1 -0
- package/dist/plugins/two-factors-auth/types.js +2 -0
- package/dist/plugins/two-factors-auth/types.js.map +1 -0
- package/dist/plugins/upload/types.js +2 -0
- package/dist/plugins/upload/types.js.map +1 -0
- package/dist/servers/express.js +30 -42
- package/dist/servers/express.js.map +1 -0
- package/dist/types/AdminForthConfig.js +1 -0
- package/dist/types/AdminForthConfig.js.map +1 -0
- package/dist/types/FrontendAPI.js +1 -0
- package/dist/types/FrontendAPI.js.map +1 -0
- package/package.json +7 -4
- package/auth.ts +0 -140
- package/basePlugin.ts +0 -70
- package/dataConnectors/baseConnector.ts +0 -216
- package/dataConnectors/clickhouse.ts +0 -341
- package/dataConnectors/mongo.ts +0 -202
- package/dataConnectors/postgres.ts +0 -306
- package/dataConnectors/sqlite.ts +0 -254
- package/index.ts +0 -428
- package/modules/codeInjector.ts +0 -736
- package/modules/configValidator.ts +0 -571
- package/modules/operationalResource.ts +0 -98
- package/modules/restApi.ts +0 -718
- package/modules/styleGenerator.ts +0 -55
- package/modules/styles.ts +0 -126
- package/modules/utils.ts +0 -472
- package/servers/express.ts +0 -259
- package/spa/.eslintrc.cjs +0 -14
- package/spa/README.md +0 -39
- package/spa/env.d.ts +0 -1
- package/spa/index.html +0 -23
- package/spa/package-lock.json +0 -4573
- package/spa/package.json +0 -49
- package/spa/postcss.config.js +0 -6
- package/spa/public/assets/favicon.png +0 -0
- package/spa/src/App.vue +0 -418
- package/spa/src/assets/base.css +0 -2
- package/spa/src/assets/logo.svg +0 -19
- package/spa/src/components/AcceptModal.vue +0 -45
- package/spa/src/components/Breadcrumbs.vue +0 -41
- package/spa/src/components/BreadcrumbsWithButtons.vue +0 -26
- package/spa/src/components/CustomDatePicker.vue +0 -176
- package/spa/src/components/CustomDateRangePicker.vue +0 -218
- package/spa/src/components/CustomRangePicker.vue +0 -156
- package/spa/src/components/Dropdown.vue +0 -168
- package/spa/src/components/Filters.vue +0 -222
- package/spa/src/components/HelloWorld.vue +0 -17
- package/spa/src/components/MenuLink.vue +0 -27
- package/spa/src/components/ResourceForm.vue +0 -290
- package/spa/src/components/ResourceListTable.vue +0 -460
- package/spa/src/components/SingleSkeletLoader.vue +0 -13
- package/spa/src/components/SkeleteLoader.vue +0 -23
- package/spa/src/components/ThreeDotsMenu.vue +0 -43
- package/spa/src/components/Toast.vue +0 -78
- package/spa/src/components/ValueRenderer.vue +0 -114
- package/spa/src/components/icons/IconCalendar.vue +0 -5
- package/spa/src/components/icons/IconCommunity.vue +0 -7
- package/spa/src/components/icons/IconDocumentation.vue +0 -7
- package/spa/src/components/icons/IconEcosystem.vue +0 -7
- package/spa/src/components/icons/IconSupport.vue +0 -7
- package/spa/src/components/icons/IconTime.vue +0 -5
- package/spa/src/components/icons/IconTooling.vue +0 -19
- package/spa/src/composables/useFrontendApi.ts +0 -26
- package/spa/src/composables/useStores.ts +0 -131
- package/spa/src/index.scss +0 -31
- package/spa/src/main.ts +0 -18
- package/spa/src/router/index.ts +0 -59
- package/spa/src/spa_types/core.ts +0 -53
- package/spa/src/stores/core.ts +0 -148
- package/spa/src/stores/filters.ts +0 -27
- package/spa/src/stores/modal.ts +0 -48
- package/spa/src/stores/toast.ts +0 -31
- package/spa/src/stores/user.ts +0 -72
- package/spa/src/utils.ts +0 -149
- package/spa/src/views/CreateView.vue +0 -167
- package/spa/src/views/EditView.vue +0 -170
- package/spa/src/views/ListView.vue +0 -279
- package/spa/src/views/LoginView.vue +0 -192
- package/spa/src/views/ResourceParent.vue +0 -17
- package/spa/src/views/ShowView.vue +0 -186
- package/spa/tailwind.config.js +0 -17
- package/spa/tsconfig.app.json +0 -14
- package/spa/tsconfig.json +0 -11
- package/spa/tsconfig.node.json +0 -19
- package/spa/vite.config.ts +0 -56
- package/tsconfig.json +0 -112
- package/types/AdminForthConfig.ts +0 -1762
- 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 dayjs from 'dayjs';
|
|
11
2
|
import pkg from 'pg';
|
|
12
3
|
import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/AdminForthConfig.js';
|
|
@@ -34,19 +25,18 @@ class PostgresConnector extends AdminForthBaseConnector {
|
|
|
34
25
|
this.db = new Client({
|
|
35
26
|
connectionString: url
|
|
36
27
|
});
|
|
37
|
-
(() =>
|
|
38
|
-
|
|
28
|
+
(async () => {
|
|
29
|
+
await this.db.connect();
|
|
39
30
|
this.db.on('error', (err) => {
|
|
40
31
|
console.log('Postgres error: ', err.message, err.stack);
|
|
41
32
|
this.db.end();
|
|
42
33
|
this.db = new PostgresConnector({ url }).db;
|
|
43
34
|
});
|
|
44
|
-
})
|
|
35
|
+
})();
|
|
45
36
|
}
|
|
46
|
-
discoverFields(resource) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const stmt = yield this.db.query(`
|
|
37
|
+
async discoverFields(resource) {
|
|
38
|
+
const tableName = resource.table;
|
|
39
|
+
const stmt = await this.db.query(`
|
|
50
40
|
SELECT
|
|
51
41
|
a.attname AS name,
|
|
52
42
|
pg_catalog.format_type(a.atttypid, a.atttypmod) AS type,
|
|
@@ -69,67 +59,66 @@ class PostgresConnector extends AdminForthBaseConnector {
|
|
|
69
59
|
ORDER BY
|
|
70
60
|
a.attnum;
|
|
71
61
|
`, [tableName]);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
return fieldTypes;
|
|
62
|
+
const rows = stmt.rows;
|
|
63
|
+
const fieldTypes = {};
|
|
64
|
+
rows.forEach((row) => {
|
|
65
|
+
const field = {};
|
|
66
|
+
const baseType = row.type.toLowerCase();
|
|
67
|
+
if (baseType == 'int') {
|
|
68
|
+
field.type = AdminForthDataTypes.INTEGER;
|
|
69
|
+
field._underlineType = 'int';
|
|
70
|
+
}
|
|
71
|
+
else if (baseType.includes('float') || baseType.includes('double')) {
|
|
72
|
+
field.type = AdminForthDataTypes.FLOAT;
|
|
73
|
+
field._underlineType = 'float';
|
|
74
|
+
}
|
|
75
|
+
else if (baseType.includes('bool')) {
|
|
76
|
+
field.type = AdminForthDataTypes.BOOLEAN;
|
|
77
|
+
field._underlineType = 'bool';
|
|
78
|
+
}
|
|
79
|
+
else if (baseType == 'uuid') {
|
|
80
|
+
field.type = AdminForthDataTypes.STRING;
|
|
81
|
+
field._underlineType = 'uuid';
|
|
82
|
+
}
|
|
83
|
+
else if (baseType.includes('character varying')) {
|
|
84
|
+
field.type = AdminForthDataTypes.STRING;
|
|
85
|
+
field._underlineType = 'varchar';
|
|
86
|
+
const length = baseType.match(/\d+/);
|
|
87
|
+
field.maxLength = length ? parseInt(length[0]) : null;
|
|
88
|
+
}
|
|
89
|
+
else if (baseType == 'text') {
|
|
90
|
+
field.type = AdminForthDataTypes.TEXT;
|
|
91
|
+
field._underlineType = 'text';
|
|
92
|
+
}
|
|
93
|
+
else if (baseType.includes('decimal(')) {
|
|
94
|
+
field.type = AdminForthDataTypes.DECIMAL;
|
|
95
|
+
field._underlineType = 'decimal';
|
|
96
|
+
const [precision, scale] = baseType.match(/\d+/g);
|
|
97
|
+
field.precision = parseInt(precision);
|
|
98
|
+
field.scale = parseInt(scale);
|
|
99
|
+
}
|
|
100
|
+
else if (baseType == 'real') {
|
|
101
|
+
field.type = AdminForthDataTypes.FLOAT;
|
|
102
|
+
field._underlineType = 'real';
|
|
103
|
+
}
|
|
104
|
+
else if (baseType == 'date') {
|
|
105
|
+
field.type = AdminForthDataTypes.DATE;
|
|
106
|
+
field._underlineType = 'timestamp';
|
|
107
|
+
}
|
|
108
|
+
else if (baseType.includes('date') || baseType.includes('time')) {
|
|
109
|
+
field.type = AdminForthDataTypes.DATETIME;
|
|
110
|
+
field._underlineType = 'timestamp';
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
field.type = 'unknown';
|
|
114
|
+
}
|
|
115
|
+
field._baseTypeDebug = baseType;
|
|
116
|
+
field.primaryKey = row.pk == 1;
|
|
117
|
+
field.default = row.dflt_value;
|
|
118
|
+
field.required = row.notnull && !row.dflt_value;
|
|
119
|
+
fieldTypes[row.name] = field;
|
|
132
120
|
});
|
|
121
|
+
return fieldTypes;
|
|
133
122
|
}
|
|
134
123
|
getFieldValue(field, value) {
|
|
135
124
|
if (field.type == AdminForthDataTypes.DATETIME) {
|
|
@@ -154,7 +143,12 @@ class PostgresConnector extends AdminForthBaseConnector {
|
|
|
154
143
|
}
|
|
155
144
|
if (field.type == AdminForthDataTypes.JSON) {
|
|
156
145
|
if (typeof value == 'string') {
|
|
157
|
-
|
|
146
|
+
try {
|
|
147
|
+
return JSON.parse(value);
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
return { 'error': `Failed to parse JSON: ${e.message}` };
|
|
151
|
+
}
|
|
158
152
|
}
|
|
159
153
|
else if (typeof value == 'object') {
|
|
160
154
|
return value;
|
|
@@ -226,80 +220,67 @@ class PostgresConnector extends AdminForthBaseConnector {
|
|
|
226
220
|
values: filterValues,
|
|
227
221
|
};
|
|
228
222
|
}
|
|
229
|
-
getDataWithOriginalTypes(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
223
|
+
async getDataWithOriginalTypes({ resource, limit, offset, sort, filters }) {
|
|
224
|
+
const columns = resource.dataSourceColumns.map((col) => `"${col.name}"`).join(', ');
|
|
225
|
+
const tableName = resource.table;
|
|
226
|
+
const { sql: where, paramsCount, values: filterValues } = this.whereClauseAndValues(resource, filters);
|
|
227
|
+
const limitOffset = `LIMIT $${paramsCount} OFFSET $${paramsCount + 1}`;
|
|
228
|
+
const d = [...filterValues, limit, offset];
|
|
229
|
+
const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `"${s.field}" ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
|
|
230
|
+
const selectQuery = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} ${limitOffset}`;
|
|
231
|
+
if (process.env.HEAVY_DEBUG) {
|
|
232
|
+
console.log('🪲 PG selectQuery:', selectQuery, 'params:', d);
|
|
233
|
+
}
|
|
234
|
+
const stmt = await this.db.query(selectQuery, d);
|
|
235
|
+
const rows = stmt.rows;
|
|
236
|
+
return rows.map((row) => {
|
|
237
|
+
const newRow = {};
|
|
238
|
+
for (const [key, value] of Object.entries(row)) {
|
|
239
|
+
newRow[key] = value;
|
|
240
240
|
}
|
|
241
|
-
|
|
242
|
-
const rows = stmt.rows;
|
|
243
|
-
return rows.map((row) => {
|
|
244
|
-
const newRow = {};
|
|
245
|
-
for (const [key, value] of Object.entries(row)) {
|
|
246
|
-
newRow[key] = value;
|
|
247
|
-
}
|
|
248
|
-
return newRow;
|
|
249
|
-
});
|
|
241
|
+
return newRow;
|
|
250
242
|
});
|
|
251
243
|
}
|
|
252
|
-
getCount(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
return stmt.rows[0].count;
|
|
258
|
-
});
|
|
244
|
+
async getCount({ resource, filters }) {
|
|
245
|
+
const tableName = resource.table;
|
|
246
|
+
const { sql: where, values: filterValues } = this.whereClauseAndValues(resource, filters);
|
|
247
|
+
const stmt = await this.db.query(`SELECT COUNT(*) FROM ${tableName} ${where}`, filterValues);
|
|
248
|
+
return stmt.rows[0].count;
|
|
259
249
|
}
|
|
260
|
-
getMinMaxForColumnsWithOriginalTypes(
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
return result;
|
|
272
|
-
});
|
|
250
|
+
async getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
|
|
251
|
+
const tableName = resource.table;
|
|
252
|
+
const result = {};
|
|
253
|
+
await Promise.all(columns.map(async (col) => {
|
|
254
|
+
const stmt = await this.db.query(`SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`);
|
|
255
|
+
const { min, max } = stmt.rows[0];
|
|
256
|
+
result[col.name] = {
|
|
257
|
+
min, max,
|
|
258
|
+
};
|
|
259
|
+
}));
|
|
260
|
+
return result;
|
|
273
261
|
}
|
|
274
|
-
createRecordOriginalValues(
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
yield this.db.query(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`, values);
|
|
284
|
-
});
|
|
262
|
+
async createRecordOriginalValues({ resource, record }) {
|
|
263
|
+
const tableName = resource.table;
|
|
264
|
+
const columns = Object.keys(record);
|
|
265
|
+
const placeholders = columns.map((_, i) => `$${i + 1}`).join(', ');
|
|
266
|
+
const values = columns.map((colName) => record[colName]);
|
|
267
|
+
for (let i = 0; i < columns.length; i++) {
|
|
268
|
+
columns[i] = `"${columns[i]}"`;
|
|
269
|
+
}
|
|
270
|
+
await this.db.query(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`, values);
|
|
285
271
|
}
|
|
286
|
-
updateRecordOriginalValues(
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
yield this.db.query(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE "${this.getPrimaryKey(resource)}" = $${values.length}`, values);
|
|
291
|
-
});
|
|
272
|
+
async updateRecordOriginalValues({ resource, recordId, newValues }) {
|
|
273
|
+
const values = [...Object.values(newValues), recordId];
|
|
274
|
+
const columnsWithPlaceholders = Object.keys(newValues).map((col, i) => `"${col}" = $${i + 1}`).join(', ');
|
|
275
|
+
await this.db.query(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE "${this.getPrimaryKey(resource)}" = $${values.length}`, values);
|
|
292
276
|
}
|
|
293
|
-
deleteRecord(
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
return res.rowCount > 0;
|
|
297
|
-
});
|
|
277
|
+
async deleteRecord({ resource, recordId }) {
|
|
278
|
+
const res = await this.db.query(`DELETE FROM ${resource.table} WHERE "${this.getPrimaryKey(resource)}" = $1`, [recordId]);
|
|
279
|
+
return res.rowCount > 0;
|
|
298
280
|
}
|
|
299
|
-
close() {
|
|
300
|
-
|
|
301
|
-
yield this.db.end();
|
|
302
|
-
});
|
|
281
|
+
async close() {
|
|
282
|
+
await this.db.end();
|
|
303
283
|
}
|
|
304
284
|
}
|
|
305
285
|
export default PostgresConnector;
|
|
286
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../dataConnectors/postgres.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 betterSqlite3 from 'better-sqlite3';
|
|
11
2
|
import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/AdminForthConfig.js';
|
|
12
3
|
import AdminForthBaseConnector from './baseConnector.js';
|
|
@@ -33,63 +24,61 @@ class SQLiteConnector extends AdminForthBaseConnector {
|
|
|
33
24
|
// create connection here
|
|
34
25
|
this.db = betterSqlite3(url.replace('sqlite://', ''));
|
|
35
26
|
}
|
|
36
|
-
discoverFields(resource) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
fieldTypes[row.name] = field;
|
|
90
|
-
});
|
|
91
|
-
return fieldTypes;
|
|
27
|
+
async discoverFields(resource) {
|
|
28
|
+
const tableName = resource.table;
|
|
29
|
+
const stmt = this.db.prepare(`PRAGMA table_info(${tableName})`);
|
|
30
|
+
const rows = await stmt.all();
|
|
31
|
+
const fieldTypes = {};
|
|
32
|
+
rows.forEach((row) => {
|
|
33
|
+
const field = {};
|
|
34
|
+
const baseType = row.type.toLowerCase();
|
|
35
|
+
if (baseType == 'int') {
|
|
36
|
+
field.type = AdminForthDataTypes.INTEGER;
|
|
37
|
+
field._underlineType = 'int';
|
|
38
|
+
}
|
|
39
|
+
else if (baseType.includes('varchar(')) {
|
|
40
|
+
field.type = AdminForthDataTypes.STRING;
|
|
41
|
+
field._underlineType = 'varchar';
|
|
42
|
+
const length = baseType.match(/\d+/);
|
|
43
|
+
field.maxLength = length ? parseInt(length[0]) : null;
|
|
44
|
+
}
|
|
45
|
+
else if (baseType == 'text') {
|
|
46
|
+
field.type = AdminForthDataTypes.TEXT;
|
|
47
|
+
field._underlineType = 'text';
|
|
48
|
+
}
|
|
49
|
+
else if (baseType.includes('decimal(')) {
|
|
50
|
+
field.type = AdminForthDataTypes.DECIMAL;
|
|
51
|
+
field._underlineType = 'decimal';
|
|
52
|
+
const [precision, scale] = baseType.match(/\d+/g);
|
|
53
|
+
field.precision = parseInt(precision);
|
|
54
|
+
field.scale = parseInt(scale);
|
|
55
|
+
}
|
|
56
|
+
else if (baseType == 'real') {
|
|
57
|
+
field.type = AdminForthDataTypes.FLOAT; //8-byte IEEE floating point number. It
|
|
58
|
+
field._underlineType = 'real';
|
|
59
|
+
}
|
|
60
|
+
else if (baseType == 'timestamp') {
|
|
61
|
+
field.type = AdminForthDataTypes.DATETIME;
|
|
62
|
+
field._underlineType = 'timestamp';
|
|
63
|
+
}
|
|
64
|
+
else if (baseType == 'boolean') {
|
|
65
|
+
field.type = AdminForthDataTypes.BOOLEAN;
|
|
66
|
+
field._underlineType = 'boolean';
|
|
67
|
+
}
|
|
68
|
+
else if (baseType == 'datetime') {
|
|
69
|
+
field.type = AdminForthDataTypes.DATETIME;
|
|
70
|
+
field._underlineType = 'datetime';
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
field.type = 'unknown';
|
|
74
|
+
}
|
|
75
|
+
field._baseTypeDebug = baseType;
|
|
76
|
+
field.required = row.notnull == 1;
|
|
77
|
+
field.primaryKey = row.pk == 1;
|
|
78
|
+
field.default = row.dflt_value;
|
|
79
|
+
fieldTypes[row.name] = field;
|
|
92
80
|
});
|
|
81
|
+
return fieldTypes;
|
|
93
82
|
}
|
|
94
83
|
getFieldValue(field, value) {
|
|
95
84
|
if (field.type == AdminForthDataTypes.DATETIME) {
|
|
@@ -120,7 +109,12 @@ class SQLiteConnector extends AdminForthBaseConnector {
|
|
|
120
109
|
}
|
|
121
110
|
else if (field.type == AdminForthDataTypes.JSON) {
|
|
122
111
|
if (field._underlineType == 'text' || field._underlineType == 'varchar') {
|
|
123
|
-
|
|
112
|
+
try {
|
|
113
|
+
return JSON.parse(value);
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
return { 'error': `Failed to parse JSON: ${e.message}` };
|
|
117
|
+
}
|
|
124
118
|
}
|
|
125
119
|
else {
|
|
126
120
|
console.error(`AdminForth: JSON field is not a string/text but ${field._underlineType}, this is not supported yet`);
|
|
@@ -189,80 +183,69 @@ class SQLiteConnector extends AdminForthBaseConnector {
|
|
|
189
183
|
return acc;
|
|
190
184
|
}, []);
|
|
191
185
|
}
|
|
192
|
-
getDataWithOriginalTypes(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
186
|
+
async getDataWithOriginalTypes({ resource, limit, offset, sort, filters }) {
|
|
187
|
+
const columns = resource.dataSourceColumns.map((col) => col.name).join(', ');
|
|
188
|
+
const tableName = resource.table;
|
|
189
|
+
const where = this.whereClause(filters);
|
|
190
|
+
const filterValues = this.whereParams(filters);
|
|
191
|
+
const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `${s.field} ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
|
|
192
|
+
const q = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} LIMIT ? OFFSET ?`;
|
|
193
|
+
const stmt = this.db.prepare(q);
|
|
194
|
+
const d = [...filterValues, limit, offset];
|
|
195
|
+
if (process.env.HEAVY_DEBUG) {
|
|
196
|
+
console.log('🪲📜 SQLITE Q', q, 'params:', d);
|
|
197
|
+
}
|
|
198
|
+
const rows = await stmt.all(d);
|
|
199
|
+
return rows.map((row) => {
|
|
200
|
+
const newRow = {};
|
|
201
|
+
for (const [key, value] of Object.entries(row)) {
|
|
202
|
+
newRow[key] = value;
|
|
204
203
|
}
|
|
205
|
-
|
|
206
|
-
return rows.map((row) => {
|
|
207
|
-
const newRow = {};
|
|
208
|
-
for (const [key, value] of Object.entries(row)) {
|
|
209
|
-
newRow[key] = value;
|
|
210
|
-
}
|
|
211
|
-
return newRow;
|
|
212
|
-
});
|
|
204
|
+
return newRow;
|
|
213
205
|
});
|
|
214
206
|
}
|
|
215
|
-
getCount(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
return totalStmt.get([...filterValues])['COUNT(*)'];
|
|
222
|
-
});
|
|
207
|
+
async getCount({ resource, filters }) {
|
|
208
|
+
const tableName = resource.table;
|
|
209
|
+
const where = this.whereClause(filters);
|
|
210
|
+
const filterValues = this.whereParams(filters);
|
|
211
|
+
const totalStmt = this.db.prepare(`SELECT COUNT(*) FROM ${tableName} ${where}`);
|
|
212
|
+
return totalStmt.get([...filterValues])['COUNT(*)'];
|
|
223
213
|
}
|
|
224
|
-
getMinMaxForColumnsWithOriginalTypes(
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
return result;
|
|
236
|
-
});
|
|
214
|
+
async getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
|
|
215
|
+
const tableName = resource.table;
|
|
216
|
+
const result = {};
|
|
217
|
+
await Promise.all(columns.map(async (col) => {
|
|
218
|
+
const stmt = await this.db.prepare(`SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`);
|
|
219
|
+
const { min, max } = stmt.get();
|
|
220
|
+
result[col.name] = {
|
|
221
|
+
min, max,
|
|
222
|
+
};
|
|
223
|
+
}));
|
|
224
|
+
return result;
|
|
237
225
|
}
|
|
238
|
-
createRecordOriginalValues(
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
yield q.run(values);
|
|
246
|
-
});
|
|
226
|
+
async createRecordOriginalValues({ resource, record }) {
|
|
227
|
+
const tableName = resource.table;
|
|
228
|
+
const columns = Object.keys(record);
|
|
229
|
+
const placeholders = columns.map(() => '?').join(', ');
|
|
230
|
+
const values = columns.map((colName) => record[colName]);
|
|
231
|
+
const q = this.db.prepare(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`);
|
|
232
|
+
await q.run(values);
|
|
247
233
|
}
|
|
248
|
-
updateRecordOriginalValues(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
yield q.run(values);
|
|
255
|
-
});
|
|
234
|
+
async updateRecordOriginalValues({ resource, recordId, newValues }) {
|
|
235
|
+
const columnsWithPlaceholders = Object.keys(newValues).map((col) => `${col} = ?`);
|
|
236
|
+
const values = [...Object.values(newValues), recordId];
|
|
237
|
+
const q = this.db.prepare(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE ${this.getPrimaryKey(resource)} = ?`);
|
|
238
|
+
process.env.HEAVY_DEBUG && console.log('🪲 SQLITE Query', `UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE ${this.getPrimaryKey(resource)} = ?`, 'params:', values);
|
|
239
|
+
await q.run(values);
|
|
256
240
|
}
|
|
257
|
-
deleteRecord(
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
return res.changes > 0;
|
|
262
|
-
});
|
|
241
|
+
async deleteRecord({ resource, recordId }) {
|
|
242
|
+
const q = this.db.prepare(`DELETE FROM ${resource.table} WHERE ${this.getPrimaryKey(resource)} = ?`);
|
|
243
|
+
const res = await q.run(recordId);
|
|
244
|
+
return res.changes > 0;
|
|
263
245
|
}
|
|
264
246
|
close() {
|
|
265
247
|
this.db.close();
|
|
266
248
|
}
|
|
267
249
|
}
|
|
268
250
|
export default SQLiteConnector;
|
|
251
|
+
//# sourceMappingURL=sqlite.js.map
|