diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 92529e8fd..4851e677e 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -93,7 +93,7 @@ { divider: true, }, - { + hasPermission('dbops/model/edit') && { label: 'Drop table', isDrop: true, requiresWriteAccess: true, @@ -394,22 +394,22 @@ forceNewTab: true, icon: 'img perspective', }, - { + hasPermission('dbops/export') && { label: 'Export', isExport: true, functionName: 'tableReader', }, - { + hasPermission('dbops/model/edit') && { label: 'Drop collection', isDropCollection: true, requiresWriteAccess: true, }, - { + hasPermission('dbops/table/rename') && { label: 'Rename collection', isRenameCollection: true, requiresWriteAccess: true, }, - { + hasPermission('dbops/table/backup') && { label: 'Create collection backup', isDuplicateCollection: true, requiresWriteAccess: true, @@ -563,11 +563,11 @@ value: data.pureName, onConfirm: async newName => { const dbid = _.pick(data, ['conid', 'database']); - await apiCall('database-connections/run-script', { - ...dbid, - sql: `db.renameCollection('${data.pureName}', '${newName}')`, + runOperationOnDatabase(dbid, { + type: 'renameCollection', + collection: data.pureName, + newName, }); - apiCall('database-connections/sync-model', dbid); }, }); } else if (menu.isDuplicateCollection) { @@ -577,7 +577,11 @@ message: `Really create collection copy named ${newName}?`, onConfirm: async () => { const dbid = _.pick(data, ['conid', 'database']); - saveScriptToDatabase(dbid, `db.collection('${data.pureName}').aggregate([{$out: '${newName}'}]).toArray()`); + runOperationOnDatabase(dbid, { + type: 'cloneCollection', + collection: data.pureName, + newName, + }); }, }); } else if (menu.isDuplicateTable) { diff --git a/plugins/dbgate-plugin-mongo/src/backend/driver.js b/plugins/dbgate-plugin-mongo/src/backend/driver.js index e7433cadf..a077469c0 100644 --- a/plugins/dbgate-plugin-mongo/src/backend/driver.js +++ b/plugins/dbgate-plugin-mongo/src/backend/driver.js @@ -107,6 +107,15 @@ const driver = { case 'dropCollection': await this.script(pool, `db.dropCollection('${operation.collection}')`); break; + case 'renameCollection': + await this.script(pool, `db.renameCollection('${operation.collection}', '${operation.newName}')`); + break; + case 'cloneCollection': + await this.script( + pool, + `db.collection('${operation.collection}').aggregate([{$out: '${operation.newName}'}]).toArray()` + ); + break; default: throw new Error(`Operation type ${type} not supported`); }