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.
@@ -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
- throw new Error('No permission to create team files');
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.checkWriteAccess(existingFile, req);
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 checkAccessCore(existingFile, req, throwError, accessType, accessField) {
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 roleAccess = await storageGetTeamFileRoleAccess(existingFile.id, roleId);
114
- if (roleAccess[accessField]) {
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 userAccess = await storageGetTeamFileUserAccess(existingFile.id, userId);
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 checkReadAccess(existingFile, req, throwError = true) {
133
- return await this.checkAccessCore(existingFile, req, throwError, 'read', 'allowRead');
227
+ async checkFolderReadAccess(existingFolderId, req, throwError = true) {
228
+ return await this.checkFolderAccessCore(existingFolderId, req, throwError, 'read', 'allowRead');
134
229
  },
135
230
 
136
- async checkWriteAccess(existingFile, req, throwError = true) {
137
- return await this.checkAccessCore(existingFile, req, throwError, 'write', 'allowWrite');
231
+ async checkFolderWriteAccess(existingFolderId, req, throwError = true) {
232
+ return await this.checkFolderAccessCore(existingFolderId, req, throwError, 'write', 'allowWrite');
138
233
  },
139
234
 
140
- async checkUseAccess(existingFile, req, throwError = true) {
141
- return await this.checkAccessCore(existingFile, req, throwError, 'use', 'allowUse');
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.checkUseAccess(existingFile, req, false);
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.checkReadAccess(existingFile, req);
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.checkReadAccess(existingFile, req);
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.checkReadAccess(existingFile, req);
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.checkWriteAccess(existingFile, req);
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
 
@@ -1,5 +1,5 @@
1
1
 
2
2
  module.exports = {
3
- version: '6.8.2',
4
- buildTime: '2025-12-29T13:10:42.923Z'
3
+ version: '7.0.0',
4
+ buildTime: '2026-01-22T09:09:52.304Z'
5
5
  };
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
 
@@ -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": [],