From fe42c7734e422ef83811932d03f84241db1fda19 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:54:29 +0200 Subject: [PATCH 01/15] feat: add methods and types to support version checking with local storage storage --- src/packages/sysinfo/index.ts | 1 + .../sysinfo/repository/sysinfo.repository.ts | 87 ++++++++++++++++++- src/packages/sysinfo/types.ts | 7 ++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/packages/sysinfo/types.ts diff --git a/src/packages/sysinfo/index.ts b/src/packages/sysinfo/index.ts index 6196778a18..cbcf692b21 100644 --- a/src/packages/sysinfo/index.ts +++ b/src/packages/sysinfo/index.ts @@ -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'; diff --git a/src/packages/sysinfo/repository/sysinfo.repository.ts b/src/packages/sysinfo/repository/sysinfo.repository.ts index 39ea64fbe9..a325e705a8 100644 --- a/src/packages/sysinfo/repository/sysinfo.repository.ts +++ b/src/packages/sysinfo/repository/sysinfo.repository.ts @@ -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 { + 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 { + // 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; + } } diff --git a/src/packages/sysinfo/types.ts b/src/packages/sysinfo/types.ts new file mode 100644 index 0000000000..d4a6519664 --- /dev/null +++ b/src/packages/sysinfo/types.ts @@ -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 }; From 0e2b8017dde45adf06d73b9e121042b1aeda6232 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:56:23 +0200 Subject: [PATCH 02/15] feat: show a button in the backoffice logo area if a new version is available --- src/apps/backoffice/backoffice.context.ts | 7 +++++++ .../components/backoffice-header-logo.element.ts | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/apps/backoffice/backoffice.context.ts b/src/apps/backoffice/backoffice.context.ts index 1ae88c7721..04580295bb 100644 --- a/src/apps/backoffice/backoffice.context.ts +++ b/src/apps/backoffice/backoffice.context.ts @@ -10,6 +10,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; +import { UmbSysinfoRepository } from '@umbraco-cms/backoffice/sysinfo'; export class UmbBackofficeContext extends UmbContextBase { #activeSectionAlias = new UmbStringState(undefined); @@ -76,6 +77,12 @@ export class UmbBackofficeContext extends UmbContextBase { public setActiveSectionAlias(alias: string) { this.#activeSectionAlias.setValue(alias); } + + public async serverUpgradeCheck(): Promise { + const repository = new UmbSysinfoRepository(this); + const check = await repository.serverUpgradeCheck(); + return !!check; + } } export const UMB_BACKOFFICE_CONTEXT = new UmbContextToken('UmbBackofficeContext'); diff --git a/src/apps/backoffice/components/backoffice-header-logo.element.ts b/src/apps/backoffice/components/backoffice-header-logo.element.ts index 48a93afc79..640fcb92c9 100644 --- a/src/apps/backoffice/components/backoffice-header-logo.element.ts +++ b/src/apps/backoffice/components/backoffice-header-logo.element.ts @@ -1,5 +1,5 @@ -import { isCurrentUserAnAdmin } from '@umbraco-cms/backoffice/current-user'; import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js'; +import { isCurrentUserAnAdmin } from '@umbraco-cms/backoffice/current-user'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -14,6 +14,11 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { @state() private _isUserAdmin = false; + @state() + private _serverUpgradeCheck = false; + + #backofficeContext?: typeof UMB_BACKOFFICE_CONTEXT.TYPE; + constructor() { super(); @@ -26,6 +31,8 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { }, '_observeVersion', ); + + this.#backofficeContext = context; }); this.#isAdmin(); @@ -33,6 +40,10 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { async #isAdmin() { this._isUserAdmin = await isCurrentUserAnAdmin(this); + + if (this._isUserAdmin) { + this._serverUpgradeCheck = this.#backofficeContext ? await this.#backofficeContext.serverUpgradeCheck() : false; + } } override render() { @@ -50,6 +61,9 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { height="82" loading="lazy" /> ${this._version} + + ${this._serverUpgradeCheck ? html`` : ''} + Umbraco.com ${this._isUserAdmin From 7ee0673210fc58f0115af88c51f00428296d808b Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:59:26 +0200 Subject: [PATCH 03/15] feat: add localization --- .../backoffice/components/backoffice-header-logo.element.ts | 6 +++++- src/assets/lang/da-dk.ts | 1 + src/assets/lang/de-de.ts | 1 + src/assets/lang/en-us.ts | 1 + src/assets/lang/en.ts | 1 + 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/apps/backoffice/components/backoffice-header-logo.element.ts b/src/apps/backoffice/components/backoffice-header-logo.element.ts index 640fcb92c9..8a8f7bb3ec 100644 --- a/src/apps/backoffice/components/backoffice-header-logo.element.ts +++ b/src/apps/backoffice/components/backoffice-header-logo.element.ts @@ -62,7 +62,11 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { loading="lazy" /> ${this._version} - ${this._serverUpgradeCheck ? html`` : ''} + ${this._serverUpgradeCheck + ? html`` + : ''} Umbraco.com diff --git a/src/assets/lang/da-dk.ts b/src/assets/lang/da-dk.ts index 0250bfb286..e4f3d47d6e 100644 --- a/src/assets/lang/da-dk.ts +++ b/src/assets/lang/da-dk.ts @@ -907,6 +907,7 @@ export default { lastUpdated: 'Last Updated', skipToMenu: 'Skip to menu', skipToContent: 'Skip to content', + newVersionAvailable: 'Ny version tilgængelig', }, colors: { blue: 'Blå', diff --git a/src/assets/lang/de-de.ts b/src/assets/lang/de-de.ts index 98b445f5a6..78e8c023a3 100644 --- a/src/assets/lang/de-de.ts +++ b/src/assets/lang/de-de.ts @@ -879,6 +879,7 @@ export default { header: 'Kopf', systemField: 'System Feld', lastUpdated: 'Zuletzt geändert', + newVersionAvailable: 'Neue Version verfügbar', }, colors: { blue: 'Blau', diff --git a/src/assets/lang/en-us.ts b/src/assets/lang/en-us.ts index 26331a339d..786ab41123 100644 --- a/src/assets/lang/en-us.ts +++ b/src/assets/lang/en-us.ts @@ -918,6 +918,7 @@ export default { skipToMenu: 'Skip to menu', skipToContent: 'Skip to content', restore: 'Restore', + newVersionAvailable: 'New version available', }, colors: { blue: 'Blue', diff --git a/src/assets/lang/en.ts b/src/assets/lang/en.ts index 532405afd9..336543cb52 100644 --- a/src/assets/lang/en.ts +++ b/src/assets/lang/en.ts @@ -934,6 +934,7 @@ export default { media: 'Media', revert: 'Revert', validate: 'Validate', + newVersionAvailable: 'New version available', }, colors: { blue: 'Blue', From a96da1fc6133e8e90cc430fd07f38078d4abc4c3 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:36:31 +0200 Subject: [PATCH 04/15] feat: register new modal to show version info --- .../sysinfo/components/new-version.element.ts | 61 +++++++++++++++++++ src/packages/sysinfo/index.ts | 1 - src/packages/sysinfo/manifests.ts | 24 +++++--- src/packages/sysinfo/modals/index.ts | 1 + .../sysinfo/modals/new-version-modal.token.ts | 8 +++ .../sysinfo/modals/sysinfo-modal.token.ts | 3 +- 6 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 src/packages/sysinfo/components/new-version.element.ts create mode 100644 src/packages/sysinfo/modals/new-version-modal.token.ts diff --git a/src/packages/sysinfo/components/new-version.element.ts b/src/packages/sysinfo/components/new-version.element.ts new file mode 100644 index 0000000000..616b1b347c --- /dev/null +++ b/src/packages/sysinfo/components/new-version.element.ts @@ -0,0 +1,61 @@ +import { UmbSysinfoRepository } from '../repository/sysinfo.repository.js'; +import type { UmbServerUpgradeCheck } from '../types.js'; +import { customElement, html, state, when } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; + +@customElement('umb-new-version') +export class UmbNewVersionElement extends UmbModalBaseElement { + @state() + private _serverUpgradeCheck: UmbServerUpgradeCheck | null = null; + + #sysinfoRepository = new UmbSysinfoRepository(this); + + override async connectedCallback() { + super.connectedCallback(); + this._serverUpgradeCheck = await this.#sysinfoRepository.serverUpgradeCheck(); + } + + override render() { + return html` + + + ${when( + this._serverUpgradeCheck === null, + () => html``, + () => html`
${this._serverUpgradeCheck!.comment}
`, + )} + + + + ${this._serverUpgradeCheck?.url + ? html` + Read more + + ` + : ''} +
+
+ `; + } + + static override readonly styles = [UmbTextStyles]; +} + +export default UmbNewVersionElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-new-version': UmbNewVersionElement; + } +} diff --git a/src/packages/sysinfo/index.ts b/src/packages/sysinfo/index.ts index cbcf692b21..92548a8dd7 100644 --- a/src/packages/sysinfo/index.ts +++ b/src/packages/sysinfo/index.ts @@ -1,4 +1,3 @@ -export * from './components/sysinfo.element.js'; export * from './modals/index.js'; export * from './repository/index.js'; export type * from './types.js'; diff --git a/src/packages/sysinfo/manifests.ts b/src/packages/sysinfo/manifests.ts index fa57d5b840..6539cf9e67 100644 --- a/src/packages/sysinfo/manifests.ts +++ b/src/packages/sysinfo/manifests.ts @@ -1,12 +1,18 @@ import type { ManifestModal, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_SYSINFO_MODAL_ALIAS = 'Umb.Modal.Sysinfo'; +const modalManifests: Array = [ + { + type: 'modal', + alias: 'Umb.Sysinfo.Modal', + name: 'Sysinfo Modal', + js: () => import('./components/sysinfo.element.js'), + }, + { + type: 'modal', + alias: 'Umb.NewVersion.Modal', + name: 'New Version Modal', + js: () => import('./components/new-version.element.js'), + }, +]; -const modalManifest: ManifestModal = { - type: 'modal', - alias: UMB_SYSINFO_MODAL_ALIAS, - name: 'Sysinfo Modal', - js: () => import('./components/sysinfo.element.js'), -}; - -export const manifests: Array = [modalManifest]; +export const manifests: Array = [...modalManifests]; diff --git a/src/packages/sysinfo/modals/index.ts b/src/packages/sysinfo/modals/index.ts index 575d63fbd5..64dd56f433 100644 --- a/src/packages/sysinfo/modals/index.ts +++ b/src/packages/sysinfo/modals/index.ts @@ -1 +1,2 @@ +export * from './new-version-modal.token.js'; export * from './sysinfo-modal.token.js'; diff --git a/src/packages/sysinfo/modals/new-version-modal.token.ts b/src/packages/sysinfo/modals/new-version-modal.token.ts new file mode 100644 index 0000000000..047bcbbf68 --- /dev/null +++ b/src/packages/sysinfo/modals/new-version-modal.token.ts @@ -0,0 +1,8 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export const UMB_NEWVERSION_MODAL = new UmbModalToken('Umb.NewVersion.Modal', { + modal: { + type: 'dialog', + size: 'medium', + }, +}); diff --git a/src/packages/sysinfo/modals/sysinfo-modal.token.ts b/src/packages/sysinfo/modals/sysinfo-modal.token.ts index d68114a4e3..b177c57851 100644 --- a/src/packages/sysinfo/modals/sysinfo-modal.token.ts +++ b/src/packages/sysinfo/modals/sysinfo-modal.token.ts @@ -1,7 +1,6 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import { UMB_SYSINFO_MODAL_ALIAS } from '../manifests.js'; -export const UMB_SYSINFO_MODAL = new UmbModalToken(UMB_SYSINFO_MODAL_ALIAS, { +export const UMB_SYSINFO_MODAL = new UmbModalToken('Umb.Sysinfo.Modal', { modal: { type: 'dialog', size: 'medium', From 1babead1811da3207531bd9392a66cf4e24a4772 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:36:42 +0200 Subject: [PATCH 05/15] feat: update last check only once --- src/packages/sysinfo/repository/sysinfo.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/sysinfo/repository/sysinfo.repository.ts b/src/packages/sysinfo/repository/sysinfo.repository.ts index a325e705a8..be042533c1 100644 --- a/src/packages/sysinfo/repository/sysinfo.repository.ts +++ b/src/packages/sysinfo/repository/sysinfo.repository.ts @@ -64,7 +64,6 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { 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(); @@ -93,6 +92,7 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { expiresAt.setDate(expiresAt.getDate() + versionCheckPeriod); const upgradeCheck = { ...data, expires: expiresAt.toISOString() } satisfies UmbServerUpgradeCheck; localStorage.setItem('umb:serverUpgradeCheck', JSON.stringify(upgradeCheck)); + localStorage.setItem('umb:lastUpgradeCheck', now.toISOString()); // Only return if we have a valid type if (data.type.toLowerCase() !== 'none') { From d61e84bc298cbf5225833a5211e298f740e89375 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:36:53 +0200 Subject: [PATCH 06/15] feat: open the new version modal when a new version is available --- .../components/backoffice-header-logo.element.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/apps/backoffice/components/backoffice-header-logo.element.ts b/src/apps/backoffice/components/backoffice-header-logo.element.ts index 8a8f7bb3ec..e9429a77d0 100644 --- a/src/apps/backoffice/components/backoffice-header-logo.element.ts +++ b/src/apps/backoffice/components/backoffice-header-logo.element.ts @@ -4,7 +4,7 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/externa import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UMB_SYSINFO_MODAL } from '@umbraco-cms/backoffice/sysinfo'; +import { UMB_NEWVERSION_MODAL, UMB_SYSINFO_MODAL } from '@umbraco-cms/backoffice/sysinfo'; @customElement('umb-backoffice-header-logo') export class UmbBackofficeHeaderLogoElement extends UmbLitElement { @@ -64,6 +64,7 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { ${this._serverUpgradeCheck ? html`` : ''} @@ -90,6 +91,14 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement { .catch(() => {}); } + async #openNewVersion() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + modalManager + .open(this, UMB_NEWVERSION_MODAL) + .onSubmit() + .catch(() => {}); + } + static override styles = [ UmbTextStyles, css` From b0d1a52adbffdc452cd1a3efc4f41e0aea8a7046 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:42:16 +0200 Subject: [PATCH 07/15] update package lock --- package-lock.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 9632640fa9..fe1f0406ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23120,7 +23120,9 @@ "src/packages/static-file": { "name": "@umbraco-backoffice/static-file" }, - "src/packages/sysinfo": {}, + "src/packages/sysinfo": { + "name": "@umbraco-backoffice/sysinfo" + }, "src/packages/tags": { "name": "@umbraco-backoffice/tag" }, From 43c7466461b081abb0832c748097be77c459131e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:43:12 +0200 Subject: [PATCH 08/15] chore: make sonarcloud happy --- src/packages/sysinfo/repository/sysinfo.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packages/sysinfo/repository/sysinfo.repository.ts b/src/packages/sysinfo/repository/sysinfo.repository.ts index be042533c1..fb8822b6ae 100644 --- a/src/packages/sysinfo/repository/sysinfo.repository.ts +++ b/src/packages/sysinfo/repository/sysinfo.repository.ts @@ -37,7 +37,7 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { getStoredServerUpgradeCheck(lastCheck: Date): UmbServerUpgradeCheck | null { const storedCheck = localStorage.getItem('umb:serverUpgradeCheck'); if (storedCheck) { - const upgradeCheck = JSON.parse(storedCheck) as UmbServerUpgradeCheck; + const upgradeCheck: UmbServerUpgradeCheck = JSON.parse(storedCheck); // Check that the stored check is not older than the last check const expiresAt = new Date(upgradeCheck.expires); if (expiresAt.getTime() > lastCheck.getTime()) { From 195a2a1d1f3a3c0258ec5a2046e0a86b01c27adb Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:48:18 +0200 Subject: [PATCH 09/15] feat: add mock handlers for server endpoints --- src/mocks/handlers/server.handlers.ts | 39 +++++++++++++++++++++------ 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/mocks/handlers/server.handlers.ts b/src/mocks/handlers/server.handlers.ts index 6d4d62c268..2aadc06168 100644 --- a/src/mocks/handlers/server.handlers.ts +++ b/src/mocks/handlers/server.handlers.ts @@ -1,10 +1,12 @@ const { rest } = window.MockServiceWorker; import { - type ServerStatusResponseModel, - type ServerInformationResponseModel, - type ServerTroubleshootingResponseModel, RuntimeLevelModel, RuntimeModeModel, + type GetServerUpgradeCheckResponse, + type GetServerTroubleshootingResponse, + type GetServerInformationResponse, + type GetServerConfigurationResponse, + type GetServerStatusResponse, } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -12,7 +14,7 @@ export const serverRunningHandler = rest.get(umbracoPath('/server/status'), (_re return res( // Respond with a 200 status code ctx.status(200), - ctx.json({ + ctx.json({ serverStatus: RuntimeLevelModel.RUN, }), ); @@ -22,7 +24,7 @@ export const serverMustInstallHandler = rest.get(umbracoPath('/server/status'), return res( // Respond with a 200 status code ctx.status(200), - ctx.json({ + ctx.json({ serverStatus: RuntimeLevelModel.INSTALL, }), ); @@ -32,18 +34,39 @@ export const serverMustUpgradeHandler = rest.get(umbracoPath('/server/status'), return res( // Respond with a 200 status code ctx.status(200), - ctx.json({ + ctx.json({ serverStatus: RuntimeLevelModel.UPGRADE, }), ); }); export const serverInformationHandlers = [ + rest.get(umbracoPath('/server/configuration'), (_req, res, ctx) => { + return res( + // Respond with a 200 status code + ctx.status(200), + ctx.json({ + allowPasswordReset: true, + versionCheckPeriod: 7, // days + }), + ); + }), + rest.get(umbracoPath('/server/upgrade-check'), (_req, res, ctx) => { + return res( + // Respond with a 200 status code + ctx.status(200), + ctx.json({ + type: 'Major', + comment: 'A new version is available', + url: 'https://our.umbraco.com/download/releases', + }), + ); + }), rest.get(umbracoPath('/server/information'), (_req, res, ctx) => { return res( // Respond with a 200 status code ctx.status(200), - ctx.json({ + ctx.json({ version: '14.0.0-preview004', assemblyVersion: '14.0.0-preview004', baseUtcOffset: '01:00:00', @@ -55,7 +78,7 @@ export const serverInformationHandlers = [ return res( // Respond with a 200 status code ctx.status(200), - ctx.json({ + ctx.json({ items: [ { name: 'Umbraco base url', data: location.origin }, { name: 'Mocked server', data: 'true' }, From 25503c48cbecbc3d70659227776dd09b682d8be4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:50:37 +0200 Subject: [PATCH 10/15] feat: make method internal --- .../sysinfo/repository/sysinfo.repository.ts | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/packages/sysinfo/repository/sysinfo.repository.ts b/src/packages/sysinfo/repository/sysinfo.repository.ts index fb8822b6ae..2ca94e7533 100644 --- a/src/packages/sysinfo/repository/sysinfo.repository.ts +++ b/src/packages/sysinfo/repository/sysinfo.repository.ts @@ -34,24 +34,6 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { return this.#serverConfiguration?.versionCheckPeriod ?? 7; } - getStoredServerUpgradeCheck(lastCheck: Date): UmbServerUpgradeCheck | null { - const storedCheck = localStorage.getItem('umb:serverUpgradeCheck'); - if (storedCheck) { - const upgradeCheck: UmbServerUpgradeCheck = JSON.parse(storedCheck); - // 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 { // Check if we are allowed to check again const versionCheckPeriod = await this.#getVersionCheckPeriod(); @@ -75,7 +57,7 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { // If we should not check, then return what we have stored if it is still valid if (!shouldCheck) { - return this.getStoredServerUpgradeCheck(lastCheckDate); + return this.#getStoredServerUpgradeCheck(lastCheckDate); } } @@ -102,4 +84,22 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { return null; } + + #getStoredServerUpgradeCheck(lastCheck: Date): UmbServerUpgradeCheck | null { + const storedCheck = localStorage.getItem('umb:serverUpgradeCheck'); + if (storedCheck) { + const upgradeCheck: UmbServerUpgradeCheck = JSON.parse(storedCheck); + // 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; + } } From b9a375fde34ce1ea81fc9e16b0a1dde7492fb6cb Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:51:02 +0200 Subject: [PATCH 11/15] chore: sort methods --- .../sysinfo/repository/sysinfo.repository.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/packages/sysinfo/repository/sysinfo.repository.ts b/src/packages/sysinfo/repository/sysinfo.repository.ts index 2ca94e7533..5f86a53cc6 100644 --- a/src/packages/sysinfo/repository/sysinfo.repository.ts +++ b/src/packages/sysinfo/repository/sysinfo.repository.ts @@ -26,14 +26,6 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { return data; } - async #getVersionCheckPeriod(): Promise { - if (!this.#serverConfiguration) { - this.#serverConfiguration = await this.requestServerConfiguration(); - } - - return this.#serverConfiguration?.versionCheckPeriod ?? 7; - } - async serverUpgradeCheck(): Promise { // Check if we are allowed to check again const versionCheckPeriod = await this.#getVersionCheckPeriod(); @@ -85,6 +77,14 @@ export class UmbSysinfoRepository extends UmbRepositoryBase { return null; } + async #getVersionCheckPeriod(): Promise { + 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) { From aeeea4cdaf89245d223e1b147645baf1f53235d7 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:52:05 +0200 Subject: [PATCH 12/15] chore: generate server api --- src/external/backend-api/src/services.gen.ts | 17 ++++++++++++++++- src/external/backend-api/src/types.gen.ts | 9 +++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/external/backend-api/src/services.gen.ts b/src/external/backend-api/src/services.gen.ts index 7a132b3073..5475bae356 100644 --- a/src/external/backend-api/src/services.gen.ts +++ b/src/external/backend-api/src/services.gen.ts @@ -3,7 +3,7 @@ import type { CancelablePromise } from './core/CancelablePromise'; import { OpenAPI } from './core/OpenAPI'; import { request as __request } from './core/request'; -import type { GetCultureData, GetCultureResponse, PostDataTypeData, PostDataTypeResponse, GetDataTypeByIdData, GetDataTypeByIdResponse, DeleteDataTypeByIdData, DeleteDataTypeByIdResponse, PutDataTypeByIdData, PutDataTypeByIdResponse, PostDataTypeByIdCopyData, PostDataTypeByIdCopyResponse, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedResponse, PutDataTypeByIdMoveData, PutDataTypeByIdMoveResponse, GetDataTypeByIdReferencesData, GetDataTypeByIdReferencesResponse, GetDataTypeConfigurationResponse, PostDataTypeFolderData, PostDataTypeFolderResponse, GetDataTypeFolderByIdData, GetDataTypeFolderByIdResponse, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdResponse, PutDataTypeFolderByIdData, PutDataTypeFolderByIdResponse, GetFilterDataTypeData, GetFilterDataTypeResponse, GetItemDataTypeData, GetItemDataTypeResponse, GetItemDataTypeSearchData, GetItemDataTypeSearchResponse, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsResponse, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenResponse, GetTreeDataTypeRootData, GetTreeDataTypeRootResponse, GetDictionaryData, GetDictionaryResponse, PostDictionaryData, PostDictionaryResponse, GetDictionaryByIdData, GetDictionaryByIdResponse, DeleteDictionaryByIdData, DeleteDictionaryByIdResponse, PutDictionaryByIdData, PutDictionaryByIdResponse, GetDictionaryByIdExportData, GetDictionaryByIdExportResponse, PutDictionaryByIdMoveData, PutDictionaryByIdMoveResponse, PostDictionaryImportData, PostDictionaryImportResponse, GetItemDictionaryData, GetItemDictionaryResponse, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsResponse, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenResponse, GetTreeDictionaryRootData, GetTreeDictionaryRootResponse, PostDocumentBlueprintData, PostDocumentBlueprintResponse, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdResponse, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveResponse, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderResponse, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdResponse, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdResponse, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdResponse, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentResponse, GetItemDocumentBlueprintData, GetItemDocumentBlueprintResponse, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsResponse, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenResponse, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootResponse, PostDocumentTypeData, PostDocumentTypeResponse, GetDocumentTypeByIdData, GetDocumentTypeByIdResponse, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdResponse, PutDocumentTypeByIdData, PutDocumentTypeByIdResponse, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenResponse, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintResponse, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesResponse, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyResponse, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportResponse, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportResponse, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveResponse, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootResponse, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsResponse, GetDocumentTypeConfigurationResponse, PostDocumentTypeFolderData, PostDocumentTypeFolderResponse, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdResponse, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdResponse, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdResponse, PostDocumentTypeImportData, PostDocumentTypeImportResponse, GetItemDocumentTypeData, GetItemDocumentTypeResponse, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchResponse, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsResponse, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenResponse, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootResponse, GetDocumentVersionData, GetDocumentVersionResponse, GetDocumentVersionByIdData, GetDocumentVersionByIdResponse, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupResponse, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackResponse, GetCollectionDocumentByIdData, GetCollectionDocumentByIdResponse, PostDocumentData, PostDocumentResponse, GetDocumentByIdData, GetDocumentByIdResponse, DeleteDocumentByIdData, DeleteDocumentByIdResponse, PutDocumentByIdData, PutDocumentByIdResponse, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogResponse, PostDocumentByIdCopyData, PostDocumentByIdCopyResponse, GetDocumentByIdDomainsData, GetDocumentByIdDomainsResponse, PutDocumentByIdDomainsData, PutDocumentByIdDomainsResponse, PutDocumentByIdMoveData, PutDocumentByIdMoveResponse, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinResponse, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsResponse, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsResponse, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessResponse, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessResponse, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessResponse, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessResponse, PutDocumentByIdPublishData, PutDocumentByIdPublishResponse, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsResponse, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByResponse, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsResponse, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishResponse, PutDocumentByIdValidateData, PutDocumentByIdValidateResponse, GetDocumentAreReferencedData, GetDocumentAreReferencedResponse, GetDocumentConfigurationResponse, PutDocumentSortData, PutDocumentSortResponse, GetDocumentUrlsData, GetDocumentUrlsResponse, PostDocumentValidateData, PostDocumentValidateResponse, GetItemDocumentData, GetItemDocumentResponse, GetItemDocumentSearchData, GetItemDocumentSearchResponse, DeleteRecycleBinDocumentResponse, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdResponse, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentResponse, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreResponse, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenResponse, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootResponse, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsResponse, GetTreeDocumentChildrenData, GetTreeDocumentChildrenResponse, GetTreeDocumentRootData, GetTreeDocumentRootResponse, PostDynamicRootQueryData, PostDynamicRootQueryResponse, GetDynamicRootStepsResponse, GetHealthCheckGroupData, GetHealthCheckGroupResponse, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameResponse, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckResponse, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionResponse, GetHelpData, GetHelpResponse, GetImagingResizeUrlsData, GetImagingResizeUrlsResponse, GetImportAnalyzeData, GetImportAnalyzeResponse, GetIndexerData, GetIndexerResponse, GetIndexerByIndexNameData, GetIndexerByIndexNameResponse, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildResponse, GetInstallSettingsResponse, PostInstallSetupData, PostInstallSetupResponse, PostInstallValidateDatabaseData, PostInstallValidateDatabaseResponse, GetItemLanguageData, GetItemLanguageResponse, GetItemLanguageDefaultResponse, GetLanguageData, GetLanguageResponse, PostLanguageData, PostLanguageResponse, GetLanguageByIsoCodeData, GetLanguageByIsoCodeResponse, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeResponse, PutLanguageByIsoCodeData, PutLanguageByIsoCodeResponse, GetLogViewerLevelData, GetLogViewerLevelResponse, GetLogViewerLevelCountData, GetLogViewerLevelCountResponse, GetLogViewerLogData, GetLogViewerLogResponse, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateResponse, GetLogViewerSavedSearchData, GetLogViewerSavedSearchResponse, PostLogViewerSavedSearchData, PostLogViewerSavedSearchResponse, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameResponse, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameResponse, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeResponse, GetManifestManifestResponse, GetManifestManifestPrivateResponse, GetManifestManifestPublicResponse, GetItemMediaTypeData, GetItemMediaTypeResponse, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedResponse, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersResponse, GetItemMediaTypeSearchData, GetItemMediaTypeSearchResponse, PostMediaTypeData, PostMediaTypeResponse, GetMediaTypeByIdData, GetMediaTypeByIdResponse, DeleteMediaTypeByIdData, DeleteMediaTypeByIdResponse, PutMediaTypeByIdData, PutMediaTypeByIdResponse, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenResponse, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesResponse, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyResponse, GetMediaTypeByIdExportData, GetMediaTypeByIdExportResponse, PutMediaTypeByIdImportData, PutMediaTypeByIdImportResponse, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveResponse, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootResponse, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsResponse, GetMediaTypeConfigurationResponse, PostMediaTypeFolderData, PostMediaTypeFolderResponse, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdResponse, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdResponse, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdResponse, PostMediaTypeImportData, PostMediaTypeImportResponse, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsResponse, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenResponse, GetTreeMediaTypeRootData, GetTreeMediaTypeRootResponse, GetCollectionMediaData, GetCollectionMediaResponse, GetItemMediaData, GetItemMediaResponse, GetItemMediaSearchData, GetItemMediaSearchResponse, PostMediaData, PostMediaResponse, GetMediaByIdData, GetMediaByIdResponse, DeleteMediaByIdData, DeleteMediaByIdResponse, PutMediaByIdData, PutMediaByIdResponse, GetMediaByIdAuditLogData, GetMediaByIdAuditLogResponse, PutMediaByIdMoveData, PutMediaByIdMoveResponse, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinResponse, GetMediaByIdReferencedByData, GetMediaByIdReferencedByResponse, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsResponse, PutMediaByIdValidateData, PutMediaByIdValidateResponse, GetMediaAreReferencedData, GetMediaAreReferencedResponse, GetMediaConfigurationResponse, PutMediaSortData, PutMediaSortResponse, GetMediaUrlsData, GetMediaUrlsResponse, PostMediaValidateData, PostMediaValidateResponse, DeleteRecycleBinMediaResponse, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdResponse, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentResponse, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreResponse, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenResponse, GetRecycleBinMediaRootData, GetRecycleBinMediaRootResponse, GetTreeMediaAncestorsData, GetTreeMediaAncestorsResponse, GetTreeMediaChildrenData, GetTreeMediaChildrenResponse, GetTreeMediaRootData, GetTreeMediaRootResponse, GetItemMemberGroupData, GetItemMemberGroupResponse, GetMemberGroupData, GetMemberGroupResponse, PostMemberGroupData, PostMemberGroupResponse, GetMemberGroupByIdData, GetMemberGroupByIdResponse, DeleteMemberGroupByIdData, DeleteMemberGroupByIdResponse, PutMemberGroupByIdData, PutMemberGroupByIdResponse, GetTreeMemberGroupRootData, GetTreeMemberGroupRootResponse, GetItemMemberTypeData, GetItemMemberTypeResponse, GetItemMemberTypeSearchData, GetItemMemberTypeSearchResponse, PostMemberTypeData, PostMemberTypeResponse, GetMemberTypeByIdData, GetMemberTypeByIdResponse, DeleteMemberTypeByIdData, DeleteMemberTypeByIdResponse, PutMemberTypeByIdData, PutMemberTypeByIdResponse, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesResponse, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyResponse, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsResponse, GetMemberTypeConfigurationResponse, GetTreeMemberTypeRootData, GetTreeMemberTypeRootResponse, GetFilterMemberData, GetFilterMemberResponse, GetItemMemberData, GetItemMemberResponse, GetItemMemberSearchData, GetItemMemberSearchResponse, PostMemberData, PostMemberResponse, GetMemberByIdData, GetMemberByIdResponse, DeleteMemberByIdData, DeleteMemberByIdResponse, PutMemberByIdData, PutMemberByIdResponse, PutMemberByIdValidateData, PutMemberByIdValidateResponse, GetMemberConfigurationResponse, PostMemberValidateData, PostMemberValidateResponse, PostModelsBuilderBuildResponse, GetModelsBuilderDashboardResponse, GetModelsBuilderStatusResponse, GetObjectTypesData, GetObjectTypesResponse, GetOembedQueryData, GetOembedQueryResponse, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationResponse, GetPackageConfigurationResponse, GetPackageCreatedData, GetPackageCreatedResponse, PostPackageCreatedData, PostPackageCreatedResponse, GetPackageCreatedByIdData, GetPackageCreatedByIdResponse, DeletePackageCreatedByIdData, DeletePackageCreatedByIdResponse, PutPackageCreatedByIdData, PutPackageCreatedByIdResponse, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadResponse, GetPackageMigrationStatusData, GetPackageMigrationStatusResponse, GetItemPartialViewData, GetItemPartialViewResponse, PostPartialViewData, PostPartialViewResponse, GetPartialViewByPathData, GetPartialViewByPathResponse, DeletePartialViewByPathData, DeletePartialViewByPathResponse, PutPartialViewByPathData, PutPartialViewByPathResponse, PutPartialViewByPathRenameData, PutPartialViewByPathRenameResponse, PostPartialViewFolderData, PostPartialViewFolderResponse, GetPartialViewFolderByPathData, GetPartialViewFolderByPathResponse, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathResponse, GetPartialViewSnippetData, GetPartialViewSnippetResponse, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdResponse, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsResponse, GetTreePartialViewChildrenData, GetTreePartialViewChildrenResponse, GetTreePartialViewRootData, GetTreePartialViewRootResponse, DeletePreviewResponse, PostPreviewResponse, GetProfilingStatusResponse, PutProfilingStatusData, PutProfilingStatusResponse, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedResponse, PostPublishedCacheCollectResponse, PostPublishedCacheRebuildResponse, PostPublishedCacheReloadResponse, GetPublishedCacheStatusResponse, GetRedirectManagementData, GetRedirectManagementResponse, GetRedirectManagementByIdData, GetRedirectManagementByIdResponse, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdResponse, GetRedirectManagementStatusResponse, PostRedirectManagementStatusData, PostRedirectManagementStatusResponse, GetItemRelationTypeData, GetItemRelationTypeResponse, GetRelationTypeData, GetRelationTypeResponse, GetRelationTypeByIdData, GetRelationTypeByIdResponse, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdResponse, GetItemScriptData, GetItemScriptResponse, PostScriptData, PostScriptResponse, GetScriptByPathData, GetScriptByPathResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, PutScriptByPathData, PutScriptByPathResponse, PutScriptByPathRenameData, PutScriptByPathRenameResponse, PostScriptFolderData, PostScriptFolderResponse, GetScriptFolderByPathData, GetScriptFolderByPathResponse, DeleteScriptFolderByPathData, DeleteScriptFolderByPathResponse, GetTreeScriptAncestorsData, GetTreeScriptAncestorsResponse, GetTreeScriptChildrenData, GetTreeScriptChildrenResponse, GetTreeScriptRootData, GetTreeScriptRootResponse, GetSearcherData, GetSearcherResponse, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryResponse, GetSecurityConfigurationResponse, PostSecurityForgotPasswordData, PostSecurityForgotPasswordResponse, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetResponse, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyResponse, GetSegmentData, GetSegmentResponse, GetServerConfigurationResponse, GetServerInformationResponse, GetServerStatusResponse, GetServerTroubleshootingResponse, GetItemStaticFileData, GetItemStaticFileResponse, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsResponse, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenResponse, GetTreeStaticFileRootData, GetTreeStaticFileRootResponse, GetItemStylesheetData, GetItemStylesheetResponse, PostStylesheetData, PostStylesheetResponse, GetStylesheetByPathData, GetStylesheetByPathResponse, DeleteStylesheetByPathData, DeleteStylesheetByPathResponse, PutStylesheetByPathData, PutStylesheetByPathResponse, PutStylesheetByPathRenameData, PutStylesheetByPathRenameResponse, PostStylesheetFolderData, PostStylesheetFolderResponse, GetStylesheetFolderByPathData, GetStylesheetFolderByPathResponse, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathResponse, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsResponse, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenResponse, GetTreeStylesheetRootData, GetTreeStylesheetRootResponse, GetTagData, GetTagResponse, GetTelemetryData, GetTelemetryResponse, GetTelemetryLevelResponse, PostTelemetryLevelData, PostTelemetryLevelResponse, GetItemTemplateData, GetItemTemplateResponse, GetItemTemplateSearchData, GetItemTemplateSearchResponse, PostTemplateData, PostTemplateResponse, GetTemplateByIdData, GetTemplateByIdResponse, DeleteTemplateByIdData, DeleteTemplateByIdResponse, PutTemplateByIdData, PutTemplateByIdResponse, GetTemplateConfigurationResponse, PostTemplateQueryExecuteData, PostTemplateQueryExecuteResponse, GetTemplateQuerySettingsResponse, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsResponse, GetTreeTemplateChildrenData, GetTreeTemplateChildrenResponse, GetTreeTemplateRootData, GetTreeTemplateRootResponse, PostTemporaryFileData, PostTemporaryFileResponse, GetTemporaryFileByIdData, GetTemporaryFileByIdResponse, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdResponse, GetTemporaryFileConfigurationResponse, PostUpgradeAuthorizeResponse, GetUpgradeSettingsResponse, PostUserDataData, PostUserDataResponse, GetUserDataData, GetUserDataResponse, PutUserDataData, PutUserDataResponse, GetUserDataByIdData, GetUserDataByIdResponse, GetFilterUserGroupData, GetFilterUserGroupResponse, GetItemUserGroupData, GetItemUserGroupResponse, DeleteUserGroupData, DeleteUserGroupResponse, PostUserGroupData, PostUserGroupResponse, GetUserGroupData, GetUserGroupResponse, GetUserGroupByIdData, GetUserGroupByIdResponse, DeleteUserGroupByIdData, DeleteUserGroupByIdResponse, PutUserGroupByIdData, PutUserGroupByIdResponse, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersResponse, PostUserGroupByIdUsersData, PostUserGroupByIdUsersResponse, GetFilterUserData, GetFilterUserResponse, GetItemUserData, GetItemUserResponse, PostUserData, PostUserResponse, DeleteUserData, DeleteUserResponse, GetUserData, GetUserResponse, GetUserByIdData, GetUserByIdResponse, DeleteUserByIdData, DeleteUserByIdResponse, PutUserByIdData, PutUserByIdResponse, GetUserById2FaData, GetUserById2FaResponse, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameResponse, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesResponse, PostUserByIdChangePasswordData, PostUserByIdChangePasswordResponse, PostUserByIdResetPasswordData, PostUserByIdResetPasswordResponse, DeleteUserAvatarByIdData, DeleteUserAvatarByIdResponse, PostUserAvatarByIdData, PostUserAvatarByIdResponse, GetUserConfigurationResponse, GetUserCurrentResponse, GetUserCurrent2FaResponse, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameResponse, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameResponse, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameResponse, PostUserCurrentAvatarData, PostUserCurrentAvatarResponse, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordResponse, GetUserCurrentConfigurationResponse, GetUserCurrentLoginProvidersResponse, GetUserCurrentPermissionsData, GetUserCurrentPermissionsResponse, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentResponse, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaResponse, PostUserDisableData, PostUserDisableResponse, PostUserEnableData, PostUserEnableResponse, PostUserInviteData, PostUserInviteResponse, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordResponse, PostUserInviteResendData, PostUserInviteResendResponse, PostUserInviteVerifyData, PostUserInviteVerifyResponse, PostUserSetUserGroupsData, PostUserSetUserGroupsResponse, PostUserUnlockData, PostUserUnlockResponse, GetItemWebhookData, GetItemWebhookResponse, GetWebhookData, GetWebhookResponse, PostWebhookData, PostWebhookResponse, GetWebhookByIdData, GetWebhookByIdResponse, DeleteWebhookByIdData, DeleteWebhookByIdResponse, PutWebhookByIdData, PutWebhookByIdResponse, GetWebhookEventsData, GetWebhookEventsResponse } from './types.gen'; +import type { GetCultureData, GetCultureResponse, PostDataTypeData, PostDataTypeResponse, GetDataTypeByIdData, GetDataTypeByIdResponse, DeleteDataTypeByIdData, DeleteDataTypeByIdResponse, PutDataTypeByIdData, PutDataTypeByIdResponse, PostDataTypeByIdCopyData, PostDataTypeByIdCopyResponse, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedResponse, PutDataTypeByIdMoveData, PutDataTypeByIdMoveResponse, GetDataTypeByIdReferencesData, GetDataTypeByIdReferencesResponse, GetDataTypeConfigurationResponse, PostDataTypeFolderData, PostDataTypeFolderResponse, GetDataTypeFolderByIdData, GetDataTypeFolderByIdResponse, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdResponse, PutDataTypeFolderByIdData, PutDataTypeFolderByIdResponse, GetFilterDataTypeData, GetFilterDataTypeResponse, GetItemDataTypeData, GetItemDataTypeResponse, GetItemDataTypeSearchData, GetItemDataTypeSearchResponse, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsResponse, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenResponse, GetTreeDataTypeRootData, GetTreeDataTypeRootResponse, GetDictionaryData, GetDictionaryResponse, PostDictionaryData, PostDictionaryResponse, GetDictionaryByIdData, GetDictionaryByIdResponse, DeleteDictionaryByIdData, DeleteDictionaryByIdResponse, PutDictionaryByIdData, PutDictionaryByIdResponse, GetDictionaryByIdExportData, GetDictionaryByIdExportResponse, PutDictionaryByIdMoveData, PutDictionaryByIdMoveResponse, PostDictionaryImportData, PostDictionaryImportResponse, GetItemDictionaryData, GetItemDictionaryResponse, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsResponse, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenResponse, GetTreeDictionaryRootData, GetTreeDictionaryRootResponse, PostDocumentBlueprintData, PostDocumentBlueprintResponse, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdResponse, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveResponse, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderResponse, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdResponse, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdResponse, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdResponse, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentResponse, GetItemDocumentBlueprintData, GetItemDocumentBlueprintResponse, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsResponse, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenResponse, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootResponse, PostDocumentTypeData, PostDocumentTypeResponse, GetDocumentTypeByIdData, GetDocumentTypeByIdResponse, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdResponse, PutDocumentTypeByIdData, PutDocumentTypeByIdResponse, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenResponse, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintResponse, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesResponse, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyResponse, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportResponse, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportResponse, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveResponse, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootResponse, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsResponse, GetDocumentTypeConfigurationResponse, PostDocumentTypeFolderData, PostDocumentTypeFolderResponse, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdResponse, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdResponse, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdResponse, PostDocumentTypeImportData, PostDocumentTypeImportResponse, GetItemDocumentTypeData, GetItemDocumentTypeResponse, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchResponse, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsResponse, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenResponse, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootResponse, GetDocumentVersionData, GetDocumentVersionResponse, GetDocumentVersionByIdData, GetDocumentVersionByIdResponse, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupResponse, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackResponse, GetCollectionDocumentByIdData, GetCollectionDocumentByIdResponse, PostDocumentData, PostDocumentResponse, GetDocumentByIdData, GetDocumentByIdResponse, DeleteDocumentByIdData, DeleteDocumentByIdResponse, PutDocumentByIdData, PutDocumentByIdResponse, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogResponse, PostDocumentByIdCopyData, PostDocumentByIdCopyResponse, GetDocumentByIdDomainsData, GetDocumentByIdDomainsResponse, PutDocumentByIdDomainsData, PutDocumentByIdDomainsResponse, PutDocumentByIdMoveData, PutDocumentByIdMoveResponse, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinResponse, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsResponse, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsResponse, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessResponse, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessResponse, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessResponse, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessResponse, PutDocumentByIdPublishData, PutDocumentByIdPublishResponse, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsResponse, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByResponse, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsResponse, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishResponse, PutDocumentByIdValidateData, PutDocumentByIdValidateResponse, GetDocumentAreReferencedData, GetDocumentAreReferencedResponse, GetDocumentConfigurationResponse, PutDocumentSortData, PutDocumentSortResponse, GetDocumentUrlsData, GetDocumentUrlsResponse, PostDocumentValidateData, PostDocumentValidateResponse, GetItemDocumentData, GetItemDocumentResponse, GetItemDocumentSearchData, GetItemDocumentSearchResponse, DeleteRecycleBinDocumentResponse, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdResponse, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentResponse, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreResponse, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenResponse, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootResponse, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsResponse, GetTreeDocumentChildrenData, GetTreeDocumentChildrenResponse, GetTreeDocumentRootData, GetTreeDocumentRootResponse, PostDynamicRootQueryData, PostDynamicRootQueryResponse, GetDynamicRootStepsResponse, GetHealthCheckGroupData, GetHealthCheckGroupResponse, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameResponse, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckResponse, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionResponse, GetHelpData, GetHelpResponse, GetImagingResizeUrlsData, GetImagingResizeUrlsResponse, GetImportAnalyzeData, GetImportAnalyzeResponse, GetIndexerData, GetIndexerResponse, GetIndexerByIndexNameData, GetIndexerByIndexNameResponse, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildResponse, GetInstallSettingsResponse, PostInstallSetupData, PostInstallSetupResponse, PostInstallValidateDatabaseData, PostInstallValidateDatabaseResponse, GetItemLanguageData, GetItemLanguageResponse, GetItemLanguageDefaultResponse, GetLanguageData, GetLanguageResponse, PostLanguageData, PostLanguageResponse, GetLanguageByIsoCodeData, GetLanguageByIsoCodeResponse, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeResponse, PutLanguageByIsoCodeData, PutLanguageByIsoCodeResponse, GetLogViewerLevelData, GetLogViewerLevelResponse, GetLogViewerLevelCountData, GetLogViewerLevelCountResponse, GetLogViewerLogData, GetLogViewerLogResponse, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateResponse, GetLogViewerSavedSearchData, GetLogViewerSavedSearchResponse, PostLogViewerSavedSearchData, PostLogViewerSavedSearchResponse, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameResponse, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameResponse, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeResponse, GetManifestManifestResponse, GetManifestManifestPrivateResponse, GetManifestManifestPublicResponse, GetItemMediaTypeData, GetItemMediaTypeResponse, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedResponse, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersResponse, GetItemMediaTypeSearchData, GetItemMediaTypeSearchResponse, PostMediaTypeData, PostMediaTypeResponse, GetMediaTypeByIdData, GetMediaTypeByIdResponse, DeleteMediaTypeByIdData, DeleteMediaTypeByIdResponse, PutMediaTypeByIdData, PutMediaTypeByIdResponse, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenResponse, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesResponse, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyResponse, GetMediaTypeByIdExportData, GetMediaTypeByIdExportResponse, PutMediaTypeByIdImportData, PutMediaTypeByIdImportResponse, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveResponse, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootResponse, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsResponse, GetMediaTypeConfigurationResponse, PostMediaTypeFolderData, PostMediaTypeFolderResponse, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdResponse, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdResponse, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdResponse, PostMediaTypeImportData, PostMediaTypeImportResponse, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsResponse, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenResponse, GetTreeMediaTypeRootData, GetTreeMediaTypeRootResponse, GetCollectionMediaData, GetCollectionMediaResponse, GetItemMediaData, GetItemMediaResponse, GetItemMediaSearchData, GetItemMediaSearchResponse, PostMediaData, PostMediaResponse, GetMediaByIdData, GetMediaByIdResponse, DeleteMediaByIdData, DeleteMediaByIdResponse, PutMediaByIdData, PutMediaByIdResponse, GetMediaByIdAuditLogData, GetMediaByIdAuditLogResponse, PutMediaByIdMoveData, PutMediaByIdMoveResponse, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinResponse, GetMediaByIdReferencedByData, GetMediaByIdReferencedByResponse, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsResponse, PutMediaByIdValidateData, PutMediaByIdValidateResponse, GetMediaAreReferencedData, GetMediaAreReferencedResponse, GetMediaConfigurationResponse, PutMediaSortData, PutMediaSortResponse, GetMediaUrlsData, GetMediaUrlsResponse, PostMediaValidateData, PostMediaValidateResponse, DeleteRecycleBinMediaResponse, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdResponse, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentResponse, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreResponse, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenResponse, GetRecycleBinMediaRootData, GetRecycleBinMediaRootResponse, GetTreeMediaAncestorsData, GetTreeMediaAncestorsResponse, GetTreeMediaChildrenData, GetTreeMediaChildrenResponse, GetTreeMediaRootData, GetTreeMediaRootResponse, GetItemMemberGroupData, GetItemMemberGroupResponse, GetMemberGroupData, GetMemberGroupResponse, PostMemberGroupData, PostMemberGroupResponse, GetMemberGroupByIdData, GetMemberGroupByIdResponse, DeleteMemberGroupByIdData, DeleteMemberGroupByIdResponse, PutMemberGroupByIdData, PutMemberGroupByIdResponse, GetTreeMemberGroupRootData, GetTreeMemberGroupRootResponse, GetItemMemberTypeData, GetItemMemberTypeResponse, GetItemMemberTypeSearchData, GetItemMemberTypeSearchResponse, PostMemberTypeData, PostMemberTypeResponse, GetMemberTypeByIdData, GetMemberTypeByIdResponse, DeleteMemberTypeByIdData, DeleteMemberTypeByIdResponse, PutMemberTypeByIdData, PutMemberTypeByIdResponse, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesResponse, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyResponse, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsResponse, GetMemberTypeConfigurationResponse, GetTreeMemberTypeRootData, GetTreeMemberTypeRootResponse, GetFilterMemberData, GetFilterMemberResponse, GetItemMemberData, GetItemMemberResponse, GetItemMemberSearchData, GetItemMemberSearchResponse, PostMemberData, PostMemberResponse, GetMemberByIdData, GetMemberByIdResponse, DeleteMemberByIdData, DeleteMemberByIdResponse, PutMemberByIdData, PutMemberByIdResponse, PutMemberByIdValidateData, PutMemberByIdValidateResponse, GetMemberConfigurationResponse, PostMemberValidateData, PostMemberValidateResponse, PostModelsBuilderBuildResponse, GetModelsBuilderDashboardResponse, GetModelsBuilderStatusResponse, GetObjectTypesData, GetObjectTypesResponse, GetOembedQueryData, GetOembedQueryResponse, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationResponse, GetPackageConfigurationResponse, GetPackageCreatedData, GetPackageCreatedResponse, PostPackageCreatedData, PostPackageCreatedResponse, GetPackageCreatedByIdData, GetPackageCreatedByIdResponse, DeletePackageCreatedByIdData, DeletePackageCreatedByIdResponse, PutPackageCreatedByIdData, PutPackageCreatedByIdResponse, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadResponse, GetPackageMigrationStatusData, GetPackageMigrationStatusResponse, GetItemPartialViewData, GetItemPartialViewResponse, PostPartialViewData, PostPartialViewResponse, GetPartialViewByPathData, GetPartialViewByPathResponse, DeletePartialViewByPathData, DeletePartialViewByPathResponse, PutPartialViewByPathData, PutPartialViewByPathResponse, PutPartialViewByPathRenameData, PutPartialViewByPathRenameResponse, PostPartialViewFolderData, PostPartialViewFolderResponse, GetPartialViewFolderByPathData, GetPartialViewFolderByPathResponse, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathResponse, GetPartialViewSnippetData, GetPartialViewSnippetResponse, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdResponse, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsResponse, GetTreePartialViewChildrenData, GetTreePartialViewChildrenResponse, GetTreePartialViewRootData, GetTreePartialViewRootResponse, DeletePreviewResponse, PostPreviewResponse, GetProfilingStatusResponse, PutProfilingStatusData, PutProfilingStatusResponse, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedResponse, PostPublishedCacheCollectResponse, PostPublishedCacheRebuildResponse, PostPublishedCacheReloadResponse, GetPublishedCacheStatusResponse, GetRedirectManagementData, GetRedirectManagementResponse, GetRedirectManagementByIdData, GetRedirectManagementByIdResponse, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdResponse, GetRedirectManagementStatusResponse, PostRedirectManagementStatusData, PostRedirectManagementStatusResponse, GetItemRelationTypeData, GetItemRelationTypeResponse, GetRelationTypeData, GetRelationTypeResponse, GetRelationTypeByIdData, GetRelationTypeByIdResponse, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdResponse, GetItemScriptData, GetItemScriptResponse, PostScriptData, PostScriptResponse, GetScriptByPathData, GetScriptByPathResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, PutScriptByPathData, PutScriptByPathResponse, PutScriptByPathRenameData, PutScriptByPathRenameResponse, PostScriptFolderData, PostScriptFolderResponse, GetScriptFolderByPathData, GetScriptFolderByPathResponse, DeleteScriptFolderByPathData, DeleteScriptFolderByPathResponse, GetTreeScriptAncestorsData, GetTreeScriptAncestorsResponse, GetTreeScriptChildrenData, GetTreeScriptChildrenResponse, GetTreeScriptRootData, GetTreeScriptRootResponse, GetSearcherData, GetSearcherResponse, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryResponse, GetSecurityConfigurationResponse, PostSecurityForgotPasswordData, PostSecurityForgotPasswordResponse, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetResponse, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyResponse, GetSegmentData, GetSegmentResponse, GetServerConfigurationResponse, GetServerInformationResponse, GetServerStatusResponse, GetServerTroubleshootingResponse, GetServerUpgradeCheckResponse, GetItemStaticFileData, GetItemStaticFileResponse, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsResponse, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenResponse, GetTreeStaticFileRootData, GetTreeStaticFileRootResponse, GetItemStylesheetData, GetItemStylesheetResponse, PostStylesheetData, PostStylesheetResponse, GetStylesheetByPathData, GetStylesheetByPathResponse, DeleteStylesheetByPathData, DeleteStylesheetByPathResponse, PutStylesheetByPathData, PutStylesheetByPathResponse, PutStylesheetByPathRenameData, PutStylesheetByPathRenameResponse, PostStylesheetFolderData, PostStylesheetFolderResponse, GetStylesheetFolderByPathData, GetStylesheetFolderByPathResponse, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathResponse, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsResponse, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenResponse, GetTreeStylesheetRootData, GetTreeStylesheetRootResponse, GetTagData, GetTagResponse, GetTelemetryData, GetTelemetryResponse, GetTelemetryLevelResponse, PostTelemetryLevelData, PostTelemetryLevelResponse, GetItemTemplateData, GetItemTemplateResponse, GetItemTemplateSearchData, GetItemTemplateSearchResponse, PostTemplateData, PostTemplateResponse, GetTemplateByIdData, GetTemplateByIdResponse, DeleteTemplateByIdData, DeleteTemplateByIdResponse, PutTemplateByIdData, PutTemplateByIdResponse, GetTemplateConfigurationResponse, PostTemplateQueryExecuteData, PostTemplateQueryExecuteResponse, GetTemplateQuerySettingsResponse, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsResponse, GetTreeTemplateChildrenData, GetTreeTemplateChildrenResponse, GetTreeTemplateRootData, GetTreeTemplateRootResponse, PostTemporaryFileData, PostTemporaryFileResponse, GetTemporaryFileByIdData, GetTemporaryFileByIdResponse, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdResponse, GetTemporaryFileConfigurationResponse, PostUpgradeAuthorizeResponse, GetUpgradeSettingsResponse, PostUserDataData, PostUserDataResponse, GetUserDataData, GetUserDataResponse, PutUserDataData, PutUserDataResponse, GetUserDataByIdData, GetUserDataByIdResponse, GetFilterUserGroupData, GetFilterUserGroupResponse, GetItemUserGroupData, GetItemUserGroupResponse, DeleteUserGroupData, DeleteUserGroupResponse, PostUserGroupData, PostUserGroupResponse, GetUserGroupData, GetUserGroupResponse, GetUserGroupByIdData, GetUserGroupByIdResponse, DeleteUserGroupByIdData, DeleteUserGroupByIdResponse, PutUserGroupByIdData, PutUserGroupByIdResponse, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersResponse, PostUserGroupByIdUsersData, PostUserGroupByIdUsersResponse, GetFilterUserData, GetFilterUserResponse, GetItemUserData, GetItemUserResponse, PostUserData, PostUserResponse, DeleteUserData, DeleteUserResponse, GetUserData, GetUserResponse, GetUserByIdData, GetUserByIdResponse, DeleteUserByIdData, DeleteUserByIdResponse, PutUserByIdData, PutUserByIdResponse, GetUserById2FaData, GetUserById2FaResponse, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameResponse, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesResponse, PostUserByIdChangePasswordData, PostUserByIdChangePasswordResponse, PostUserByIdResetPasswordData, PostUserByIdResetPasswordResponse, DeleteUserAvatarByIdData, DeleteUserAvatarByIdResponse, PostUserAvatarByIdData, PostUserAvatarByIdResponse, GetUserConfigurationResponse, GetUserCurrentResponse, GetUserCurrent2FaResponse, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameResponse, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameResponse, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameResponse, PostUserCurrentAvatarData, PostUserCurrentAvatarResponse, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordResponse, GetUserCurrentConfigurationResponse, GetUserCurrentLoginProvidersResponse, GetUserCurrentPermissionsData, GetUserCurrentPermissionsResponse, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentResponse, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaResponse, PostUserDisableData, PostUserDisableResponse, PostUserEnableData, PostUserEnableResponse, PostUserInviteData, PostUserInviteResponse, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordResponse, PostUserInviteResendData, PostUserInviteResendResponse, PostUserInviteVerifyData, PostUserInviteVerifyResponse, PostUserSetUserGroupsData, PostUserSetUserGroupsResponse, PostUserUnlockData, PostUserUnlockResponse, GetItemWebhookData, GetItemWebhookResponse, GetWebhookData, GetWebhookResponse, PostWebhookData, PostWebhookResponse, GetWebhookByIdData, GetWebhookByIdResponse, DeleteWebhookByIdData, DeleteWebhookByIdResponse, PutWebhookByIdData, PutWebhookByIdResponse, GetWebhookEventsData, GetWebhookEventsResponse } from './types.gen'; export class CultureService { /** @@ -6681,6 +6681,21 @@ export class ServerService { }); } + /** + * @returns unknown OK + * @throws ApiError + */ + public static getServerUpgradeCheck(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/server/upgrade-check', + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' + } + }); + } + } export class StaticFileService { diff --git a/src/external/backend-api/src/types.gen.ts b/src/external/backend-api/src/types.gen.ts index 6a1ac2dca6..5a7d32f9f7 100644 --- a/src/external/backend-api/src/types.gen.ts +++ b/src/external/backend-api/src/types.gen.ts @@ -2149,6 +2149,7 @@ export type ServerConfigurationItemResponseModel = { export type ServerConfigurationResponseModel = { allowPasswordReset: boolean; + versionCheckPeriod: number; }; export type ServerInformationResponseModel = { @@ -2608,6 +2609,12 @@ export type UpdateWebhookRequestModel = { events: Array<(string)>; }; +export type UpgradeCheckResponseModel = { + type: string; + comment: string; + url: string; +}; + export type UpgradeSettingsResponseModel = { currentState: string; newState: string; @@ -4667,6 +4674,8 @@ export type GetServerStatusResponse = ((ServerStatusResponseModel)); export type GetServerTroubleshootingResponse = ((ServerTroubleshootingResponseModel)); +export type GetServerUpgradeCheckResponse = ((UpgradeCheckResponseModel)); + export type GetItemStaticFileData = { path?: Array<(string)>; }; From 99491ee8292bfd78bdca9d985ef51519e2de518a Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 12 Sep 2024 13:35:27 +0200 Subject: [PATCH 13/15] chore: change text based on actual texts coming from Our --- src/mocks/handlers/server.handlers.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mocks/handlers/server.handlers.ts b/src/mocks/handlers/server.handlers.ts index 2aadc06168..38c1d1626c 100644 --- a/src/mocks/handlers/server.handlers.ts +++ b/src/mocks/handlers/server.handlers.ts @@ -56,9 +56,9 @@ export const serverInformationHandlers = [ // Respond with a 200 status code ctx.status(200), ctx.json({ - type: 'Major', - comment: 'A new version is available', - url: 'https://our.umbraco.com/download/releases', + type: 'Minor', + comment: "14.2.0.0 is released. Upgrade today - it's free!", + url: 'http://our.umbraco.org/contribute/releases/1420', }), ); }), @@ -67,8 +67,8 @@ export const serverInformationHandlers = [ // Respond with a 200 status code ctx.status(200), ctx.json({ - version: '14.0.0-preview004', - assemblyVersion: '14.0.0-preview004', + version: '14.0.0', + assemblyVersion: '14.0.0', baseUtcOffset: '01:00:00', runtimeMode: RuntimeModeModel.BACKOFFICE_DEVELOPMENT, }), From b15cdf616a9ac1a810981c415c8da8597ee180bb Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 12 Sep 2024 13:39:31 +0200 Subject: [PATCH 14/15] chore: update link to sonarcloud is happy --- src/mocks/handlers/server.handlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mocks/handlers/server.handlers.ts b/src/mocks/handlers/server.handlers.ts index 38c1d1626c..73f733310e 100644 --- a/src/mocks/handlers/server.handlers.ts +++ b/src/mocks/handlers/server.handlers.ts @@ -58,7 +58,7 @@ export const serverInformationHandlers = [ ctx.json({ type: 'Minor', comment: "14.2.0.0 is released. Upgrade today - it's free!", - url: 'http://our.umbraco.org/contribute/releases/1420', + url: 'https://our.umbraco.com/download/releases/1420', }), ); }), From aaa6722473f35b1e16f253c2a8ac11a815d73de4 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Thu, 12 Sep 2024 16:29:13 +0100 Subject: [PATCH 15/15] Tweaked "read more" button icon to appear next to the label, rather than below it. --- .../sysinfo/components/new-version.element.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/packages/sysinfo/components/new-version.element.ts b/src/packages/sysinfo/components/new-version.element.ts index 616b1b347c..b12c0e7b23 100644 --- a/src/packages/sysinfo/components/new-version.element.ts +++ b/src/packages/sysinfo/components/new-version.element.ts @@ -1,6 +1,6 @@ import { UmbSysinfoRepository } from '../repository/sysinfo.repository.js'; import type { UmbServerUpgradeCheck } from '../types.js'; -import { customElement, html, state, when } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, state, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; @@ -41,7 +41,7 @@ export class UmbNewVersionElement extends UmbModalBaseElement { color="positive" label=${this.localize.term('general_readMore')}> Read more - + ` : ''} @@ -49,7 +49,14 @@ export class UmbNewVersionElement extends UmbModalBaseElement { `; } - static override readonly styles = [UmbTextStyles]; + static override readonly styles = [ + UmbTextStyles, + css` + umb-icon { + margin-left: var(--uui-size-2); + } + `, + ]; } export default UmbNewVersionElement;