diff --git a/apps/meteor/client/views/marketplace/AppsPage/AppsPageContent.tsx b/apps/meteor/client/views/marketplace/AppsPage/AppsPageContent.tsx index 4031a2b7fe936..3905157739022 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/AppsPageContent.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/AppsPageContent.tsx @@ -140,7 +140,10 @@ const AppsPageContent = (): ReactElement => { const noInstalledApps = appsResult.phase === AsyncStatePhase.RESOLVED && !isMarketplace && appsResult.value?.totalAppsLength === 0; - const unsupportedVersion = appsResult.phase === AsyncStatePhase.REJECTED && appsResult.error.message === 'unsupported version'; + // TODO: Introduce error codes, so we can avoid using error message strings for this kind of logic + // whenever we change the error message, this code ends up breaking. + const unsupportedVersion = + appsResult.phase === AsyncStatePhase.REJECTED && appsResult.error.message === 'Marketplace_Unsupported_Version'; const noMarketplaceOrInstalledAppMatches = appsResult.phase === AsyncStatePhase.RESOLVED && (isMarketplace || isPremium) && appsResult.value?.count === 0; diff --git a/apps/meteor/ee/server/apps/communication/rest.ts b/apps/meteor/ee/server/apps/communication/rest.ts index 4528c9f448b19..c8b7fc9d0872f 100644 --- a/apps/meteor/ee/server/apps/communication/rest.ts +++ b/apps/meteor/ee/server/apps/communication/rest.ts @@ -28,7 +28,7 @@ import { formatAppInstanceForRest } from '../../../lib/misc/formatAppInstanceFor import { notifyAppInstall } from '../marketplace/appInstall'; import { fetchMarketplaceApps } from '../marketplace/fetchMarketplaceApps'; import { fetchMarketplaceCategories } from '../marketplace/fetchMarketplaceCategories'; -import { MarketplaceConnectionError, MarketplaceAppsError } from '../marketplace/marketplaceErrors'; +import { MarketplaceConnectionError, MarketplaceAppsError, MarketplaceUnsupportedVersionError } from '../marketplace/marketplaceErrors'; import type { AppServerOrchestrator } from '../orchestrator'; import { Apps } from '../orchestrator'; @@ -122,7 +122,7 @@ export class AppsRestApi { return handleError('Unable to access Marketplace. Does the server has access to the internet?', err); } - if (err instanceof MarketplaceAppsError) { + if (err instanceof MarketplaceAppsError || err instanceof MarketplaceUnsupportedVersionError) { return API.v1.failure({ error: err.message }); } @@ -151,7 +151,7 @@ export class AppsRestApi { return handleError('Unable to access Marketplace. Does the server has access to the internet?', err); } - if (err instanceof MarketplaceAppsError) { + if (err instanceof MarketplaceAppsError || err instanceof MarketplaceUnsupportedVersionError) { return API.v1.failure({ error: err.message }); } @@ -229,7 +229,7 @@ export class AppsRestApi { return handleError('Unable to access Marketplace. Does the server has access to the internet?', e); } - if (e instanceof MarketplaceAppsError) { + if (e instanceof MarketplaceAppsError || e instanceof MarketplaceUnsupportedVersionError) { return API.v1.failure({ error: e.message }); } @@ -253,7 +253,7 @@ export class AppsRestApi { return handleError('Unable to access Marketplace. Does the server has access to the internet?', err); } - if (err instanceof MarketplaceAppsError) { + if (err instanceof MarketplaceAppsError || err instanceof MarketplaceUnsupportedVersionError) { return API.v1.failure({ error: err.message }); } diff --git a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts index 476d4405e3b48..60230d08bf59a 100644 --- a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts +++ b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceApps.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; import { getMarketplaceHeaders } from './getMarketplaceHeaders'; import { getWorkspaceAccessToken } from '../../../../app/cloud/server'; import { Apps } from '../orchestrator'; -import { MarketplaceAppsError, MarketplaceConnectionError } from './marketplaceErrors'; +import { MarketplaceAppsError, MarketplaceConnectionError, MarketplaceUnsupportedVersionError } from './marketplaceErrors'; type FetchMarketplaceAppsParams = { endUserID?: string; @@ -160,6 +160,11 @@ export async function fetchMarketplaceApps({ endUserID }: FetchMarketplaceAppsPa Apps.getRocketChatLogger().error('Failed to fetch marketplace apps', response); + // TODO: Refactor cloud to return a proper error code on unsupported version + if (request.status === 426 && 'errorMsg' in response && response.errorMsg === 'unsupported version') { + throw new MarketplaceUnsupportedVersionError(); + } + if (request.status === 400 && response.code === 200) { throw new MarketplaceAppsError('Marketplace_Invalid_Apps_Engine_Version'); } diff --git a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts index 161dcaff06b03..454ab2d79dd88 100644 --- a/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts +++ b/apps/meteor/ee/server/apps/marketplace/fetchMarketplaceCategories.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; import { getMarketplaceHeaders } from './getMarketplaceHeaders'; import { getWorkspaceAccessToken } from '../../../../app/cloud/server'; import { Apps } from '../orchestrator'; -import { MarketplaceAppsError, MarketplaceConnectionError } from './marketplaceErrors'; +import { MarketplaceAppsError, MarketplaceConnectionError, MarketplaceUnsupportedVersionError } from './marketplaceErrors'; const fetchMarketplaceCategoriesSchema = z.array( z.object({ @@ -40,6 +40,14 @@ export async function fetchMarketplaceCategories(): Promise { } const response = await request.json(); + + Apps.getRocketChatLogger().error('Failed to fetch marketplace categories', response); + + // TODO: Refactor cloud to return a proper error code on unsupported version + if (request.status === 426 && 'errorMsg' in response && response.errorMsg === 'unsupported version') { + throw new MarketplaceUnsupportedVersionError(); + } + const INTERNAL_MARKETPLACE_ERROR_CODES = [189, 266]; if (request.status === 500 && INTERNAL_MARKETPLACE_ERROR_CODES.includes(response.code)) { diff --git a/apps/meteor/ee/server/apps/marketplace/marketplaceErrors.ts b/apps/meteor/ee/server/apps/marketplace/marketplaceErrors.ts index 6a499b8dc9cd0..89f0e11114246 100644 --- a/apps/meteor/ee/server/apps/marketplace/marketplaceErrors.ts +++ b/apps/meteor/ee/server/apps/marketplace/marketplaceErrors.ts @@ -1,13 +1,17 @@ export class MarketplaceAppsError extends Error { constructor(message: string) { super(message); - this.name = 'MarketplaceAppsError'; } } export class MarketplaceConnectionError extends Error { constructor(message: string) { super(message); - this.name = 'MarketplaceConnectionError'; + } +} + +export class MarketplaceUnsupportedVersionError extends Error { + constructor() { + super('Marketplace_Unsupported_Version'); } }