From f1b7cfe5103e52634b588a7e00842d028587e13e Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 19 Oct 2023 16:57:13 -0300 Subject: [PATCH] fix: some details on supported versions (#5284) * Ignore patches * Fix null versions find * Fix cloud request * Fix inverted date comparison to trigger action sheet --- .../methods/checkSupportedVersions.test.ts | 21 +++++++++++++++++++ app/lib/methods/checkSupportedVersions.ts | 6 ++++-- app/lib/methods/getServerInfo.ts | 13 ++++++++---- app/sagas/login.js | 3 +-- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/app/lib/methods/checkSupportedVersions.test.ts b/app/lib/methods/checkSupportedVersions.test.ts index ad86f118a..fb0639adf 100644 --- a/app/lib/methods/checkSupportedVersions.test.ts +++ b/app/lib/methods/checkSupportedVersions.test.ts @@ -120,6 +120,27 @@ jest.useFakeTimers('modern'); jest.setSystemTime(new Date(TODAY)); describe('checkSupportedVersions', () => { + describe('General', () => { + test('ignore the patch and compare as minor', () => { + expect( + checkSupportedVersions({ + supportedVersions: MOCK, + serverVersion: '1.5.1' + }) + ).toMatchObject({ + status: 'supported' + }); + expect( + checkSupportedVersions({ + supportedVersions: MOCK, + serverVersion: '1.2.1' + }) + ).toMatchObject({ + status: 'expired' + }); + }); + }); + describe('Built-in supported versions', () => { test('no supported versions', () => { expect(checkSupportedVersions({ supportedVersions: undefined, serverVersion: '1.5.0' })).toMatchObject({ diff --git a/app/lib/methods/checkSupportedVersions.ts b/app/lib/methods/checkSupportedVersions.ts index f1f4a154e..4aac383fe 100644 --- a/app/lib/methods/checkSupportedVersions.ts +++ b/app/lib/methods/checkSupportedVersions.ts @@ -1,5 +1,6 @@ import moment from 'moment'; import coerce from 'semver/functions/coerce'; +import satisfies from 'semver/functions/satisfies'; import { ISupportedVersionsData, TSVDictionary, TSVMessage, TSVStatus } from '../../definitions'; import builtInSupportedVersions from '../../../app-supportedversions.json'; @@ -40,6 +41,7 @@ export const checkSupportedVersions = function ({ i18n?: TSVDictionary; expiration?: string; } { + const serverVersionTilde = `~${serverVersion.split('.').slice(0, 2).join('.')}`; let sv: ISupportedVersionsData; if (!supportedVersions || supportedVersions.timestamp < builtInSupportedVersions.timestamp) { // Built-in supported versions @@ -49,7 +51,7 @@ export const checkSupportedVersions = function ({ sv = supportedVersions; } - const versionInfo = sv.versions.find(({ version }) => coerce(version)?.version === serverVersion); + const versionInfo = sv.versions.find(({ version }) => satisfies(coerce(version)?.version ?? '', serverVersionTilde)); if (versionInfo && new Date(versionInfo.expiration) >= new Date()) { const messages = versionInfo?.messages || sv?.messages; const message = getMessage({ messages, expiration: versionInfo.expiration }); @@ -62,7 +64,7 @@ export const checkSupportedVersions = function ({ } // Exceptions - const exception = sv.exceptions?.versions.find(({ version }) => coerce(version)?.version === serverVersion); + const exception = sv.exceptions?.versions?.find(({ version }) => satisfies(coerce(version)?.version ?? '', serverVersionTilde)); const messages = exception?.messages || sv.exceptions?.messages || versionInfo?.messages || sv.messages; const message = getMessage({ messages, expiration: exception?.expiration }); const status = getStatus({ expiration: exception?.expiration, message }); diff --git a/app/lib/methods/getServerInfo.ts b/app/lib/methods/getServerInfo.ts index 98a605424..ecb95354e 100644 --- a/app/lib/methods/getServerInfo.ts +++ b/app/lib/methods/getServerInfo.ts @@ -57,7 +57,7 @@ export async function getServerInfo(server: string): Promise // if backend doesn't have supported versions or JWT is invalid, request from cloud if (!supportedVersions) { - const cloudInfo = await getCloudInfo(); + const cloudInfo = await getCloudInfo(server); // Makes use of signed JWT to get supported versions const supportedVersionsCloud = verifyJWT(cloudInfo?.signed); @@ -96,9 +96,14 @@ export async function getServerInfo(server: string): Promise }; } -export const getCloudInfo = async (): Promise => { - const uniqueId = store.getState().settings.uniqueID as string; - const domain = store.getState().server.server; +const getUniqueId = async (server: string): Promise => { + const response = await fetch(`${server}/api/v1/settings.public?query={"_id": "uniqueID"}`); + const result = await response.json(); + return result?.settings?.[0]?.value; +}; + +export const getCloudInfo = async (domain: string): Promise => { + const uniqueId = await getUniqueId(domain); const response = await getSupportedVersionsCloud(uniqueId, domain); return response.json() as unknown as TCloudInfo; }; diff --git a/app/sagas/login.js b/app/sagas/login.js index efff9db6d..e1fa2b549 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -56,8 +56,7 @@ const showSupportedVersionsWarning = function* showSupportedVersionsWarning(serv } const serverRecord = yield getServerById(server); const isMasterDetail = yield select(state => state.app.isMasterDetail); - - if (!serverRecord || moment(serverRecord?.supportedVersionsWarningAt).diff(new Date(), 'hours') <= 12) { + if (!serverRecord || moment(new Date()).diff(serverRecord?.supportedVersionsWarningAt, 'hours') <= 12) { return; }