lupine.api 1.1.58 → 1.1.59
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/README.md +3 -3
- package/admin/admin-about.tsx +12 -16
- package/admin/admin-config.tsx +47 -44
- package/admin/admin-css.tsx +3 -3
- package/admin/admin-db.tsx +75 -75
- package/admin/admin-frame-helper.tsx +364 -364
- package/admin/admin-frame.tsx +164 -164
- package/admin/admin-index.tsx +65 -65
- package/admin/admin-login.tsx +111 -111
- package/admin/admin-menu-edit.tsx +637 -637
- package/admin/admin-menu-list.tsx +87 -87
- package/admin/admin-page-edit.tsx +564 -564
- package/admin/admin-page-list.tsx +83 -83
- package/admin/admin-performance.tsx +28 -28
- package/admin/admin-release.tsx +427 -426
- package/admin/admin-resources.tsx +382 -382
- package/admin/admin-shell.tsx +89 -89
- package/admin/admin-table-data.tsx +146 -146
- package/admin/admin-table-list.tsx +230 -230
- package/admin/admin-test-animations.tsx +395 -395
- package/admin/admin-test-component.tsx +823 -808
- package/admin/admin-test-edit.tsx +319 -319
- package/admin/admin-test-themes.tsx +56 -56
- package/admin/admin-tokens.tsx +338 -338
- package/admin/design/admin-design.tsx +174 -174
- package/admin/design/block-grid.tsx +36 -36
- package/admin/design/block-grid1.tsx +21 -21
- package/admin/design/block-paragraph.tsx +19 -19
- package/admin/design/block-title.tsx +19 -19
- package/admin/design/design-block-box.tsx +140 -140
- package/admin/design/drag-data.tsx +24 -24
- package/admin/index.ts +9 -9
- package/admin/package.json +15 -15
- package/admin/tsconfig.json +127 -127
- package/dev/copy-folder.js +32 -32
- package/dev/cp-index-html.js +69 -69
- package/dev/file-utils.js +12 -12
- package/dev/index.js +18 -19
- package/dev/package.json +12 -12
- package/dev/plugin-ifelse.js +168 -168
- package/dev/plugin-ifelse.test.js +37 -37
- package/dev/run-cmd.js +14 -14
- package/dev/send-request.js +12 -12
- package/package.json +55 -55
- package/src/admin-api/admin-api-helper.ts +210 -205
- package/src/admin-api/admin-api.ts +65 -65
- package/src/admin-api/admin-auth.ts +152 -146
- package/src/admin-api/admin-config.ts +94 -84
- package/src/admin-api/admin-csv.ts +94 -94
- package/src/admin-api/admin-db.ts +269 -269
- package/src/admin-api/admin-menu.ts +135 -135
- package/src/admin-api/admin-page.ts +135 -135
- package/src/admin-api/admin-performance.ts +128 -128
- package/src/admin-api/admin-release.ts +703 -700
- package/src/admin-api/admin-resources.ts +318 -318
- package/src/admin-api/admin-token-helper.ts +82 -79
- package/src/admin-api/admin-tokens.ts +90 -90
- package/src/admin-api/index.ts +2 -2
- package/src/admin-api/web-config-api.ts +19 -19
- package/src/api/api-cache.ts +103 -103
- package/src/api/api-helper.ts +44 -44
- package/src/api/api-module.ts +67 -60
- package/src/api/api-router.ts +177 -177
- package/src/api/api-shared-storage.ts +64 -64
- package/src/api/async-storage.ts +5 -5
- package/src/api/debug-service.ts +56 -56
- package/src/api/encode-html.ts +27 -27
- package/src/api/handle-status.ts +75 -75
- package/src/api/index.ts +15 -16
- package/src/api/mini-web-socket.ts +270 -270
- package/src/api/server-content-type.ts +82 -82
- package/src/api/server-render.ts +235 -215
- package/src/api/shell-service.ts +74 -74
- package/src/api/simple-storage.ts +80 -80
- package/src/api/static-server.ts +128 -125
- package/src/api/to-client-delivery.ts +26 -26
- package/src/app/app-cache.ts +55 -55
- package/src/app/app-helper.ts +62 -62
- package/src/app/app-message.ts +109 -109
- package/src/app/app-shared-storage.ts +363 -363
- package/src/app/app-start.ts +136 -136
- package/src/app/cleanup-exit.ts +16 -16
- package/src/app/host-to-path.ts +38 -38
- package/src/app/index.ts +11 -11
- package/src/app/process-dev-requests.ts +130 -130
- package/src/app/web-listener.ts +294 -294
- package/src/app/web-processor.ts +47 -42
- package/src/app/web-server.ts +100 -100
- package/src/common-js/web-env.js +104 -104
- package/src/index.ts +7 -7
- package/src/lang/api-lang-en.ts +26 -26
- package/src/lang/api-lang-zh-cn.ts +27 -27
- package/src/lang/index.ts +2 -2
- package/src/lang/lang-helper.ts +76 -76
- package/src/lang/lang-props.ts +6 -6
- package/src/lib/db/db-helper.ts +23 -23
- package/src/lib/db/db-mysql.ts +249 -250
- package/src/lib/db/db-sqlite.ts +101 -101
- package/src/lib/db/db.spec.ts +28 -28
- package/src/lib/db/db.ts +325 -325
- package/src/lib/db/index.ts +5 -5
- package/src/lib/index.ts +3 -3
- package/src/lib/logger.spec.ts +214 -214
- package/src/lib/logger.ts +281 -281
- package/src/lib/runtime-require.ts +37 -37
- package/src/lib/utils/cookie-util.ts +34 -34
- package/src/lib/utils/crypto.ts +58 -58
- package/src/lib/utils/date-utils.ts +317 -317
- package/src/lib/utils/deep-merge.ts +37 -37
- package/src/lib/utils/delay.ts +12 -12
- package/src/lib/utils/file-setting.ts +55 -55
- package/src/lib/utils/format-bytes.ts +11 -11
- package/src/lib/utils/fs-utils.ts +158 -158
- package/src/lib/utils/get-env.ts +27 -27
- package/src/lib/utils/index.ts +12 -12
- package/src/lib/utils/is-type.ts +48 -48
- package/src/lib/utils/load-env.ts +14 -14
- package/src/lib/utils/pad.ts +6 -6
- package/src/models/api-base.ts +5 -5
- package/src/models/api-module-props.ts +10 -11
- package/src/models/api-router-props.ts +26 -26
- package/src/models/app-cache-props.ts +33 -33
- package/src/models/app-data-props.ts +10 -10
- package/src/models/app-helper-props.ts +6 -6
- package/src/models/app-shared-storage-props.ts +38 -38
- package/src/models/app-start-props.ts +18 -18
- package/src/models/async-storage-props.ts +13 -13
- package/src/models/db-config.ts +30 -30
- package/src/models/host-to-path-props.ts +12 -12
- package/src/models/index.ts +16 -16
- package/src/models/json-object.ts +8 -8
- package/src/models/locals-props.ts +36 -36
- package/src/models/logger-props.ts +84 -84
- package/src/models/simple-storage-props.ts +13 -14
- package/src/models/to-client-delivery-props.ts +6 -6
- package/tsconfig.json +115 -115
- package/dev/plugin-gen-versions.js +0 -20
|
@@ -1,269 +1,269 @@
|
|
|
1
|
-
import { ServerResponse } from 'http';
|
|
2
|
-
import { IApiBase, FsUtils, Logger, apiCache, ServerRequest, ApiRouter, ApiHelper } from 'lupine.api';
|
|
3
|
-
import { exportCSV, exportCSVTables, loadCSV } from './admin-csv';
|
|
4
|
-
|
|
5
|
-
const logger = new Logger('admin-db');
|
|
6
|
-
export class AdminDb implements IApiBase {
|
|
7
|
-
protected router = new ApiRouter();
|
|
8
|
-
adminUser: any;
|
|
9
|
-
|
|
10
|
-
constructor() {
|
|
11
|
-
this.mountDashboard();
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public getRouter(): ApiRouter {
|
|
15
|
-
return this.router;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
protected mountDashboard() {
|
|
19
|
-
this.router.use('/install', this.install.bind(this));
|
|
20
|
-
this.router.use('/run-sql', this.runSql.bind(this));
|
|
21
|
-
// this.router.use('/table-info', this.tableInfo.bind(this));
|
|
22
|
-
|
|
23
|
-
this.router.use('/tables/list', this.tableList.bind(this));
|
|
24
|
-
this.router.use('/tables/download', this.tableDownloadAll.bind(this));
|
|
25
|
-
this.router.use('/tables/upload', this.tableUpload.bind(this));
|
|
26
|
-
this.router.use('/tables/truncate', this.tableTruncateAll.bind(this));
|
|
27
|
-
this.router.use('/tables/drop', this.tableDropAll.bind(this));
|
|
28
|
-
this.router.use('/table/data/:tableName/?offset/?limit', this.tableData.bind(this));
|
|
29
|
-
this.router.use('/table/delete/:tableName/:id', this.tableDelete.bind(this));
|
|
30
|
-
this.router.use('/table/drop/:tableName', this.tableDrop.bind(this));
|
|
31
|
-
this.router.use('/table/truncate/:tableName', this.tableTruncate.bind(this));
|
|
32
|
-
this.router.use('/table/download/:tableName', this.tableDownload.bind(this));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async tableList(req: ServerRequest, res: ServerResponse) {
|
|
36
|
-
const db = apiCache.getDb();
|
|
37
|
-
const result = await db.getAllTables(true);
|
|
38
|
-
const response = {
|
|
39
|
-
status: Array.isArray(result) ? 'ok' : 'error',
|
|
40
|
-
message: 'Table List.',
|
|
41
|
-
result: result,
|
|
42
|
-
};
|
|
43
|
-
ApiHelper.sendJson(req, res, response);
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async tableDownloadAll(req: ServerRequest, res: ServerResponse) {
|
|
48
|
-
const db = apiCache.getDb();
|
|
49
|
-
const tables = await db.getAllTableNames();
|
|
50
|
-
exportCSVTables(db, tables, res);
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async tableUpload(req: ServerRequest, res: ServerResponse) {
|
|
55
|
-
const db = apiCache.getDb();
|
|
56
|
-
const lines = Buffer.from(req.locals.body!)
|
|
57
|
-
.toString()
|
|
58
|
-
.split(/(?:\r\n|\r|\n)/g);
|
|
59
|
-
const result = await loadCSV(db, lines);
|
|
60
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
61
|
-
res.write(JSON.stringify({ status: 'ok', result }));
|
|
62
|
-
res.end();
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async tableTruncateAll(req: ServerRequest, res: ServerResponse) {
|
|
67
|
-
const db = apiCache.getDb();
|
|
68
|
-
const tables = await db.getAllTableNames();
|
|
69
|
-
if (tables && tables.length > 0) {
|
|
70
|
-
for (const i in tables) {
|
|
71
|
-
await db.truncateTable(tables[i]);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const response = {
|
|
76
|
-
status: 'ok',
|
|
77
|
-
message: 'Truncate all Tables: ' + tables.length,
|
|
78
|
-
result: '',
|
|
79
|
-
};
|
|
80
|
-
ApiHelper.sendJson(req, res, response);
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async tableDropAll(req: ServerRequest, res: ServerResponse) {
|
|
85
|
-
const db = apiCache.getDb();
|
|
86
|
-
const tables = await db.getAllTableNames();
|
|
87
|
-
if (tables && tables.length > 0) {
|
|
88
|
-
for (const i in tables) {
|
|
89
|
-
await db.execute(`DROP TABLE ${tables[i]}`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const response = {
|
|
94
|
-
status: 'ok',
|
|
95
|
-
message: 'Truncate all Tables: ' + tables.length,
|
|
96
|
-
result: '',
|
|
97
|
-
};
|
|
98
|
-
ApiHelper.sendJson(req, res, response);
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async tableData(req: ServerRequest, res: ServerResponse) {
|
|
103
|
-
const db = apiCache.getDb();
|
|
104
|
-
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
105
|
-
let pageIndex = req.locals.urlParameters.getInt('offset', 0); // Number.parseInt(post.pg_i as string);
|
|
106
|
-
const pageLimit = req.locals.urlParameters.getInt('limit', 30); //Number.parseInt(post.pg_l as string) || 50;
|
|
107
|
-
|
|
108
|
-
const response = {
|
|
109
|
-
status: 'error',
|
|
110
|
-
message: tableName ? 'Table Data.' : 'Need a table name.',
|
|
111
|
-
result: null,
|
|
112
|
-
};
|
|
113
|
-
if (tableName) {
|
|
114
|
-
const itemsCount = await db.selectOneResult(tableName, 'count(*)');
|
|
115
|
-
let maxPages = Math.floor(itemsCount / pageLimit);
|
|
116
|
-
if (itemsCount % pageLimit !== 0) {
|
|
117
|
-
maxPages++;
|
|
118
|
-
}
|
|
119
|
-
if (pageIndex > maxPages) {
|
|
120
|
-
pageIndex = maxPages - 1;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const offset = pageIndex * pageLimit;
|
|
124
|
-
response.result = await db.selectObject(tableName, undefined, undefined, undefined, pageLimit, offset);
|
|
125
|
-
response.status = 'ok';
|
|
126
|
-
(response as any).itemsCount = itemsCount;
|
|
127
|
-
(response as any).pageIndex = pageIndex;
|
|
128
|
-
}
|
|
129
|
-
ApiHelper.sendJson(req, res, response);
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async tableDelete(req: ServerRequest, res: ServerResponse) {
|
|
134
|
-
const db = apiCache.getDb();
|
|
135
|
-
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
136
|
-
const id = req.locals.urlParameters.getInt('id', -1);
|
|
137
|
-
|
|
138
|
-
const response = {
|
|
139
|
-
status: 'error',
|
|
140
|
-
message: tableName ? 'Table delete.' : 'Need a table name.',
|
|
141
|
-
result: null,
|
|
142
|
-
};
|
|
143
|
-
if (tableName && id > 0) {
|
|
144
|
-
const result = await db.deleteObject(tableName, { id: id });
|
|
145
|
-
response.result = result;
|
|
146
|
-
response.status = 'ok';
|
|
147
|
-
ApiHelper.sendJson(req, res, response);
|
|
148
|
-
return true;
|
|
149
|
-
}
|
|
150
|
-
ApiHelper.sendJson(req, res, response);
|
|
151
|
-
return true;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async tableDownload(req: ServerRequest, res: ServerResponse) {
|
|
155
|
-
const db = apiCache.getDb();
|
|
156
|
-
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
157
|
-
if (!tableName) {
|
|
158
|
-
const response = {
|
|
159
|
-
status: 'error',
|
|
160
|
-
message: 'Need a table name.',
|
|
161
|
-
};
|
|
162
|
-
ApiHelper.sendJson(req, res, response);
|
|
163
|
-
return true;
|
|
164
|
-
}
|
|
165
|
-
exportCSV(db, tableName, res);
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
async tableDrop(req: ServerRequest, res: ServerResponse) {
|
|
170
|
-
const db = apiCache.getDb();
|
|
171
|
-
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
172
|
-
const response = {
|
|
173
|
-
status: 'error',
|
|
174
|
-
message: tableName ? 'Delete Table.' : 'Need a table name.',
|
|
175
|
-
result: '',
|
|
176
|
-
};
|
|
177
|
-
if (tableName) {
|
|
178
|
-
const result = await db.execute(`DROP TABLE ${tableName}`);
|
|
179
|
-
response.result = result;
|
|
180
|
-
response.status = 'ok';
|
|
181
|
-
}
|
|
182
|
-
ApiHelper.sendJson(req, res, response);
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
async tableTruncate(req: ServerRequest, res: ServerResponse) {
|
|
187
|
-
const db = apiCache.getDb();
|
|
188
|
-
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
189
|
-
const response = {
|
|
190
|
-
status: 'error',
|
|
191
|
-
message: tableName ? 'Truncate Table.' : 'Need a table name.',
|
|
192
|
-
result: '',
|
|
193
|
-
};
|
|
194
|
-
if (tableName) {
|
|
195
|
-
const result = await db.truncateTable(tableName);
|
|
196
|
-
response.result = result;
|
|
197
|
-
response.status = 'ok';
|
|
198
|
-
}
|
|
199
|
-
ApiHelper.sendJson(req, res, response);
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
async runSql(req: ServerRequest, res: ServerResponse) {
|
|
204
|
-
const db = apiCache.getDb();
|
|
205
|
-
const data = req.locals.json();
|
|
206
|
-
const response = {
|
|
207
|
-
status: 'error',
|
|
208
|
-
message: '',
|
|
209
|
-
result: '',
|
|
210
|
-
};
|
|
211
|
-
if (data && !Array.isArray(data) && data.sql) {
|
|
212
|
-
const sql = ((data.sql as string) || '').trim();
|
|
213
|
-
const result = sql.toUpperCase().startsWith('SELECT') ? await db.select(sql) : await db.execute(sql);
|
|
214
|
-
response.status = 'ok';
|
|
215
|
-
response.message = 'Executed sql.';
|
|
216
|
-
response.result = result;
|
|
217
|
-
}
|
|
218
|
-
ApiHelper.sendJson(req, res, response);
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
async install(req: ServerRequest, res: ServerResponse) {
|
|
223
|
-
const db = apiCache.getDb();
|
|
224
|
-
const appData = apiCache.getAppData();
|
|
225
|
-
const installDir = appData.dataPath + '/resources';
|
|
226
|
-
const dbType = appData.dbType;
|
|
227
|
-
const sqlFile = `${installDir}/install.${dbType}.sql`;
|
|
228
|
-
const sql = await FsUtils.readFile(sqlFile);
|
|
229
|
-
if (!sql) {
|
|
230
|
-
const response = { errorMessage: `Can't read file: ${sqlFile}` };
|
|
231
|
-
ApiHelper.sendJson(req, res, response);
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const sqlArr = sql.replace(/^#.*/gm, '').replace(/\r/g, ' ').replace(/\n/g, ' ').split(';');
|
|
236
|
-
const result = [];
|
|
237
|
-
for (let one in sqlArr) {
|
|
238
|
-
const oneSql = sqlArr[one].trim();
|
|
239
|
-
if (oneSql) {
|
|
240
|
-
try {
|
|
241
|
-
const one = await db.execute(oneSql);
|
|
242
|
-
result.push(one);
|
|
243
|
-
} catch (error: any) {
|
|
244
|
-
result.push({ error: error.message });
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
const response = { status: 'ok', message: 'Installed', result };
|
|
249
|
-
ApiHelper.sendJson(req, res, response);
|
|
250
|
-
return true;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
async tableInfo(req: ServerRequest, res: ServerResponse) {
|
|
254
|
-
const db = apiCache.getDb();
|
|
255
|
-
const tableName = req.locals.query.get('table');
|
|
256
|
-
const response = {
|
|
257
|
-
status: 'error',
|
|
258
|
-
message: tableName ? 'Get Table.' : 'Need a table name.',
|
|
259
|
-
result: '',
|
|
260
|
-
};
|
|
261
|
-
if (tableName) {
|
|
262
|
-
const result = await db.getTableInfo(tableName);
|
|
263
|
-
response.result = result;
|
|
264
|
-
response.status = 'ok';
|
|
265
|
-
}
|
|
266
|
-
ApiHelper.sendJson(req, res, response);
|
|
267
|
-
return true;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
1
|
+
import { ServerResponse } from 'http';
|
|
2
|
+
import { IApiBase, FsUtils, Logger, apiCache, ServerRequest, ApiRouter, ApiHelper } from 'lupine.api';
|
|
3
|
+
import { exportCSV, exportCSVTables, loadCSV } from './admin-csv';
|
|
4
|
+
|
|
5
|
+
const logger = new Logger('admin-db');
|
|
6
|
+
export class AdminDb implements IApiBase {
|
|
7
|
+
protected router = new ApiRouter();
|
|
8
|
+
adminUser: any;
|
|
9
|
+
|
|
10
|
+
constructor() {
|
|
11
|
+
this.mountDashboard();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public getRouter(): ApiRouter {
|
|
15
|
+
return this.router;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected mountDashboard() {
|
|
19
|
+
this.router.use('/install', this.install.bind(this));
|
|
20
|
+
this.router.use('/run-sql', this.runSql.bind(this));
|
|
21
|
+
// this.router.use('/table-info', this.tableInfo.bind(this));
|
|
22
|
+
|
|
23
|
+
this.router.use('/tables/list', this.tableList.bind(this));
|
|
24
|
+
this.router.use('/tables/download', this.tableDownloadAll.bind(this));
|
|
25
|
+
this.router.use('/tables/upload', this.tableUpload.bind(this));
|
|
26
|
+
this.router.use('/tables/truncate', this.tableTruncateAll.bind(this));
|
|
27
|
+
this.router.use('/tables/drop', this.tableDropAll.bind(this));
|
|
28
|
+
this.router.use('/table/data/:tableName/?offset/?limit', this.tableData.bind(this));
|
|
29
|
+
this.router.use('/table/delete/:tableName/:id', this.tableDelete.bind(this));
|
|
30
|
+
this.router.use('/table/drop/:tableName', this.tableDrop.bind(this));
|
|
31
|
+
this.router.use('/table/truncate/:tableName', this.tableTruncate.bind(this));
|
|
32
|
+
this.router.use('/table/download/:tableName', this.tableDownload.bind(this));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async tableList(req: ServerRequest, res: ServerResponse) {
|
|
36
|
+
const db = apiCache.getDb();
|
|
37
|
+
const result = await db.getAllTables(true);
|
|
38
|
+
const response = {
|
|
39
|
+
status: Array.isArray(result) ? 'ok' : 'error',
|
|
40
|
+
message: 'Table List.',
|
|
41
|
+
result: result,
|
|
42
|
+
};
|
|
43
|
+
ApiHelper.sendJson(req, res, response);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async tableDownloadAll(req: ServerRequest, res: ServerResponse) {
|
|
48
|
+
const db = apiCache.getDb();
|
|
49
|
+
const tables = await db.getAllTableNames();
|
|
50
|
+
exportCSVTables(db, tables, res);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async tableUpload(req: ServerRequest, res: ServerResponse) {
|
|
55
|
+
const db = apiCache.getDb();
|
|
56
|
+
const lines = Buffer.from(req.locals.body!)
|
|
57
|
+
.toString()
|
|
58
|
+
.split(/(?:\r\n|\r|\n)/g);
|
|
59
|
+
const result = await loadCSV(db, lines);
|
|
60
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
61
|
+
res.write(JSON.stringify({ status: 'ok', result }));
|
|
62
|
+
res.end();
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async tableTruncateAll(req: ServerRequest, res: ServerResponse) {
|
|
67
|
+
const db = apiCache.getDb();
|
|
68
|
+
const tables = await db.getAllTableNames();
|
|
69
|
+
if (tables && tables.length > 0) {
|
|
70
|
+
for (const i in tables) {
|
|
71
|
+
await db.truncateTable(tables[i]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const response = {
|
|
76
|
+
status: 'ok',
|
|
77
|
+
message: 'Truncate all Tables: ' + tables.length,
|
|
78
|
+
result: '',
|
|
79
|
+
};
|
|
80
|
+
ApiHelper.sendJson(req, res, response);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async tableDropAll(req: ServerRequest, res: ServerResponse) {
|
|
85
|
+
const db = apiCache.getDb();
|
|
86
|
+
const tables = await db.getAllTableNames();
|
|
87
|
+
if (tables && tables.length > 0) {
|
|
88
|
+
for (const i in tables) {
|
|
89
|
+
await db.execute(`DROP TABLE ${tables[i]}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const response = {
|
|
94
|
+
status: 'ok',
|
|
95
|
+
message: 'Truncate all Tables: ' + tables.length,
|
|
96
|
+
result: '',
|
|
97
|
+
};
|
|
98
|
+
ApiHelper.sendJson(req, res, response);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async tableData(req: ServerRequest, res: ServerResponse) {
|
|
103
|
+
const db = apiCache.getDb();
|
|
104
|
+
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
105
|
+
let pageIndex = req.locals.urlParameters.getInt('offset', 0); // Number.parseInt(post.pg_i as string);
|
|
106
|
+
const pageLimit = req.locals.urlParameters.getInt('limit', 30); //Number.parseInt(post.pg_l as string) || 50;
|
|
107
|
+
|
|
108
|
+
const response = {
|
|
109
|
+
status: 'error',
|
|
110
|
+
message: tableName ? 'Table Data.' : 'Need a table name.',
|
|
111
|
+
result: null,
|
|
112
|
+
};
|
|
113
|
+
if (tableName) {
|
|
114
|
+
const itemsCount = await db.selectOneResult(tableName, 'count(*)');
|
|
115
|
+
let maxPages = Math.floor(itemsCount / pageLimit);
|
|
116
|
+
if (itemsCount % pageLimit !== 0) {
|
|
117
|
+
maxPages++;
|
|
118
|
+
}
|
|
119
|
+
if (pageIndex > maxPages) {
|
|
120
|
+
pageIndex = maxPages - 1;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const offset = pageIndex * pageLimit;
|
|
124
|
+
response.result = await db.selectObject(tableName, undefined, undefined, undefined, pageLimit, offset);
|
|
125
|
+
response.status = 'ok';
|
|
126
|
+
(response as any).itemsCount = itemsCount;
|
|
127
|
+
(response as any).pageIndex = pageIndex;
|
|
128
|
+
}
|
|
129
|
+
ApiHelper.sendJson(req, res, response);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async tableDelete(req: ServerRequest, res: ServerResponse) {
|
|
134
|
+
const db = apiCache.getDb();
|
|
135
|
+
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
136
|
+
const id = req.locals.urlParameters.getInt('id', -1);
|
|
137
|
+
|
|
138
|
+
const response = {
|
|
139
|
+
status: 'error',
|
|
140
|
+
message: tableName ? 'Table delete.' : 'Need a table name.',
|
|
141
|
+
result: null,
|
|
142
|
+
};
|
|
143
|
+
if (tableName && id > 0) {
|
|
144
|
+
const result = await db.deleteObject(tableName, { id: id });
|
|
145
|
+
response.result = result;
|
|
146
|
+
response.status = 'ok';
|
|
147
|
+
ApiHelper.sendJson(req, res, response);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
ApiHelper.sendJson(req, res, response);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async tableDownload(req: ServerRequest, res: ServerResponse) {
|
|
155
|
+
const db = apiCache.getDb();
|
|
156
|
+
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
157
|
+
if (!tableName) {
|
|
158
|
+
const response = {
|
|
159
|
+
status: 'error',
|
|
160
|
+
message: 'Need a table name.',
|
|
161
|
+
};
|
|
162
|
+
ApiHelper.sendJson(req, res, response);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
exportCSV(db, tableName, res);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async tableDrop(req: ServerRequest, res: ServerResponse) {
|
|
170
|
+
const db = apiCache.getDb();
|
|
171
|
+
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
172
|
+
const response = {
|
|
173
|
+
status: 'error',
|
|
174
|
+
message: tableName ? 'Delete Table.' : 'Need a table name.',
|
|
175
|
+
result: '',
|
|
176
|
+
};
|
|
177
|
+
if (tableName) {
|
|
178
|
+
const result = await db.execute(`DROP TABLE ${tableName}`);
|
|
179
|
+
response.result = result;
|
|
180
|
+
response.status = 'ok';
|
|
181
|
+
}
|
|
182
|
+
ApiHelper.sendJson(req, res, response);
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async tableTruncate(req: ServerRequest, res: ServerResponse) {
|
|
187
|
+
const db = apiCache.getDb();
|
|
188
|
+
const tableName = req.locals.urlParameters.get('tableName', '');
|
|
189
|
+
const response = {
|
|
190
|
+
status: 'error',
|
|
191
|
+
message: tableName ? 'Truncate Table.' : 'Need a table name.',
|
|
192
|
+
result: '',
|
|
193
|
+
};
|
|
194
|
+
if (tableName) {
|
|
195
|
+
const result = await db.truncateTable(tableName);
|
|
196
|
+
response.result = result;
|
|
197
|
+
response.status = 'ok';
|
|
198
|
+
}
|
|
199
|
+
ApiHelper.sendJson(req, res, response);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async runSql(req: ServerRequest, res: ServerResponse) {
|
|
204
|
+
const db = apiCache.getDb();
|
|
205
|
+
const data = req.locals.json();
|
|
206
|
+
const response = {
|
|
207
|
+
status: 'error',
|
|
208
|
+
message: '',
|
|
209
|
+
result: '',
|
|
210
|
+
};
|
|
211
|
+
if (data && !Array.isArray(data) && data.sql) {
|
|
212
|
+
const sql = ((data.sql as string) || '').trim();
|
|
213
|
+
const result = sql.toUpperCase().startsWith('SELECT') ? await db.select(sql) : await db.execute(sql);
|
|
214
|
+
response.status = 'ok';
|
|
215
|
+
response.message = 'Executed sql.';
|
|
216
|
+
response.result = result;
|
|
217
|
+
}
|
|
218
|
+
ApiHelper.sendJson(req, res, response);
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async install(req: ServerRequest, res: ServerResponse) {
|
|
223
|
+
const db = apiCache.getDb();
|
|
224
|
+
const appData = apiCache.getAppData();
|
|
225
|
+
const installDir = appData.dataPath + '/resources';
|
|
226
|
+
const dbType = appData.dbType;
|
|
227
|
+
const sqlFile = `${installDir}/install.${dbType}.sql`;
|
|
228
|
+
const sql = await FsUtils.readFile(sqlFile);
|
|
229
|
+
if (!sql) {
|
|
230
|
+
const response = { errorMessage: `Can't read file: ${sqlFile}` };
|
|
231
|
+
ApiHelper.sendJson(req, res, response);
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const sqlArr = sql.replace(/^#.*/gm, '').replace(/\r/g, ' ').replace(/\n/g, ' ').split(';');
|
|
236
|
+
const result = [];
|
|
237
|
+
for (let one in sqlArr) {
|
|
238
|
+
const oneSql = sqlArr[one].trim();
|
|
239
|
+
if (oneSql) {
|
|
240
|
+
try {
|
|
241
|
+
const one = await db.execute(oneSql);
|
|
242
|
+
result.push(one);
|
|
243
|
+
} catch (error: any) {
|
|
244
|
+
result.push({ error: error.message });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const response = { status: 'ok', message: 'Installed', result };
|
|
249
|
+
ApiHelper.sendJson(req, res, response);
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async tableInfo(req: ServerRequest, res: ServerResponse) {
|
|
254
|
+
const db = apiCache.getDb();
|
|
255
|
+
const tableName = req.locals.query.get('table');
|
|
256
|
+
const response = {
|
|
257
|
+
status: 'error',
|
|
258
|
+
message: tableName ? 'Get Table.' : 'Need a table name.',
|
|
259
|
+
result: '',
|
|
260
|
+
};
|
|
261
|
+
if (tableName) {
|
|
262
|
+
const result = await db.getTableInfo(tableName);
|
|
263
|
+
response.result = result;
|
|
264
|
+
response.status = 'ok';
|
|
265
|
+
}
|
|
266
|
+
ApiHelper.sendJson(req, res, response);
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
}
|