diff --git a/apps/meteor/app/apps/server/communication/rest.js b/apps/meteor/app/apps/server/communication/rest.js index 595f15e7d35f..631f6a03f7a5 100644 --- a/apps/meteor/app/apps/server/communication/rest.js +++ b/apps/meteor/app/apps/server/communication/rest.js @@ -12,6 +12,7 @@ import { Apps } from '../orchestrator'; import { formatAppInstanceForRest } from '../../lib/misc/formatAppInstanceForRest'; import { actionButtonsHandler } from './endpoints/actionButtonsHandler'; import { fetch } from '../../../../server/lib/http/fetch'; +import { notifyAppInstall } from '../marketplace/appInstall'; const rocketChatVersion = Info.version; const appsEngineVersionForMarketplace = Info.marketplaceApiVersion.replace(/-.*/g, ''); @@ -273,6 +274,8 @@ export class AppsRestApi { info.status = aff.getApp().getStatus(); + notifyAppInstall(orchestrator.getMarketplaceUrl(), 'install', info); + return API.v1.success({ app: info, implemented: aff.getImplementedInferfaces(), @@ -558,6 +561,8 @@ export class AppsRestApi { info.status = aff.getApp().getStatus(); + notifyAppInstall(orchestrator.getMarketplaceUrl(), 'update', info); + return API.v1.success({ app: info, implemented: aff.getImplementedInferfaces(), @@ -578,6 +583,8 @@ export class AppsRestApi { const info = prl.getInfo(); info.status = prl.getStatus(); + notifyAppInstall(orchestrator.getMarketplaceUrl(), 'uninstall', info); + return API.v1.success({ app: info }); }, }, diff --git a/apps/meteor/app/apps/server/marketplace/appInstall.ts b/apps/meteor/app/apps/server/marketplace/appInstall.ts new file mode 100644 index 000000000000..a18b8f57eae2 --- /dev/null +++ b/apps/meteor/app/apps/server/marketplace/appInstall.ts @@ -0,0 +1,46 @@ +import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; + +import { getWorkspaceAccessToken } from '../../../cloud/server'; +import { settings } from '../../../settings/server'; +import { Info } from '../../../utils/server'; + +export type installAction = 'install' | 'update' | 'uninstall'; + +export async function notifyAppInstall(marketplaceBaseUrl: string, action: installAction, appInfo: IAppInfo): Promise { + const headers: { Authorization?: string } = {}; + + try { + const token = await getWorkspaceAccessToken(); + headers.Authorization = `Bearer ${token}`; + + // eslint-disable-next-line no-empty + } catch {} + + let siteUrl = ''; + try { + siteUrl = settings.get('Site_Url'); + + // eslint-disable-next-line no-empty + } catch {} + + const data = { + action, + appName: appInfo.name, + appSlug: appInfo.nameSlug, + appVersion: appInfo.version, + rocketChatVersion: Info.version, + engineVersion: Info.marketplaceApiVersion, + siteUrl, + }; + + const pendingSentUrl = `${marketplaceBaseUrl}/v1/apps/${appInfo.id}/install`; + + try { + HTTP.post(pendingSentUrl, { + headers, + data, + }); + + // eslint-disable-next-line no-empty + } catch {} +}