From 197ccef2283ce406c4b0f7fc556a6489632beb37 Mon Sep 17 00:00:00 2001 From: magicwind <2814461814@qq.com> Date: Sun, 10 Mar 2024 09:21:04 +0800 Subject: [PATCH 1/3] feat: add file watch --- .gitignore | 5 +++- packages/api/.env | 6 ++-- packages/api/src/controllers/config.js | 2 +- packages/api/src/controllers/connections.js | 6 +--- packages/api/src/utility/JsonLinesDatabase.js | 28 +++++++++++++++++++ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 686ceb6c63..38c8fa2772 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,7 @@ yarn-error.log* app/src/nativeModulesContent.js packages/api/src/nativeModulesContent.js packages/api/src/packagedPluginsContent.js -.VSCodeCounter \ No newline at end of file +.VSCodeCounter + +.idea +packages/api/data \ No newline at end of file diff --git a/packages/api/.env b/packages/api/.env index b438b9fba6..e20a0bf5a3 100644 --- a/packages/api/.env +++ b/packages/api/.env @@ -1,12 +1,13 @@ DEVMODE=1 SHELL_SCRIPTING=1 +DEVWEB=1 +runAsPortal=1 +WORKSPACE_DIR=./data # PERMISSIONS=~widgets/app,~widgets/plugins # DISABLE_SHELL=1 # HIDE_APP_EDITOR=1 - -# DEVWEB=1 # LOGINS=admin,test # LOGIN_PASSWORD_admin=admin @@ -14,4 +15,3 @@ SHELL_SCRIPTING=1 # LOGIN_PASSWORD_test=test # LOGIN_PERMISSIONS_test=~*, widgets/database -# WORKSPACE_DIR=/home/jena/dbgate-data-2 diff --git a/packages/api/src/controllers/config.js b/packages/api/src/controllers/config.js index c19c31f837..7811f68e52 100644 --- a/packages/api/src/controllers/config.js +++ b/packages/api/src/controllers/config.js @@ -34,7 +34,7 @@ module.exports = { const permissions = login ? login.permissions : process.env.PERMISSIONS; return { - runAsPortal: !!connections.portalConnections, + runAsPortal: !!connections.portalConnections || !!process.env.runAsPortal, singleDbConnection: connections.singleDbConnection, singleConnection: connections.singleConnection, // hideAppEditor: !!process.env.HIDE_APP_EDITOR, diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index 4fc6120124..f31afa952f 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -192,6 +192,7 @@ module.exports = { if (!portalConnections) { // @ts-ignore this.datastore = new JsonLinesDatabase(path.join(dir, 'connections.jsonl')); + this.datastore.watch(); } }, @@ -273,7 +274,6 @@ module.exports = { } else { res = await this.datastore.insert(encrypted); } - socket.emitChanged('connection-list-changed'); socket.emitChanged('used-apps-changed'); if (this._closeAll) { this._closeAll(connection._id); @@ -289,7 +289,6 @@ module.exports = { if (portalConnections) return; testConnectionPermission(_id, req); const res = await this.datastore.patch(_id, values); - socket.emitChanged('connection-list-changed'); return res; }, @@ -297,7 +296,6 @@ module.exports = { async batchChangeFolder({ folder, newFolder }, req) { // const updated = await this.datastore.find(x => x.parent == folder); const res = await this.datastore.updateAll(x => (x.parent == folder ? { ...x, parent: newFolder } : x)); - socket.emitChanged('connection-list-changed'); return res; }, @@ -313,7 +311,6 @@ module.exports = { databases = [...databases, { name: database, ...values }]; } const res = await this.datastore.patch(conid, { databases }); - socket.emitChanged('connection-list-changed'); socket.emitChanged('used-apps-changed'); // socket.emitChanged(`db-apps-changed-${conid}-${database}`); return res; @@ -324,7 +321,6 @@ module.exports = { if (portalConnections) return; testConnectionPermission(connection, req); const res = await this.datastore.remove(connection._id); - socket.emitChanged('connection-list-changed'); return res; }, diff --git a/packages/api/src/utility/JsonLinesDatabase.js b/packages/api/src/utility/JsonLinesDatabase.js index 12de5cef3a..160aaf7cea 100644 --- a/packages/api/src/utility/JsonLinesDatabase.js +++ b/packages/api/src/utility/JsonLinesDatabase.js @@ -1,6 +1,7 @@ const AsyncLock = require('async-lock'); const fs = require('fs-extra'); const uuidv1 = require('uuid/v1'); +const socket = require('./socket'); const lock = new AsyncLock(); @@ -111,6 +112,33 @@ class JsonLinesDatabase { return removed; } + watch() { + if (!fs.existsSync(this.filename)) { + // 如果文件不存在,则创建一个空文件 + fs.writeFileSync(this.filename, ''); + } + + fs.watch(this.filename, { persistent: true }, (eventType, filename) => { + console.log(`File ${filename} changed, event type is: ${eventType}`); + if (eventType === 'change') { + this._reload(); + socket.emitChanged('connection-list-changed'); + } + }); + } + + async _reload() { + try { + const text = await fs.promises.readFile(this.filename, { encoding: 'utf-8' }); + this.data = text + .split('\n') + .filter(x => x.trim()) + .map(x => JSON.parse(x)); + } catch (err) { + console.error(`Error reloading file ${this.filename}`, err); + } + } + // async _openReader() { // return new Promise((resolve, reject) => // lineReader.open(this.filename, (err, reader) => { From ddd7829bbb8ff3711ffaa51051d3bb91b6a34c88 Mon Sep 17 00:00:00 2001 From: magicwind <2814461814@qq.com> Date: Sun, 10 Mar 2024 13:56:33 +0800 Subject: [PATCH 2/3] feat: add file watch --- packages/api/src/utility/JsonLinesDatabase.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/api/src/utility/JsonLinesDatabase.js b/packages/api/src/utility/JsonLinesDatabase.js index 160aaf7cea..d86ee7df96 100644 --- a/packages/api/src/utility/JsonLinesDatabase.js +++ b/packages/api/src/utility/JsonLinesDatabase.js @@ -114,7 +114,6 @@ class JsonLinesDatabase { watch() { if (!fs.existsSync(this.filename)) { - // 如果文件不存在,则创建一个空文件 fs.writeFileSync(this.filename, ''); } From bf1f370736e80b56f46590bf6b29ecde8abc47e3 Mon Sep 17 00:00:00 2001 From: magicwind <2814461814@qq.com> Date: Sun, 10 Mar 2024 14:15:49 +0800 Subject: [PATCH 3/3] feat: add file watch --- .gitignore | 2 +- packages/api/.env | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 38c8fa2772..c1a37f0161 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ packages/api/src/packagedPluginsContent.js .VSCodeCounter .idea -packages/api/data \ No newline at end of file +.dbgate \ No newline at end of file diff --git a/packages/api/.env b/packages/api/.env index e20a0bf5a3..8a2d55b130 100644 --- a/packages/api/.env +++ b/packages/api/.env @@ -2,7 +2,7 @@ DEVMODE=1 SHELL_SCRIPTING=1 DEVWEB=1 runAsPortal=1 -WORKSPACE_DIR=./data +WORKSPACE_DIR=../../.dbgate # PERMISSIONS=~widgets/app,~widgets/plugins # DISABLE_SHELL=1