new permissions

This commit is contained in:
Jan Prochazka
2024-08-27 12:43:19 +02:00
parent db6d5f498b
commit 74adf1dd3f
3 changed files with 419 additions and 368 deletions

View File

@@ -295,16 +295,20 @@
isSqlOrDoc && !connection.isReadOnly && { onClick: handleImport, text: 'Import wizard' }, isSqlOrDoc && !connection.isReadOnly && { onClick: handleImport, text: 'Import wizard' },
isSqlOrDoc && { onClick: handleExport, text: 'Export wizard' }, isSqlOrDoc && { onClick: handleExport, text: 'Export wizard' },
driver?.databaseEngineTypes?.includes('sql') && driver?.databaseEngineTypes?.includes('sql') &&
hasPermission(`dbops/sql-dump/import`) &&
!connection.isReadOnly && { onClick: handleSqlRestore, text: 'Restore/import SQL dump' }, !connection.isReadOnly && { onClick: handleSqlRestore, text: 'Restore/import SQL dump' },
driver?.supportsDatabaseDump && { onClick: handleSqlDump, text: 'Backup/export SQL dump' }, driver?.supportsDatabaseDump &&
hasPermission(`dbops/sql-dump/export`) && { onClick: handleSqlDump, text: 'Backup/export SQL dump' },
isSqlOrDoc && isSqlOrDoc &&
!connection.isReadOnly && !connection.isReadOnly &&
!connection.singleDatabase && { onClick: handleDropDatabase, text: 'Drop database' }, !connection.singleDatabase && { onClick: handleDropDatabase, text: 'Drop database' },
{ divider: true }, { divider: true },
driver?.databaseEngineTypes?.includes('sql') && { onClick: handleCopyName, text: 'Copy database name' }, driver?.databaseEngineTypes?.includes('sql') && { onClick: handleCopyName, text: 'Copy database name' },
driver?.databaseEngineTypes?.includes('sql') && { onClick: handleShowDiagram, text: 'Show diagram' }, driver?.databaseEngineTypes?.includes('sql') && { onClick: handleShowDiagram, text: 'Show diagram' },
driver?.databaseEngineTypes?.includes('sql') && { onClick: handleSqlGenerator, text: 'SQL Generator' }, driver?.databaseEngineTypes?.includes('sql') &&
driver?.supportsDatabaseProfiler && { onClick: handleDatabaseProfiler, text: 'Database profiler' }, hasPermission(`dbops/sql-generator`) && { onClick: handleSqlGenerator, text: 'SQL Generator' },
driver?.supportsDatabaseProfiler &&
hasPermission(`dbops/profiler`) && { onClick: handleDatabaseProfiler, text: 'Database profiler' },
isSqlOrDoc && { onClick: handleOpenJsonModel, text: 'Open model as JSON' }, isSqlOrDoc && { onClick: handleOpenJsonModel, text: 'Open model as JSON' },
isSqlOrDoc && { onClick: handleExportModel, text: 'Export DB model - experimental' }, isSqlOrDoc && { onClick: handleExportModel, text: 'Export DB model - experimental' },
isSqlOrDoc && isSqlOrDoc &&
@@ -379,6 +383,7 @@
import ConfirmModal from '../modals/ConfirmModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte';
import { closeMultipleTabs } from '../tabpanel/TabsPanel.svelte'; import { closeMultipleTabs } from '../tabpanel/TabsPanel.svelte';
import NewCollectionModal from '../modals/NewCollectionModal.svelte'; import NewCollectionModal from '../modals/NewCollectionModal.svelte';
import hasPermission from '../utility/hasPermission';
export let data; export let data;
export let passProps; export let passProps;

View File

