dbgate-api-premium 6.8.2 → 7.0.0
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/package.json +5 -5
- package/src/controllers/databaseConnections.js +20 -0
- package/src/controllers/files.js +30 -2
- package/src/controllers/storage.js +100 -1
- package/src/controllers/storageDb.js +338 -28
- package/src/controllers/teamFiles.js +172 -19
- package/src/currentVersion.js +2 -2
- package/src/index.js +1 -0
- package/src/proc/databaseConnectionProcess.js +102 -0
- package/src/storageModel.js +215 -0
- package/src/utility/getDiagramExport.js +13 -5
|
@@ -15,6 +15,16 @@ const {
|
|
|
15
15
|
storageUpdateTeamFileAdmin,
|
|
16
16
|
storageDeleteFile,
|
|
17
17
|
storageCopyFile,
|
|
18
|
+
storageListAllAdminFolders,
|
|
19
|
+
storageGetExistingFolder,
|
|
20
|
+
storageUpdateTeamFolderAdmin,
|
|
21
|
+
storageDeleteFolder,
|
|
22
|
+
storageInsertTeamFolderAdmin,
|
|
23
|
+
storageListAllTeamFolders,
|
|
24
|
+
storageListTeamFoldersForUser,
|
|
25
|
+
storageListTeamFoldersForRole,
|
|
26
|
+
storageGetTeamFolderRoleAccess,
|
|
27
|
+
storageGetTeamFolderUserAccess,
|
|
18
28
|
} = require('./storageDb');
|
|
19
29
|
const { getBuiltinRoleIdFromRequest } = require('../auth/storageAuthProvider');
|
|
20
30
|
const socket = require('../utility/socket');
|
|
@@ -41,14 +51,16 @@ function deserialize(format, text) {
|
|
|
41
51
|
|
|
42
52
|
module.exports = {
|
|
43
53
|
createNew_meta: true,
|
|
44
|
-
async createNew({ fileType, file, data }, req) {
|
|
54
|
+
async createNew({ fileType, file, data, teamFolderId }, req) {
|
|
45
55
|
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
46
56
|
if (!hasPermission(`all-team-files/create`, loadedPermissions)) {
|
|
47
|
-
|
|
57
|
+
if (!(await this.checkFolderCreateAccess(teamFolderId, req, false))) {
|
|
58
|
+
throw new Error('No permission to create team files');
|
|
59
|
+
}
|
|
48
60
|
}
|
|
49
61
|
const userId = req?.user?.userId;
|
|
50
62
|
const metadata = extractFileMetadata(data, fileType);
|
|
51
|
-
const resp = await storageCreateTeamFile({ fileType, file, data, ownerUserId: userId, metadata });
|
|
63
|
+
const resp = await storageCreateTeamFile({ fileType, file, data, ownerUserId: userId, metadata, teamFolderId });
|
|
52
64
|
socket.emitChanged('team-files-changed');
|
|
53
65
|
return resp;
|
|
54
66
|
},
|
|
@@ -57,7 +69,7 @@ module.exports = {
|
|
|
57
69
|
async update({ teamFileId, data, name }, req) {
|
|
58
70
|
const existingFile = await storageGetExistingFile(teamFileId);
|
|
59
71
|
if (!existingFile) return false;
|
|
60
|
-
await this.
|
|
72
|
+
await this.checkFileWriteAccess(existingFile, req);
|
|
61
73
|
const metadata = extractFileMetadata(data, existingFile.type_name);
|
|
62
74
|
const resp = await storageUpdateTeamFile({ teamFileId, data, name, metadata });
|
|
63
75
|
socket.emitChanged('team-files-changed');
|
|
@@ -93,12 +105,53 @@ module.exports = {
|
|
|
93
105
|
allowRead: !!(item.allow_read || isOwner),
|
|
94
106
|
allowWrite: !!(item.allow_write || isOwner),
|
|
95
107
|
allowUse: !!(item.allow_use || isOwner),
|
|
108
|
+
teamFolderId: item.team_folder_id,
|
|
109
|
+
teamFolderName: item.team_folder_name,
|
|
110
|
+
};
|
|
111
|
+
}) || []
|
|
112
|
+
);
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
listFolders_meta: true,
|
|
116
|
+
async listFolders(_params, req) {
|
|
117
|
+
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
118
|
+
let res = [];
|
|
119
|
+
const createAll = hasPermission(`all-team-files/create`, loadedPermissions);
|
|
120
|
+
const readAll = hasPermission(`all-team-files/read`, loadedPermissions);
|
|
121
|
+
const writeAll = hasPermission(`all-team-files/write`, loadedPermissions);
|
|
122
|
+
const useAll = hasPermission(`all-team-files/use`, loadedPermissions);
|
|
123
|
+
if (readAll || writeAll || useAll || createAll) {
|
|
124
|
+
res = await storageListAllTeamFolders();
|
|
125
|
+
res = res?.map(item => ({
|
|
126
|
+
...item,
|
|
127
|
+
allow_create: createAll,
|
|
128
|
+
allow_read: readAll,
|
|
129
|
+
allow_write: writeAll,
|
|
130
|
+
allow_use: useAll,
|
|
131
|
+
}));
|
|
132
|
+
} else {
|
|
133
|
+
const userId = req?.user?.userId;
|
|
134
|
+
if (userId) {
|
|
135
|
+
res = await storageListTeamFoldersForUser(userId);
|
|
136
|
+
} else {
|
|
137
|
+
res = await storageListTeamFoldersForRole(getBuiltinRoleIdFromRequest(req));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return (
|
|
141
|
+
res?.map(item => {
|
|
142
|
+
return {
|
|
143
|
+
teamFolderId: item.id,
|
|
144
|
+
folder: item.folder_name,
|
|
145
|
+
allowRead: !!item.allow_read,
|
|
146
|
+
allowWrite: !!item.allow_write,
|
|
147
|
+
allowUse: !!item.allow_use,
|
|
148
|
+
allowCreate: !!item.allow_create,
|
|
96
149
|
};
|
|
97
150
|
}) || []
|
|
98
151
|
);
|
|
99
152
|
},
|
|
100
153
|
|
|
101
|
-
async
|
|
154
|
+
async checkFileAccessCore(existingFile, req, throwError, accessType, accessField) {
|
|
102
155
|
const userId = req?.user?.userId;
|
|
103
156
|
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
104
157
|
|
|
@@ -110,15 +163,57 @@ module.exports = {
|
|
|
110
163
|
return true;
|
|
111
164
|
}
|
|
112
165
|
const roleId = getBuiltinRoleIdFromRequest(req);
|
|
113
|
-
const
|
|
114
|
-
|
|
166
|
+
const roleFileAccess = await storageGetTeamFileRoleAccess(existingFile.id, roleId);
|
|
167
|
+
const roleFolderAccess = await storageGetTeamFolderRoleAccess(existingFile.team_folder_id, roleId);
|
|
168
|
+
if (roleFileAccess[accessField] || roleFolderAccess[accessField]) {
|
|
115
169
|
return true;
|
|
116
170
|
}
|
|
117
171
|
if (existingFile.owner_user_id == userId && userId) {
|
|
118
172
|
return true;
|
|
119
173
|
}
|
|
120
174
|
if (existingFile.owner_user_id != userId && userId) {
|
|
121
|
-
const
|
|
175
|
+
const userFileAccess = await storageGetTeamFileUserAccess(existingFile.id, userId);
|
|
176
|
+
const userFolderAccess = await storageGetTeamFolderUserAccess(existingFile.team_folder_id, userId);
|
|
177
|
+
|
|
178
|
+
if (userFileAccess[accessField] || userFolderAccess[accessField]) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!throwError) return false;
|
|
184
|
+
throw new Error(`No permission to ${accessType} this team file`);
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
async checkFileReadAccess(existingFile, req, throwError = true) {
|
|
188
|
+
return await this.checkFileAccessCore(existingFile, req, throwError, 'read', 'allowRead');
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
async checkFileWriteAccess(existingFile, req, throwError = true) {
|
|
192
|
+
return await this.checkFileAccessCore(existingFile, req, throwError, 'write', 'allowWrite');
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
async checkFileUseAccess(existingFile, req, throwError = true) {
|
|
196
|
+
return await this.checkFileAccessCore(existingFile, req, throwError, 'use', 'allowUse');
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
async checkFolderAccessCore(existingFolderId, req, throwError, accessType, accessField) {
|
|
200
|
+
const userId = req?.user?.userId;
|
|
201
|
+
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
202
|
+
|
|
203
|
+
if (hasPermission(`admin/team-folders`, loadedPermissions)) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (hasPermission(`all-team-files/${accessType}`, loadedPermissions)) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
const roleId = getBuiltinRoleIdFromRequest(req);
|
|
211
|
+
const roleAccess = await storageGetTeamFolderRoleAccess(existingFolderId, roleId);
|
|
212
|
+
if (roleAccess[accessField]) {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
if (userId) {
|
|
216
|
+
const userAccess = await storageGetTeamFolderUserAccess(existingFolderId, userId);
|
|
122
217
|
|
|
123
218
|
if (userAccess[accessField]) {
|
|
124
219
|
return true;
|
|
@@ -129,16 +224,20 @@ module.exports = {
|
|
|
129
224
|
throw new Error(`No permission to ${accessType} this team file`);
|
|
130
225
|
},
|
|
131
226
|
|
|
132
|
-
async
|
|
133
|
-
return await this.
|
|
227
|
+
async checkFolderReadAccess(existingFolderId, req, throwError = true) {
|
|
228
|
+
return await this.checkFolderAccessCore(existingFolderId, req, throwError, 'read', 'allowRead');
|
|
134
229
|
},
|
|
135
230
|
|
|
136
|
-
async
|
|
137
|
-
return await this.
|
|
231
|
+
async checkFolderWriteAccess(existingFolderId, req, throwError = true) {
|
|
232
|
+
return await this.checkFolderAccessCore(existingFolderId, req, throwError, 'write', 'allowWrite');
|
|
138
233
|
},
|
|
139
234
|
|
|
140
|
-
async
|
|
141
|
-
return await this.
|
|
235
|
+
async checkFolderCreateAccess(existingFolderId, req, throwError = true) {
|
|
236
|
+
return await this.checkFolderAccessCore(existingFolderId, req, throwError, 'create', 'allowWrite');
|
|
237
|
+
},
|
|
238
|
+
|
|
239
|
+
async checkFolderUseAccess(existingFolderId, req, throwError = true) {
|
|
240
|
+
return await this.checkFolderAccessCore(existingFolderId, req, throwError, 'use', 'allowUse');
|
|
142
241
|
},
|
|
143
242
|
|
|
144
243
|
getContent_meta: true,
|
|
@@ -150,7 +249,7 @@ module.exports = {
|
|
|
150
249
|
if (existingFile.type_name == 'sql') {
|
|
151
250
|
const frontMatter = getSqlFrontMatter(existingFile.file_content, yaml);
|
|
152
251
|
if (frontMatter?.autoExecute) {
|
|
153
|
-
allowUse = await this.
|
|
252
|
+
allowUse = await this.checkFileUseAccess(existingFile, req, false);
|
|
154
253
|
if (allowUse) {
|
|
155
254
|
const useToken = jwt.sign(
|
|
156
255
|
{
|
|
@@ -168,7 +267,7 @@ module.exports = {
|
|
|
168
267
|
}
|
|
169
268
|
}
|
|
170
269
|
if (!allowUse) {
|
|
171
|
-
await this.
|
|
270
|
+
await this.checkFileReadAccess(existingFile, req);
|
|
172
271
|
}
|
|
173
272
|
return {
|
|
174
273
|
content: deserialize(existingFile.type_format, actualContent),
|
|
@@ -181,7 +280,7 @@ module.exports = {
|
|
|
181
280
|
async copy({ teamFileId, newName }, req) {
|
|
182
281
|
const existingFile = await storageGetExistingFile(teamFileId);
|
|
183
282
|
if (!existingFile) return false;
|
|
184
|
-
await this.
|
|
283
|
+
await this.checkFileReadAccess(existingFile, req);
|
|
185
284
|
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
186
285
|
if (!hasPermission(`all-team-files/create`, loadedPermissions)) {
|
|
187
286
|
throw new Error('No permission to create team files');
|
|
@@ -196,7 +295,7 @@ module.exports = {
|
|
|
196
295
|
async exportFile({ teamFileId, filePath }, req) {
|
|
197
296
|
const existingFile = await storageGetExistingFileWithContent(teamFileId);
|
|
198
297
|
if (!existingFile) return false;
|
|
199
|
-
await this.
|
|
298
|
+
await this.checkFileReadAccess(existingFile, req);
|
|
200
299
|
await fs.writeFile(filePath, existingFile.file_content);
|
|
201
300
|
return true;
|
|
202
301
|
},
|
|
@@ -205,12 +304,65 @@ module.exports = {
|
|
|
205
304
|
async delete({ teamFileId }, req) {
|
|
206
305
|
const existingFile = await storageGetExistingFile(teamFileId);
|
|
207
306
|
if (!existingFile) return false;
|
|
208
|
-
await this.
|
|
307
|
+
await this.checkFileWriteAccess(existingFile, req);
|
|
209
308
|
const resp = await storageDeleteFile(teamFileId);
|
|
210
309
|
socket.emitChanged('team-files-changed');
|
|
211
310
|
return resp;
|
|
212
311
|
},
|
|
213
312
|
|
|
313
|
+
listAdminFolders_meta: true,
|
|
314
|
+
async listAdminFolders({}, req) {
|
|
315
|
+
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
316
|
+
if (!hasPermission(`admin/team-folders`, loadedPermissions)) return [];
|
|
317
|
+
const res = await storageListAllAdminFolders();
|
|
318
|
+
return res.map(item => ({
|
|
319
|
+
id: item.id,
|
|
320
|
+
name: item.folder_name,
|
|
321
|
+
ownerLogin: item.owner_login,
|
|
322
|
+
ownerEmail: item.owner_email,
|
|
323
|
+
fileCount: item.file_count,
|
|
324
|
+
}));
|
|
325
|
+
},
|
|
326
|
+
|
|
327
|
+
getAdminFolder_meta: true,
|
|
328
|
+
async getAdminFolder({ id }, req) {
|
|
329
|
+
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
330
|
+
if (!hasPermission(`admin/team-folders`, loadedPermissions)) return false;
|
|
331
|
+
if (id == 'new') {
|
|
332
|
+
return { id: null, name: 'New team folder', ownerName: null };
|
|
333
|
+
}
|
|
334
|
+
const existingFolder = await storageGetExistingFolder(id);
|
|
335
|
+
if (!existingFolder) return false;
|
|
336
|
+
return {
|
|
337
|
+
id: existingFolder.id,
|
|
338
|
+
name: existingFolder.folder_name,
|
|
339
|
+
ownerName: existingFolder.owner_login,
|
|
340
|
+
};
|
|
341
|
+
},
|
|
342
|
+
|
|
343
|
+
setAdminFolder_meta: true,
|
|
344
|
+
async setAdminFolder({ id, name }, req) {
|
|
345
|
+
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
346
|
+
if (!hasPermission(`admin/team-folders`, loadedPermissions)) return false;
|
|
347
|
+
if (id) {
|
|
348
|
+
await storageUpdateTeamFolderAdmin({ teamFolderId: id, name });
|
|
349
|
+
} else {
|
|
350
|
+
await storageInsertTeamFolderAdmin({ name });
|
|
351
|
+
}
|
|
352
|
+
socket.emitChanged('team-folders-changed');
|
|
353
|
+
return true;
|
|
354
|
+
},
|
|
355
|
+
|
|
356
|
+
deleteAdminFolder_meta: true,
|
|
357
|
+
async deleteAdminFolder({ id }, req) {
|
|
358
|
+
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
359
|
+
if (!hasPermission(`admin/team-folders`, loadedPermissions)) return false;
|
|
360
|
+
if (id < 0 || !id) return false;
|
|
361
|
+
await storageDeleteFolder(id);
|
|
362
|
+
socket.emitChanged('team-folders-changed');
|
|
363
|
+
return true;
|
|
364
|
+
},
|
|
365
|
+
|
|
214
366
|
listAdminFiles_meta: true,
|
|
215
367
|
async listAdminFiles({}, req) {
|
|
216
368
|
const loadedPermissions = await loadPermissionsFromRequest(req);
|
|
@@ -222,6 +374,7 @@ module.exports = {
|
|
|
222
374
|
ownerLogin: item.owner_login,
|
|
223
375
|
ownerEmail: item.owner_email,
|
|
224
376
|
typeName: item.type_name,
|
|
377
|
+
folderName: item.folder_name,
|
|
225
378
|
}));
|
|
226
379
|
},
|
|
227
380
|
|
package/src/currentVersion.js
CHANGED
package/src/index.js
CHANGED
|
@@ -147,6 +147,7 @@ const shell = require('./shell/index');
|
|
|
147
147
|
global.DBGATE_PACKAGES = {
|
|
148
148
|
'dbgate-tools': require('dbgate-tools'),
|
|
149
149
|
'dbgate-sqltree': require('dbgate-sqltree'),
|
|
150
|
+
'dbgate-datalib': require('dbgate-datalib'),
|
|
150
151
|
};
|
|
151
152
|
|
|
152
153
|
if (processArgs.startProcess) {
|
|
@@ -368,6 +368,107 @@ async function handleSaveTableData({ msgid, changeSet }) {
|
|
|
368
368
|
}
|
|
369
369
|
}
|
|
370
370
|
|
|
371
|
+
async function handleMultiCallMethod({ msgid, callList }) {
|
|
372
|
+
try {
|
|
373
|
+
const driver = requireEngineDriver(storedConnection);
|
|
374
|
+
await driver.invokeMethodCallList(dbhan, callList);
|
|
375
|
+
|
|
376
|
+
// for (const change of changeSet.changes) {
|
|
377
|
+
// if (change.type === 'string') {
|
|
378
|
+
// await driver.query(dbhan, `SET "${change.key}" "${change.value}"`);
|
|
379
|
+
// } else if (change.type === 'json') {
|
|
380
|
+
// await driver.query(dbhan, `JSON.SET "${change.key}" $ '${change.value.replace(/'/g, "\\'")}'`);
|
|
381
|
+
// } else if (change.type === 'hash') {
|
|
382
|
+
// if (change.updates && Array.isArray(change.updates)) {
|
|
383
|
+
// for (const update of change.updates) {
|
|
384
|
+
// await driver.query(dbhan, `HSET "${change.key}" "${update.key}" "${update.value}"`);
|
|
385
|
+
|
|
386
|
+
// if (update.ttl !== undefined && update.ttl !== null && update.ttl !== -1) {
|
|
387
|
+
// try {
|
|
388
|
+
// await dbhan.client.call('HEXPIRE', change.key, update.ttl, 'FIELDS', 1, update.key);
|
|
389
|
+
// } catch (e) {}
|
|
390
|
+
// }
|
|
391
|
+
// }
|
|
392
|
+
// }
|
|
393
|
+
// if (change.inserts && Array.isArray(change.inserts)) {
|
|
394
|
+
// for (const insert of change.inserts) {
|
|
395
|
+
// await driver.query(dbhan, `HSET "${change.key}" "${insert.key}" "${insert.value}"`);
|
|
396
|
+
|
|
397
|
+
// if (insert.ttl !== undefined && insert.ttl !== null && insert.ttl !== -1) {
|
|
398
|
+
// try {
|
|
399
|
+
// await dbhan.client.call('HEXPIRE', change.key, insert.ttl, 'FIELDS', 1, insert.key);
|
|
400
|
+
// } catch (e) {}
|
|
401
|
+
// }
|
|
402
|
+
// }
|
|
403
|
+
// }
|
|
404
|
+
// if (change.deletes && Array.isArray(change.deletes)) {
|
|
405
|
+
// for (const delKey of change.deletes) {
|
|
406
|
+
// await driver.query(dbhan, `HDEL "${change.key}" "${delKey}"`);
|
|
407
|
+
// }
|
|
408
|
+
// }
|
|
409
|
+
// } else if (change.type === 'zset') {
|
|
410
|
+
// if (change.updates && Array.isArray(change.updates)) {
|
|
411
|
+
// for (const update of change.updates) {
|
|
412
|
+
// await driver.query(dbhan, `ZADD "${change.key}" ${update.score} "${update.member}"`);
|
|
413
|
+
// }
|
|
414
|
+
// }
|
|
415
|
+
// if (change.inserts && Array.isArray(change.inserts)) {
|
|
416
|
+
// for (const insert of change.inserts) {
|
|
417
|
+
// await driver.query(dbhan, `ZADD "${change.key}" ${insert.score} "${insert.member}"`);
|
|
418
|
+
// }
|
|
419
|
+
// }
|
|
420
|
+
// if (change.deletes && Array.isArray(change.deletes)) {
|
|
421
|
+
// for (const delMember of change.deletes) {
|
|
422
|
+
// await driver.query(dbhan, `ZREM "${change.key}" "${delMember}"`);
|
|
423
|
+
// }
|
|
424
|
+
// }
|
|
425
|
+
// } else if (change.type === 'list') {
|
|
426
|
+
// if (change.updates && Array.isArray(change.updates)) {
|
|
427
|
+
// for (const update of change.updates) {
|
|
428
|
+
// await driver.query(dbhan, `LSET "${change.key}" ${update.index} "${update.value}"`);
|
|
429
|
+
// }
|
|
430
|
+
// }
|
|
431
|
+
// if (change.inserts && Array.isArray(change.inserts)) {
|
|
432
|
+
// for (const insert of change.inserts) {
|
|
433
|
+
// await driver.query(dbhan, `RPUSH "${change.key}" "${insert.value}"`);
|
|
434
|
+
// }
|
|
435
|
+
// }
|
|
436
|
+
// } else if (change.type === 'set') {
|
|
437
|
+
// if (change.inserts && Array.isArray(change.inserts)) {
|
|
438
|
+
// for (const insert of change.inserts) {
|
|
439
|
+
// await driver.query(dbhan, `SADD "${change.key}" "${insert.value}"`);
|
|
440
|
+
// }
|
|
441
|
+
// }
|
|
442
|
+
// if (change.deletes && Array.isArray(change.deletes)) {
|
|
443
|
+
// for (const delValue of change.deletes) {
|
|
444
|
+
// await driver.query(dbhan, `SREM "${change.key}" "${delValue}"`);
|
|
445
|
+
// }
|
|
446
|
+
// }
|
|
447
|
+
// } else if (change.type === 'stream') {
|
|
448
|
+
// if (change.inserts && Array.isArray(change.inserts)) {
|
|
449
|
+
// for (const insert of change.inserts) {
|
|
450
|
+
// const streamId = insert.id === '*' || !insert.id ? '*' : insert.id;
|
|
451
|
+
// await driver.query(dbhan, `XADD "${change.key}" ${streamId} value "${insert.value}"`);
|
|
452
|
+
// }
|
|
453
|
+
// }
|
|
454
|
+
// if (change.deletes && Array.isArray(change.deletes)) {
|
|
455
|
+
// for (const delId of change.deletes) {
|
|
456
|
+
// await driver.query(dbhan, `XDEL "${change.key}" "${delId}"`);
|
|
457
|
+
// }
|
|
458
|
+
// }
|
|
459
|
+
// }
|
|
460
|
+
// }
|
|
461
|
+
|
|
462
|
+
process.send({ msgtype: 'response', msgid });
|
|
463
|
+
} catch (err) {
|
|
464
|
+
process.send({
|
|
465
|
+
msgtype: 'response',
|
|
466
|
+
msgid,
|
|
467
|
+
errorMessage: extractErrorMessage(err, 'Error saving Redis data'),
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
371
472
|
async function handleSqlPreview({ msgid, objects, options }) {
|
|
372
473
|
await waitStructure();
|
|
373
474
|
const driver = requireEngineDriver(storedConnection);
|
|
@@ -501,6 +602,7 @@ const messageHandlers = {
|
|
|
501
602
|
schemaList: handleSchemaList,
|
|
502
603
|
executeSessionQuery: handleExecuteSessionQuery,
|
|
503
604
|
evalJsonScript: handleEvalJsonScript,
|
|
605
|
+
multiCallMethod: handleMultiCallMethod,
|
|
504
606
|
// runCommand: handleRunCommand,
|
|
505
607
|
};
|
|
506
608
|
|
package/src/storageModel.js
CHANGED
|
@@ -1498,6 +1498,86 @@ module.exports = {
|
|
|
1498
1498
|
]
|
|
1499
1499
|
}
|
|
1500
1500
|
},
|
|
1501
|
+
{
|
|
1502
|
+
"pureName": "role_team_folders",
|
|
1503
|
+
"columns": [
|
|
1504
|
+
{
|
|
1505
|
+
"pureName": "role_team_folders",
|
|
1506
|
+
"columnName": "id",
|
|
1507
|
+
"dataType": "int",
|
|
1508
|
+
"autoIncrement": true,
|
|
1509
|
+
"notNull": true
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"pureName": "role_team_folders",
|
|
1513
|
+
"columnName": "role_id",
|
|
1514
|
+
"dataType": "int",
|
|
1515
|
+
"notNull": true
|
|
1516
|
+
},
|
|
1517
|
+
{
|
|
1518
|
+
"pureName": "role_team_folders",
|
|
1519
|
+
"columnName": "team_folder_id",
|
|
1520
|
+
"dataType": "int",
|
|
1521
|
+
"notNull": true
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
"pureName": "role_team_folders",
|
|
1525
|
+
"columnName": "allow_read_files",
|
|
1526
|
+
"dataType": "int",
|
|
1527
|
+
"notNull": false
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
"pureName": "role_team_folders",
|
|
1531
|
+
"columnName": "allow_write_files",
|
|
1532
|
+
"dataType": "int",
|
|
1533
|
+
"notNull": false
|
|
1534
|
+
},
|
|
1535
|
+
{
|
|
1536
|
+
"pureName": "role_team_folders",
|
|
1537
|
+
"columnName": "allow_use_files",
|
|
1538
|
+
"dataType": "int",
|
|
1539
|
+
"notNull": false
|
|
1540
|
+
}
|
|
1541
|
+
],
|
|
1542
|
+
"foreignKeys": [
|
|
1543
|
+
{
|
|
1544
|
+
"constraintType": "foreignKey",
|
|
1545
|
+
"constraintName": "FK_role_team_folders_role_id",
|
|
1546
|
+
"pureName": "role_team_folders",
|
|
1547
|
+
"refTableName": "roles",
|
|
1548
|
+
"deleteAction": "CASCADE",
|
|
1549
|
+
"columns": [
|
|
1550
|
+
{
|
|
1551
|
+
"columnName": "role_id",
|
|
1552
|
+
"refColumnName": "id"
|
|
1553
|
+
}
|
|
1554
|
+
]
|
|
1555
|
+
},
|
|
1556
|
+
{
|
|
1557
|
+
"constraintType": "foreignKey",
|
|
1558
|
+
"constraintName": "FK_role_team_folders_team_folder_id",
|
|
1559
|
+
"pureName": "role_team_folders",
|
|
1560
|
+
"refTableName": "team_folders",
|
|
1561
|
+
"deleteAction": "CASCADE",
|
|
1562
|
+
"columns": [
|
|
1563
|
+
{
|
|
1564
|
+
"columnName": "team_folder_id",
|
|
1565
|
+
"refColumnName": "id"
|
|
1566
|
+
}
|
|
1567
|
+
]
|
|
1568
|
+
}
|
|
1569
|
+
],
|
|
1570
|
+
"primaryKey": {
|
|
1571
|
+
"pureName": "role_team_folders",
|
|
1572
|
+
"constraintType": "primaryKey",
|
|
1573
|
+
"constraintName": "PK_role_team_folders",
|
|
1574
|
+
"columns": [
|
|
1575
|
+
{
|
|
1576
|
+
"columnName": "id"
|
|
1577
|
+
}
|
|
1578
|
+
]
|
|
1579
|
+
}
|
|
1580
|
+
},
|
|
1501
1581
|
{
|
|
1502
1582
|
"pureName": "table_permission_roles",
|
|
1503
1583
|
"columns": [
|
|
@@ -1655,6 +1735,14 @@ module.exports = {
|
|
|
1655
1735
|
"columnName": "metadata",
|
|
1656
1736
|
"dataType": "varchar(1000)",
|
|
1657
1737
|
"notNull": false
|
|
1738
|
+
},
|
|
1739
|
+
{
|
|
1740
|
+
"pureName": "team_files",
|
|
1741
|
+
"columnName": "team_folder_id",
|
|
1742
|
+
"dataType": "int",
|
|
1743
|
+
"notNull": true,
|
|
1744
|
+
"defaultValue": -1,
|
|
1745
|
+
"defaultConstraint": "DF_team_files_team_folder_id"
|
|
1658
1746
|
}
|
|
1659
1747
|
],
|
|
1660
1748
|
"foreignKeys": [
|
|
@@ -1681,6 +1769,18 @@ module.exports = {
|
|
|
1681
1769
|
"refColumnName": "id"
|
|
1682
1770
|
}
|
|
1683
1771
|
]
|
|
1772
|
+
},
|
|
1773
|
+
{
|
|
1774
|
+
"constraintType": "foreignKey",
|
|
1775
|
+
"constraintName": "FK_team_files_team_folder_id",
|
|
1776
|
+
"pureName": "team_files",
|
|
1777
|
+
"refTableName": "team_folders",
|
|
1778
|
+
"columns": [
|
|
1779
|
+
{
|
|
1780
|
+
"columnName": "team_folder_id",
|
|
1781
|
+
"refColumnName": "id"
|
|
1782
|
+
}
|
|
1783
|
+
]
|
|
1684
1784
|
}
|
|
1685
1785
|
],
|
|
1686
1786
|
"primaryKey": {
|
|
@@ -1765,6 +1865,41 @@ module.exports = {
|
|
|
1765
1865
|
}
|
|
1766
1866
|
]
|
|
1767
1867
|
},
|
|
1868
|
+
{
|
|
1869
|
+
"pureName": "team_folders",
|
|
1870
|
+
"columns": [
|
|
1871
|
+
{
|
|
1872
|
+
"pureName": "team_folders",
|
|
1873
|
+
"columnName": "id",
|
|
1874
|
+
"dataType": "int",
|
|
1875
|
+
"autoIncrement": true,
|
|
1876
|
+
"notNull": true
|
|
1877
|
+
},
|
|
1878
|
+
{
|
|
1879
|
+
"pureName": "team_folders",
|
|
1880
|
+
"columnName": "folder_name",
|
|
1881
|
+
"dataType": "varchar(250)",
|
|
1882
|
+
"notNull": false
|
|
1883
|
+
}
|
|
1884
|
+
],
|
|
1885
|
+
"foreignKeys": [],
|
|
1886
|
+
"primaryKey": {
|
|
1887
|
+
"pureName": "team_folders",
|
|
1888
|
+
"constraintType": "primaryKey",
|
|
1889
|
+
"constraintName": "PK_team_folders",
|
|
1890
|
+
"columns": [
|
|
1891
|
+
{
|
|
1892
|
+
"columnName": "id"
|
|
1893
|
+
}
|
|
1894
|
+
]
|
|
1895
|
+
},
|
|
1896
|
+
"preloadedRows": [
|
|
1897
|
+
{
|
|
1898
|
+
"id": -1,
|
|
1899
|
+
"folder_name": "default"
|
|
1900
|
+
}
|
|
1901
|
+
]
|
|
1902
|
+
},
|
|
1768
1903
|
{
|
|
1769
1904
|
"pureName": "users",
|
|
1770
1905
|
"columns": [
|
|
@@ -2363,6 +2498,86 @@ module.exports = {
|
|
|
2363
2498
|
}
|
|
2364
2499
|
]
|
|
2365
2500
|
}
|
|
2501
|
+
},
|
|
2502
|
+
{
|
|
2503
|
+
"pureName": "user_team_folders",
|
|
2504
|
+
"columns": [
|
|
2505
|
+
{
|
|
2506
|
+
"pureName": "user_team_folders",
|
|
2507
|
+
"columnName": "id",
|
|
2508
|
+
"dataType": "int",
|
|
2509
|
+
"autoIncrement": true,
|
|
2510
|
+
"notNull": true
|
|
2511
|
+
},
|
|
2512
|
+
{
|
|
2513
|
+
"pureName": "user_team_folders",
|
|
2514
|
+
"columnName": "user_id",
|
|
2515
|
+
"dataType": "int",
|
|
2516
|
+
"notNull": true
|
|
2517
|
+
},
|
|
2518
|
+
{
|
|
2519
|
+
"pureName": "user_team_folders",
|
|
2520
|
+
"columnName": "team_folder_id",
|
|
2521
|
+
"dataType": "int",
|
|
2522
|
+
"notNull": true
|
|
2523
|
+
},
|
|
2524
|
+
{
|
|
2525
|
+
"pureName": "user_team_folders",
|
|
2526
|
+
"columnName": "allow_read_files",
|
|
2527
|
+
"dataType": "int",
|
|
2528
|
+
"notNull": false
|
|
2529
|
+
},
|
|
2530
|
+
{
|
|
2531
|
+
"pureName": "user_team_folders",
|
|
2532
|
+
"columnName": "allow_write_files",
|
|
2533
|
+
"dataType": "int",
|
|
2534
|
+
"notNull": false
|
|
2535
|
+
},
|
|
2536
|
+
{
|
|
2537
|
+
"pureName": "user_team_folders",
|
|
2538
|
+
"columnName": "allow_use_files",
|
|
2539
|
+
"dataType": "int",
|
|
2540
|
+
"notNull": false
|
|
2541
|
+
}
|
|
2542
|
+
],
|
|
2543
|
+
"foreignKeys": [
|
|
2544
|
+
{
|
|
2545
|
+
"constraintType": "foreignKey",
|
|
2546
|
+
"constraintName": "FK_user_team_folders_user_id",
|
|
2547
|
+
"pureName": "user_team_folders",
|
|
2548
|
+
"refTableName": "users",
|
|
2549
|
+
"deleteAction": "CASCADE",
|
|
2550
|
+
"columns": [
|
|
2551
|
+
{
|
|
2552
|
+
"columnName": "user_id",
|
|
2553
|
+
"refColumnName": "id"
|
|
2554
|
+
}
|
|
2555
|
+
]
|
|
2556
|
+
},
|
|
2557
|
+
{
|
|
2558
|
+
"constraintType": "foreignKey",
|
|
2559
|
+
"constraintName": "FK_user_team_folders_team_folder_id",
|
|
2560
|
+
"pureName": "user_team_folders",
|
|
2561
|
+
"refTableName": "team_folders",
|
|
2562
|
+
"deleteAction": "CASCADE",
|
|
2563
|
+
"columns": [
|
|
2564
|
+
{
|
|
2565
|
+
"columnName": "team_folder_id",
|
|
2566
|
+
"refColumnName": "id"
|
|
2567
|
+
}
|
|
2568
|
+
]
|
|
2569
|
+
}
|
|
2570
|
+
],
|
|
2571
|
+
"primaryKey": {
|
|
2572
|
+
"pureName": "user_team_folders",
|
|
2573
|
+
"constraintType": "primaryKey",
|
|
2574
|
+
"constraintName": "PK_user_team_folders",
|
|
2575
|
+
"columns": [
|
|
2576
|
+
{
|
|
2577
|
+
"columnName": "id"
|
|
2578
|
+
}
|
|
2579
|
+
]
|
|
2580
|
+
}
|
|
2366
2581
|
}
|
|
2367
2582
|
],
|
|
2368
2583
|
"collections": [],
|