diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index d1cbc00dd..fe1dfd36b 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -8,6 +8,7 @@ const { getCloudContent, putCloudContent, removeCloudCachedConnection, + getPromoWidgetData, } = require('../utility/cloudIntf'); const connections = require('./connections'); const socket = require('../utility/socket'); @@ -283,6 +284,11 @@ module.exports = { return getAiGatewayServer(); }, + premiumPromoWidget_meta: true, + async premiumPromoWidget() { + return getPromoWidgetData(); + }, + // chatStream_meta: { // raw: true, // method: 'post', diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index 61ff78cf1..2decd76ff 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -17,6 +17,7 @@ const currentVersion = require('../currentVersion'); const logger = getLogger('cloudIntf'); let cloudFiles = null; +let promoWidgetData = null; const DBGATE_IDENTITY_URL = process.env.LOCAL_DBGATE_IDENTITY ? 'http://localhost:3103' @@ -259,6 +260,30 @@ async function getPublicFileData(path) { return resp.data; } +async function updatePremiumPromoWidget() { + try { + const fileContent = await fs.readFile(path.join(datadir(), 'promo-widget.json'), 'utf-8'); + promoWidgetData = JSON.parse(fileContent); + } catch (err) { + promoWidgetData = null; + } + + const tags = (await collectCloudFilesSearchTags()).join(','); + + const resp = await axios.default.get( + `${DBGATE_CLOUD_URL}/premium-promo-widget?identifier=${promoWidgetData?.identifier ?? 'nope'}&tags=${tags}` + ); + + if (!resp.data || resp.data?.state == 'unchanged') { + return; + } + + promoWidgetData = resp.data; + await fs.writeFile(path.join(datadir(), 'promo-widget.json'), JSON.stringify(promoWidgetData, null, 2)); + + socket.emitChanged(`promo-widget-changed`); +} + async function refreshPublicFiles(isRefresh) { if (!cloudFiles) { await loadCloudFiles(); @@ -268,6 +293,9 @@ async function refreshPublicFiles(isRefresh) { } catch (err) { logger.error(extractErrorLogData(err), 'DBGM-00166 Error updating cloud files'); } + if (!isProApp()) { + await updatePremiumPromoWidget(); + } } async function callCloudApiGet(endpoint, signinHolder = null, additionalHeaders = {}) { @@ -432,6 +460,10 @@ async function getPublicIpInfo() { } } +function getPromoWidgetData() { + return promoWidgetData; +} + module.exports = { createDbGateIdentitySession, startCloudTokenChecking, @@ -449,4 +481,5 @@ module.exports = { readCloudTokenHolder, readCloudTestTokenHolder, getPublicIpInfo, + getPromoWidgetData, }; diff --git a/packages/web/src/utility/metadataLoaders.ts b/packages/web/src/utility/metadataLoaders.ts index cb975fc47..997d53e27 100644 --- a/packages/web/src/utility/metadataLoaders.ts +++ b/packages/web/src/utility/metadataLoaders.ts @@ -183,12 +183,16 @@ const cloudContentListLoader = () => ({ params: {}, reloadTrigger: { key: `cloud-content-changed` }, }); - const teamFilesLoader = () => ({ url: 'team-files/list', params: {}, reloadTrigger: { key: `team-files-changed` }, }); +const promoWidgetLoader = () => ({ + url: 'cloud/premium-promo-widget', + params: {}, + reloadTrigger: { key: `promo-widget-changed` }, +}); async function getCore(loader, args) { const { url, params, reloadTrigger, transform, onLoaded, errorValue } = loader(args); @@ -536,3 +540,10 @@ export function getTeamFiles(args) { export function useTeamFiles(args) { return useCore(teamFilesLoader, args); } + +export function getPromoWidget(args) { + return getCore(promoWidgetLoader, args); +} +export function usePromoWidget(args) { + return useCore(promoWidgetLoader, args); +}