feat: add methods and types to support version checking with local storage storage

This commit is contained in:
Jacob Overgaard
2024-09-11 15:54:29 +02:00
parent ccb9eeb08b
commit 915a26589a
3 changed files with 94 additions and 1 deletions

View File

@@ -1,3 +1,4 @@
export * from './components/sysinfo.element.js';
export * from './modals/index.js';
export * from './repository/index.js';
export type * from './types.js';

View File

@@ -1,9 +1,12 @@
import type { UmbServerConfiguration, UmbServerUpgradeCheck } from '../types.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository';
import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';
import { tryExecute, tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';
import { ServerService } from '@umbraco-cms/backoffice/external/backend-api';
export class UmbSysinfoRepository extends UmbRepositoryBase {
#serverConfiguration?: UmbServerConfiguration;
constructor(host: UmbControllerHost) {
super(host, 'Umb.Repository.Sysinfo');
}
@@ -17,4 +20,86 @@ export class UmbSysinfoRepository extends UmbRepositoryBase {
const { data } = await tryExecuteAndNotify(this, ServerService.getServerInformation());
return data;
}
async requestServerConfiguration() {
const { data } = await tryExecute(ServerService.getServerConfiguration());
return data;
}
async #getVersionCheckPeriod(): Promise<number> {
if (!this.#serverConfiguration) {
this.#serverConfiguration = await this.requestServerConfiguration();
}
return this.#serverConfiguration?.versionCheckPeriod ?? 7;
}
getStoredServerUpgradeCheck(lastCheck: Date): UmbServerUpgradeCheck | null {
const storedCheck = localStorage.getItem('umb:serverUpgradeCheck');
if (storedCheck) {
const upgradeCheck = JSON.parse(storedCheck) as UmbServerUpgradeCheck;
// Check that the stored check is not older than the last check
const expiresAt = new Date(upgradeCheck.expires);
if (expiresAt.getTime() > lastCheck.getTime()) {
if (upgradeCheck.type.toLowerCase() !== 'none') {
return upgradeCheck;
}
} else {
localStorage.removeItem('umb:serverUpgradeCheck');
}
}
return null;
}
async serverUpgradeCheck(): Promise<UmbServerUpgradeCheck | null> {
// Check if we are allowed to check again
const versionCheckPeriod = await this.#getVersionCheckPeriod();
if (versionCheckPeriod <= 0) {
return null;
}
let shouldCheck = true;
const lastCheck = localStorage.getItem('umb:lastUpgradeCheck');
const now = new Date();
localStorage.setItem('umb:lastUpgradeCheck', now.toISOString());
if (lastCheck) {
const lastCheckDate = new Date(lastCheck);
const diff = now.getTime() - lastCheckDate.getTime();
const diffDays = diff / (1000 * 3600 * 24);
if (diffDays < versionCheckPeriod) {
shouldCheck = false;
}
// If we should not check, then return what we have stored if it is still valid
if (!shouldCheck) {
return this.getStoredServerUpgradeCheck(lastCheckDate);
}
}
if (!shouldCheck) {
return null;
}
// Check the server
const { data } = await tryExecute(ServerService.getServerUpgradeCheck());
if (data) {
// Save the last check date including the data received
const expiresAt = new Date();
expiresAt.setDate(expiresAt.getDate() + versionCheckPeriod);
const upgradeCheck = { ...data, expires: expiresAt.toISOString() } satisfies UmbServerUpgradeCheck;
localStorage.setItem('umb:serverUpgradeCheck', JSON.stringify(upgradeCheck));
// Only return if we have a valid type
if (data.type.toLowerCase() !== 'none') {
return upgradeCheck;
}
}
return null;
}
}

View File

@@ -0,0 +1,7 @@
import type {
ServerConfigurationResponseModel,
UpgradeCheckResponseModel,
} from '@umbraco-cms/backoffice/external/backend-api';
export type UmbServerConfiguration = ServerConfigurationResponseModel;
export type UmbServerUpgradeCheck = UpgradeCheckResponseModel & { expires: string };