diff --git a/package.json b/package.json index 8d2dabe31..c88a0a4ff 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ ], "scripts": { "start:api": "yarn workspace @dbgate/api start", + "start:api:portal": "yarn workspace @dbgate/api start:portal", "start:web": "yarn workspace @dbgate/web start", "start:sqltree": "yarn workspace @dbgate/sqltree start", "start:datalib": "yarn workspace @dbgate/datalib start", diff --git a/packages/api/package.json b/packages/api/package.json index ed1116819..e1bad682d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -24,6 +24,7 @@ }, "scripts": { "start": "nodemon src/index.js", + "start:portal": "cross-env CONNECTIONS=mysql LABEL_mysql=localhost-mysql SERVER_mysql=localhost USER_mysql=root PASSWORD_mysql=test PORT_mysql=3307 ENGINE_mysql=mysql nodemon src/index.js", "ts": "tsc", "build": "webpack" }, diff --git a/packages/api/src/controllers/config.js b/packages/api/src/controllers/config.js new file mode 100644 index 000000000..d20b44897 --- /dev/null +++ b/packages/api/src/controllers/config.js @@ -0,0 +1,8 @@ +module.exports = { + get_meta: 'get', + async get() { + return { + runAsPortal: !!process.env.CONNECTIONS, + }; + }, +}; diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index 3e2c8d331..59c01a58d 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -6,19 +6,37 @@ const nedb = require('nedb-promises'); const { datadir } = require('../utility/directories'); const socket = require('../utility/socket'); +function getPortalCollections() { + if (process.env.CONNECTIONS) { + return _.compact(process.env.CONNECTIONS.split(',')).map((id) => ({ + _id: id, + engine: process.env[`ENGINE_${id}`], + server: process.env[`SERVER_${id}`], + user: process.env[`USER_${id}`], + password: process.env[`PASSWORD_${id}`], + port: process.env[`PORT_${id}`], + displayName: process.env[`LABEL_${id}`], + })); + } + return null; +} +const portalConnections = getPortalCollections(); + module.exports = { datastore: null, opened: [], async _init() { const dir = datadir(); - // @ts-ignore - this.datastore = nedb.create(path.join(dir, 'connections.jsonl')); + if (!portalConnections) { + // @ts-ignore + this.datastore = nedb.create(path.join(dir, 'connections.jsonl')); + } }, list_meta: 'get', async list() { - return this.datastore.find(); + return portalConnections || this.datastore.find(); }, test_meta: { @@ -39,6 +57,7 @@ module.exports = { save_meta: 'post', async save(connection) { + if (portalConnections) return; let res; if (connection._id) { res = await this.datastore.update(_.pick(connection, '_id'), connection); @@ -51,6 +70,7 @@ module.exports = { delete_meta: 'post', async delete(connection) { + if (portalConnections) return; const res = await this.datastore.remove(_.pick(connection, '_id')); socket.emitChanged('connection-list-changed'); return res; @@ -58,6 +78,7 @@ module.exports = { get_meta: 'get', async get({ conid }) { + if (portalConnections) return portalConnections.find((x) => x._id == conid); const res = await this.datastore.find({ _id: conid }); return res[0]; }, diff --git a/packages/api/src/main.js b/packages/api/src/main.js index ed7e29feb..9e829634f 100644 --- a/packages/api/src/main.js +++ b/packages/api/src/main.js @@ -16,6 +16,7 @@ const databaseConnections = require('./controllers/databaseConnections'); const metadata = require('./controllers/metadata'); const sessions = require('./controllers/sessions'); const jsldata = require('./controllers/jsldata'); +const config = require('./controllers/config'); function start(argument = null) { console.log('process.argv', process.argv); @@ -34,6 +35,7 @@ function start(argument = null) { useController(app, '/metadata', metadata); useController(app, '/sessions', sessions); useController(app, '/jsldata', jsldata); + useController(app, '/config', config); if (fs.existsSync('/home/dbgate-docker/build')) { // server static files inside docker container diff --git a/packages/web/src/appobj/connectionAppObject.js b/packages/web/src/appobj/connectionAppObject.js index fcbd76564..c8172a321 100644 --- a/packages/web/src/appobj/connectionAppObject.js +++ b/packages/web/src/appobj/connectionAppObject.js @@ -7,8 +7,10 @@ import ConnectionModal from '../modals/ConnectionModal'; import axios from '../utility/axios'; import { filterName } from '@dbgate/datalib'; import ConfirmModal from '../modals/ConfirmModal'; +import { useConfig } from '../utility/metadataLoaders'; function Menu({ data, setOpenedConnections, openedConnections }) { + const config = useConfig(); const handleEdit = () => { showModal((modalState) => ); }; @@ -27,10 +29,18 @@ function Menu({ data, setOpenedConnections, openedConnections }) { const handleDisconnect = () => { setOpenedConnections((list) => list.filter((x) => x != data._id)); }; + const handleConnect = () => { + setOpenedConnections((list) => [...list, data._id]); + }; return ( <> - Edit - Delete + {config.runAsPortal == false && ( + <> + Edit + Delete + + )} + {!openedConnections.includes(data._id) && Connect} {openedConnections.includes(data._id) && data.status && ( Refresh )} diff --git a/packages/web/src/utility/metadataLoaders.js b/packages/web/src/utility/metadataLoaders.js index ad8518320..cccac1948 100644 --- a/packages/web/src/utility/metadataLoaders.js +++ b/packages/web/src/utility/metadataLoaders.js @@ -40,6 +40,12 @@ const connectionInfoLoader = ({ conid }) => ({ reloadTrigger: 'connection-list-changed', }); +const configLoader = () => ({ + url: 'config/get', + params: {}, + reloadTrigger: 'config-changed', +}); + // const sqlObjectListLoader = ({ conid, database }) => ({ // url: 'metadata/list-objects', // params: { conid, database }, @@ -204,3 +210,10 @@ export function getConnectionList() { export function useConnectionList() { return useCore(connectionListLoader, {}); } + +export function getConfig() { + return getCore(configLoader, {}) || {}; +} +export function useConfig() { + return useCore(configLoader, {}) || {}; +} diff --git a/packages/web/src/widgets/Toolbar.js b/packages/web/src/widgets/Toolbar.js index d9bfd48a8..a5dc70922 100644 --- a/packages/web/src/widgets/Toolbar.js +++ b/packages/web/src/widgets/Toolbar.js @@ -4,6 +4,7 @@ import ConnectionModal from '../modals/ConnectionModal'; import styled from 'styled-components'; import ToolbarButton from './ToolbarButton'; import useNewQuery from '../query/useNewQuery'; +import { useConfig } from '../utility/metadataLoaders'; const ToolbarContainer = styled.div` display: flex; @@ -13,13 +14,16 @@ const ToolbarContainer = styled.div` export default function ToolBar({ toolbarPortalRef }) { const modalState = useModalState(); const newQuery = useNewQuery(); + const config = useConfig(); return ( - - Add connection - + {config.runAsPortal == false && ( + + Add connection + + )} New Query