diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index b56a4affd..c05c3863a 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -5,6 +5,7 @@ const { callCloudApiGet, callCloudApiPost, getCloudFolderEncryptor, + getCloudContent, } = require('../utility/cloudIntf'); const connections = require('./connections'); const socket = require('../utility/socket'); @@ -48,8 +49,8 @@ module.exports = { getContent_meta: true, async getContent({ folid, cntid }) { - const { content, name, type } = await callCloudApiGet(`content/${folid}/${cntid}`); - return { content, name, type }; + const resp = await getCloudContent(folid, cntid); + return resp; }, putContent_meta: true, diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index b2c82eed7..f5243f0d0 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -425,12 +425,9 @@ module.exports = { const cloudMatch = conid.match(/^cloud\:\/\/(.+)\/(.+)$/); if (cloudMatch) { - const cloud = require('./cloud'); - const { content } = await cloud.getContent({ folid: cloudMatch[1], cntid: cloudMatch[2] }); - return { - ...JSON.parse(content), - _id: conid, - }; + const { loadCachedCloudConnection } = require('../utility/cloudIntf'); + const conn = await loadCachedCloudConnection(cloudMatch[1], cloudMatch[2]); + return conn; } const storage = require('./storage'); diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index a1ad374a6..11ae9a11d 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -248,6 +248,24 @@ async function getCloudFolderEncryptor(folid) { return simpleEncryptor.createEncryptor(encryptionKey); } +async function getCloudContent(folid, cntid) { + const { content, name, type } = await callCloudApiGet(`content/${folid}/${cntid}`); + return { content, name, type }; +} + +const cloudConnectionCache = {}; +async function loadCachedCloudConnection(folid, cntid) { + const cacheKey = `${folid}|${cntid}`; + if (!cloudConnectionCache[cacheKey]) { + const { content } = await getCloudContent(folid, cntid); + cloudConnectionCache[cacheKey] = { + ...JSON.parse(content), + _id: `cloud://${folid}/${cntid}`, + }; + } + return cloudConnectionCache[cacheKey]; +} + module.exports = { createDbGateIdentitySession, startCloudTokenChecking, @@ -258,4 +276,6 @@ module.exports = { callCloudApiGet, callCloudApiPost, getCloudFolderEncryptor, + getCloudContent, + loadCachedCloudConnection, }; diff --git a/packages/web/src/widgets/DatabaseWidgetDetailContent.svelte b/packages/web/src/widgets/DatabaseWidgetDetailContent.svelte index 732ae3b02..2a23248ee 100644 --- a/packages/web/src/widgets/DatabaseWidgetDetailContent.svelte +++ b/packages/web/src/widgets/DatabaseWidgetDetailContent.svelte @@ -1,7 +1,7 @@ {#if $status && $status.name == 'error'}