gristlabs_grist-core/app/common/InstallAPI.ts
Jarosław Sadziński ecf242c6c6 (core) Adding latest version section to the admin panel.
Summary:
Update for the admin page to show the latest available version information.
- Latest version is read from docs.getgrist.com by default
- It sends basic information (installationId, deployment type, and version)
- Checks are done only on the page itself
- The actual request is routed through the API (to avoid CORS)

Test Plan: Added new test

Reviewers: paulfitz

Reviewed By: paulfitz

Subscribers: paulfitz

Differential Revision: https://phab.getgrist.com/D4238
2024-04-29 21:59:36 +02:00

85 lines
2.2 KiB
TypeScript

import {BaseAPI, IOptions} from 'app/common/BaseAPI';
import {InstallPrefs} from 'app/common/Install';
import {TelemetryLevel} from 'app/common/Telemetry';
import {addCurrentOrgToPath} from 'app/common/urlUtils';
export const installPropertyKeys = ['prefs'];
export interface InstallProperties {
prefs: InstallPrefs;
}
export interface InstallPrefsWithSources {
telemetry: {
telemetryLevel: PrefWithSource<TelemetryLevel>;
},
}
export type TelemetryPrefsWithSources = InstallPrefsWithSources['telemetry'];
export interface PrefWithSource<T> {
value: T;
source: PrefSource;
}
export type PrefSource = 'environment-variable' | 'preferences';
/**
* JSON returned to the client (exported for tests).
*/
export interface LatestVersion {
/**
* Latest version of core component of the client.
*/
latestVersion: string;
/**
* If there were any critical updates after client's version. Undefined if
* we don't know client version or couldn't figure this out for some other reason.
*/
isCritical?: boolean;
/**
* Url where the client can download the latest version (if applicable)
*/
updateURL?: string;
/**
* When the latest version was updated (in ISO format).
*/
updatedAt?: string;
}
export interface InstallAPI {
getInstallPrefs(): Promise<InstallPrefsWithSources>;
updateInstallPrefs(prefs: Partial<InstallPrefs>): Promise<void>;
/**
* Returns information about latest version of Grist
*/
checkUpdates(): Promise<LatestVersion>;
}
export class InstallAPIImpl extends BaseAPI implements InstallAPI {
constructor(private _homeUrl: string, options: IOptions = {}) {
super(options);
}
public async getInstallPrefs(): Promise<InstallPrefsWithSources> {
return this.requestJson(`${this._url}/api/install/prefs`, {method: 'GET'});
}
public async updateInstallPrefs(prefs: Partial<InstallPrefs>): Promise<void> {
await this.request(`${this._url}/api/install/prefs`, {
method: 'PATCH',
body: JSON.stringify({...prefs}),
});
}
public checkUpdates(): Promise<LatestVersion> {
return this.requestJson(`${this._url}/api/install/updates`, {method: 'GET'});
}
private get _url(): string {
return addCurrentOrgToPath(this._homeUrl);
}
}