@@ -31,8 +31,34 @@
queries: 'QueryDataTab', queries: 'QueryDataTab',
}; };
const menus = { function createMenusCore(objectTypeField): {
tables: [ label?: string;
tab?: string;
forceNewTab?: boolean;
initialData?: any;
icon?: string;
isQueryDesigner?: boolean;
requiresWriteAccess?: boolean;
divider?: boolean;
isDrop?: boolean;
isRename?: boolean;
isTruncate?: boolean;
isCopyTableName?: boolean;
isDuplicateTable?: boolean;
isDiagram?: boolean;
functionName?: string;
isExport?: boolean;
isImport?: boolean;
isActiveChart?: boolean;
scriptTemplate?: string;
sqlGeneratorProps?: any;
isDropCollection?: boolean;
isRenameCollection?: boolean;
isDuplicateCollection?: boolean;
}[] {
switch (objectTypeField) {
case 'tables':
return [
{ {
label: 'Open data', label: 'Open data',
tab: 'TableDataTab', tab: 'TableDataTab',
@@ -145,8 +171,9 @@
insert: true, insert: true,
}, },
}, },
], ];
views: [ case 'views':
return [
{ {
label: 'Open data', label: 'Open data',
tab: 'ViewDataTab', tab: 'ViewDataTab',
@@ -214,8 +241,9 @@
dropViews: true, dropViews: true,
}, },
}, },
], ];
matviews: [ case 'matviews':
return [
{ {
label: 'Open data', label: 'Open data',
tab: 'ViewDataTab', tab: 'ViewDataTab',
@@ -276,15 +304,17 @@
dropMatviews: true, dropMatviews: true,
}, },
}, },
], ];
queries: [ case 'queries':
return [
{ {
label: 'Open data', label: 'Open data',
tab: 'QueryDataTab', tab: 'QueryDataTab',
forceNewTab: true, forceNewTab: true,
}, },
], ];
procedures: [ case 'procedures':
return [
{ {
label: 'Drop procedure', label: 'Drop procedure',
isDrop: true, isDrop: true,
@@ -313,8 +343,9 @@
dropProcedures: true, dropProcedures: true,
}, },
}, },
], ];
functions: [ case 'functions':
return [
{ {
label: 'Drop function', label: 'Drop function',
isDrop: true, isDrop: true,
@@ -339,8 +370,9 @@
dropFunctions: true, dropFunctions: true,
}, },
}, },
], ];
collections: [ case 'collections':
return [
{ {
label: 'Open data', label: 'Open data',
tab: 'CollectionDataTab', tab: 'CollectionDataTab',
@@ -393,8 +425,9 @@
label: 'JS: find()', label: 'JS: find()',
scriptTemplate: 'findCollection', scriptTemplate: 'findCollection',
}, },
], ];
}; }
}
async function databaseObjectMenuClickHandler(data, menu) { async function databaseObjectMenuClickHandler(data, menu) {
const getDriver = async () => { const getDriver = async () => {
@@ -605,6 +638,18 @@
} }
} }
function createMenus(objectTypeField): ReturnType<typeof createMenusCore> {
return createMenusCore(objectTypeField).filter(x => {
if (x.scriptTemplate) {
return hasPermission(`dbops/sql-template/${x.scriptTemplate}`);
}
if (x.sqlGeneratorProps) {
return hasPermission(`dbops/sql-generator`);
}
return true;
});
}
function getObjectTitle(connection, schemaName, pureName) { function getObjectTitle(connection, schemaName, pureName) {
const driver = findEngineDriver(connection, getExtensions()); const driver = findEngineDriver(connection, getExtensions());
@@ -656,7 +701,7 @@
const { schemaName, pureName, conid, database, objectTypeField } = data; const { schemaName, pureName, conid, database, objectTypeField } = data;
const configuredAction = getCurrentSettings()[`defaultAction.dbObjectClick.${objectTypeField}`]; const configuredAction = getCurrentSettings()[`defaultAction.dbObjectClick.${objectTypeField}`];
const overrideMenu = menus[objectTypeField].find(x => x.label && x.label == configuredAction); const overrideMenu = createMenus(objectTypeField).find(x => x.label && x.label == configuredAction);
if (overrideMenu) { if (overrideMenu) {
databaseObjectMenuClickHandler(data, overrideMenu); databaseObjectMenuClickHandler(data, overrideMenu);
return; return;
@@ -691,7 +736,7 @@
export function createDatabaseObjectMenu(data, connection = null) { export function createDatabaseObjectMenu(data, connection = null) {
const { objectTypeField } = data; const { objectTypeField } = data;
return menus[objectTypeField] return createMenus(objectTypeField)
.filter(x => x) .filter(x => x)
.map(menu => { .map(menu => {
if (menu.divider) return menu; if (menu.divider) return menu;
@@ -797,6 +842,7 @@
import { extractShellConnection } from '../impexp/createImpExpScript'; import { extractShellConnection } from '../impexp/createImpExpScript';
import { format as dateFormat } from 'date-fns'; import { format as dateFormat } from 'date-fns';
import { getDefaultFileFormat } from '../plugins/fileformats'; import { getDefaultFileFormat } from '../plugins/fileformats';
import hasPermission from '../utility/hasPermission';
export let data; export let data;
export let passProps; export let passProps;

View File

@@ -504,7 +504,7 @@ registerCommand({
name: 'SQL Generator', name: 'SQL Generator',
toolbar: true, toolbar: true,
icon: 'icon sql-generator', icon: 'icon sql-generator',
testEnabled: () => getCurrentDatabase() != null, testEnabled: () => getCurrentDatabase() != null && hasPermission(`dbops/sql-generator`),
onClick: () => onClick: () =>
showModal(SqlGeneratorModal, { showModal(SqlGeneratorModal, {
conid: getCurrentDatabase()?.connection?._id, conid: getCurrentDatabase()?.connection?._id,