diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index f90cba49a..59494cfef 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -201,6 +201,7 @@ module.exports = { // @ts-ignore this.datastore = new JsonLinesDatabase(path.join(dir, 'connections.jsonl')); } + await this.checkUnsavedConnectionsLimit(); }, list_meta: true, @@ -300,6 +301,29 @@ module.exports = { return res; }, + async checkUnsavedConnectionsLimit() { + const MAX_UNSAVED_CONNECTIONS = 5; + await this.datastore.transformAll(connections => { + const count = connections.filter(x => x.unsaved).length; + if (count > MAX_UNSAVED_CONNECTIONS) { + const res = []; + let unsavedToSkip = count - MAX_UNSAVED_CONNECTIONS; + for (const item of connections) { + if (item.unsaved) { + if (unsavedToSkip > 0) { + unsavedToSkip--; + } else { + res.push(item); + } + } else { + res.push(item); + } + } + return res; + } + }); + }, + update_meta: true, async update({ _id, values }, req) { if (portalConnections) return; diff --git a/packages/api/src/utility/JsonLinesDatabase.js b/packages/api/src/utility/JsonLinesDatabase.js index 0528b4b34..026692c54 100644 --- a/packages/api/src/utility/JsonLinesDatabase.js +++ b/packages/api/src/utility/JsonLinesDatabase.js @@ -111,6 +111,15 @@ class JsonLinesDatabase { return removed; } + async transformAll(transformFunction) { + await this._ensureLoaded(); + const newData = transformFunction(this.data); + if (newData) { + this.data = newData; + await this._save(); + } + } + // async _openReader() { // return new Promise((resolve, reject) => // lineReader.open(this.filename, (err, reader) => {