lupine.api 1.1.58 → 1.1.60

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 (137) hide show
  1. package/README.md +3 -3
  2. package/admin/admin-about.tsx +12 -16
  3. package/admin/admin-config.tsx +47 -44
  4. package/admin/admin-css.tsx +3 -3
  5. package/admin/admin-db.tsx +75 -75
  6. package/admin/admin-frame-helper.tsx +364 -364
  7. package/admin/admin-frame.tsx +164 -164
  8. package/admin/admin-index.tsx +65 -65
  9. package/admin/admin-login.tsx +111 -111
  10. package/admin/admin-menu-edit.tsx +637 -637
  11. package/admin/admin-menu-list.tsx +87 -87
  12. package/admin/admin-page-edit.tsx +564 -564
  13. package/admin/admin-page-list.tsx +83 -83
  14. package/admin/admin-performance.tsx +28 -28
  15. package/admin/admin-release.tsx +427 -426
  16. package/admin/admin-resources.tsx +382 -382
  17. package/admin/admin-shell.tsx +89 -89
  18. package/admin/admin-table-data.tsx +146 -146
  19. package/admin/admin-table-list.tsx +230 -230
  20. package/admin/admin-test-animations.tsx +395 -395
  21. package/admin/admin-test-component.tsx +823 -808
  22. package/admin/admin-test-edit.tsx +319 -319
  23. package/admin/admin-test-themes.tsx +56 -56
  24. package/admin/admin-tokens.tsx +338 -338
  25. package/admin/design/admin-design.tsx +174 -174
  26. package/admin/design/block-grid.tsx +36 -36
  27. package/admin/design/block-grid1.tsx +21 -21
  28. package/admin/design/block-paragraph.tsx +19 -19
  29. package/admin/design/block-title.tsx +19 -19
  30. package/admin/design/design-block-box.tsx +140 -140
  31. package/admin/design/drag-data.tsx +24 -24
  32. package/admin/index.ts +9 -9
  33. package/admin/package.json +15 -15
  34. package/admin/tsconfig.json +127 -127
  35. package/dev/copy-folder.js +32 -32
  36. package/dev/cp-index-html.js +69 -69
  37. package/dev/file-utils.js +12 -12
  38. package/dev/index.js +18 -19
  39. package/dev/package.json +12 -12
  40. package/dev/plugin-ifelse.js +168 -168
  41. package/dev/plugin-ifelse.test.js +37 -37
  42. package/dev/run-cmd.js +14 -14
  43. package/dev/send-request.js +12 -12
  44. package/package.json +55 -55
  45. package/src/admin-api/admin-api-helper.ts +210 -205
  46. package/src/admin-api/admin-api.ts +65 -65
  47. package/src/admin-api/admin-auth.ts +152 -146
  48. package/src/admin-api/admin-config.ts +94 -84
  49. package/src/admin-api/admin-csv.ts +94 -94
  50. package/src/admin-api/admin-db.ts +269 -269
  51. package/src/admin-api/admin-menu.ts +135 -135
  52. package/src/admin-api/admin-page.ts +135 -135
  53. package/src/admin-api/admin-performance.ts +128 -128
  54. package/src/admin-api/admin-release.ts +706 -700
  55. package/src/admin-api/admin-resources.ts +318 -318
  56. package/src/admin-api/admin-token-helper.ts +82 -79
  57. package/src/admin-api/admin-tokens.ts +90 -90
  58. package/src/admin-api/index.ts +2 -2
  59. package/src/admin-api/web-config-api.ts +19 -19
  60. package/src/api/api-cache.ts +103 -103
  61. package/src/api/api-helper.ts +44 -44
  62. package/src/api/api-module.ts +67 -60
  63. package/src/api/api-router.ts +177 -177
  64. package/src/api/api-shared-storage.ts +64 -64
  65. package/src/api/async-storage.ts +5 -5
  66. package/src/api/debug-service.ts +56 -56
  67. package/src/api/encode-html.ts +27 -27
  68. package/src/api/handle-status.ts +75 -75
  69. package/src/api/index.ts +15 -16
  70. package/src/api/mini-web-socket.ts +270 -270
  71. package/src/api/server-content-type.ts +82 -82
  72. package/src/api/server-render.ts +235 -215
  73. package/src/api/shell-service.ts +74 -74
  74. package/src/api/simple-storage.ts +80 -80
  75. package/src/api/static-server.ts +128 -125
  76. package/src/api/to-client-delivery.ts +26 -26
  77. package/src/app/app-cache.ts +55 -55
  78. package/src/app/app-helper.ts +62 -62
  79. package/src/app/app-message.ts +109 -109
  80. package/src/app/app-shared-storage.ts +363 -363
  81. package/src/app/app-start.ts +136 -136
  82. package/src/app/cleanup-exit.ts +16 -16
  83. package/src/app/host-to-path.ts +38 -38
  84. package/src/app/index.ts +11 -11
  85. package/src/app/process-dev-requests.ts +130 -130
  86. package/src/app/web-listener.ts +294 -294
  87. package/src/app/web-processor.ts +47 -42
  88. package/src/app/web-server.ts +100 -100
  89. package/src/common-js/web-env.js +104 -104
  90. package/src/index.ts +7 -7
  91. package/src/lang/api-lang-en.ts +26 -26
  92. package/src/lang/api-lang-zh-cn.ts +27 -27
  93. package/src/lang/index.ts +2 -2
  94. package/src/lang/lang-helper.ts +76 -76
  95. package/src/lang/lang-props.ts +6 -6
  96. package/src/lib/db/db-helper.ts +23 -23
  97. package/src/lib/db/db-mysql.ts +249 -250
  98. package/src/lib/db/db-sqlite.ts +101 -101
  99. package/src/lib/db/db.spec.ts +28 -28
  100. package/src/lib/db/db.ts +325 -325
  101. package/src/lib/db/index.ts +5 -5
  102. package/src/lib/index.ts +3 -3
  103. package/src/lib/logger.spec.ts +214 -214
  104. package/src/lib/logger.ts +281 -281
  105. package/src/lib/runtime-require.ts +37 -37
  106. package/src/lib/utils/cookie-util.ts +34 -34
  107. package/src/lib/utils/crypto.ts +58 -58
  108. package/src/lib/utils/date-utils.ts +317 -317
  109. package/src/lib/utils/deep-merge.ts +37 -37
  110. package/src/lib/utils/delay.ts +12 -12
  111. package/src/lib/utils/file-setting.ts +55 -55
  112. package/src/lib/utils/format-bytes.ts +11 -11
  113. package/src/lib/utils/fs-utils.ts +158 -158
  114. package/src/lib/utils/get-env.ts +27 -27
  115. package/src/lib/utils/index.ts +12 -12
  116. package/src/lib/utils/is-type.ts +48 -48
  117. package/src/lib/utils/load-env.ts +14 -14
  118. package/src/lib/utils/pad.ts +6 -6
  119. package/src/models/api-base.ts +5 -5
  120. package/src/models/api-module-props.ts +10 -11
  121. package/src/models/api-router-props.ts +26 -26
  122. package/src/models/app-cache-props.ts +33 -33
  123. package/src/models/app-data-props.ts +10 -10
  124. package/src/models/app-helper-props.ts +6 -6
  125. package/src/models/app-shared-storage-props.ts +38 -38
  126. package/src/models/app-start-props.ts +18 -18
  127. package/src/models/async-storage-props.ts +13 -13
  128. package/src/models/db-config.ts +30 -30
  129. package/src/models/host-to-path-props.ts +12 -12
  130. package/src/models/index.ts +16 -16
  131. package/src/models/json-object.ts +8 -8
  132. package/src/models/locals-props.ts +36 -36
  133. package/src/models/logger-props.ts +84 -84
  134. package/src/models/simple-storage-props.ts +13 -14
  135. package/src/models/to-client-delivery-props.ts +6 -6
  136. package/tsconfig.json +115 -115
  137. 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
+ }