59db32a01f
- packages/shared: parseReleaseVersion, compareReleaseVersions, ReleaseNoticeResponse - getRunningRelease(): einzige Quelle der laufenden Version (APP_VERSION der API) - User.lastSeenReleaseVersion (nullbar, Migration 20260925120000) - GET /users/me/release-notice, POST /users/me/release-seen (gebunden an Benutzer und Mandant) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
54 lines
2.3 KiB
TypeScript
54 lines
2.3 KiB
TypeScript
import { parseReleaseVersion, type VersionResponse } from '@tessera/shared';
|
|
|
|
/**
|
|
* Versionsstempel der API (quick-260914-ku1).
|
|
*
|
|
* Woher die Werte kommen: das CI-Skript `.gitea/scripts/publish-images.sh`
|
|
* berechnet `APP_VERSION` (`git describe --tags --always`), `APP_CHANNEL`
|
|
* (`beta` fuer main, `live` fuer Tags v*), `APP_COMMIT` und `APP_BUILD_TIME`
|
|
* und uebergibt sie als `--build-arg`; die Runner-Stufe beider Dockerfiles
|
|
* setzt sie als `ENV`, sodass sie hier zur Laufzeit lesbar sind. Lokal ohne
|
|
* Build-Args greifen die Vorgaben `dev`/`dev`/``/``.
|
|
*
|
|
* Warum `||` statt `??`: Docker Compose reicht unbelegte Variablen als
|
|
* Leerstring weiter — ein leerer Wert muss wie ein fehlender zaehlen.
|
|
*
|
|
* `main.ts` protokolliert `formatAppVersionLine()` beim Start direkt nach der
|
|
* Port-Zeile, `HealthController.getVersion()` liefert `getAppVersion()`.
|
|
*/
|
|
export function getAppVersion(): VersionResponse {
|
|
return {
|
|
name: 'tessera',
|
|
version: process.env.APP_VERSION || 'dev',
|
|
channel: process.env.APP_CHANNEL || 'dev',
|
|
commit: process.env.APP_COMMIT || '',
|
|
buildTime: process.env.APP_BUILD_TIME || '',
|
|
};
|
|
}
|
|
|
|
export function formatAppVersionLine(v: VersionResponse = getAppVersion()): string {
|
|
const base = `Tessera API ${v.version} (${v.channel})`;
|
|
return v.commit ? `${base} ${v.commit}` : base;
|
|
}
|
|
|
|
/**
|
|
* Laufende FREIGEGEBENE Version der API als `X.Y.Z` oder `null`
|
|
* (quick-260925-bow, D-02/D-04).
|
|
*
|
|
* Einzige Quelle der laufenden Version fuer das "Was ist neu"-Fenster:
|
|
* `APP_VERSION` der API. Warum die API und nicht das Web: zwei der drei
|
|
* Anlagewege neuer Benutzer laufen ohne jede Web-Anfrage (LDAP-Abgleich per
|
|
* Zeitplan, Erst-Administrator beim API-Start) und tragen die Version bei der
|
|
* Anlage ein; ausserdem prueft `POST /users/me/release-seen` gegen diesen
|
|
* Wert. Das Web nimmt `currentRelease` aus `GET /users/me/release-notice`
|
|
* und wertet seine eigene `NEXT_PUBLIC_APP_VERSION` dafuer nicht aus. Beide
|
|
* Abbilder bekommen im CI denselben `APP_VERSION`-Wert
|
|
* (`.gitea/scripts/publish-images.sh`).
|
|
*
|
|
* `v1.4.0-5-gabc1234` (Beta, Describe-Stand) → `1.4.0`; `dev` oder ein
|
|
* blosser Commit-Stempel → `null` (dann erscheint nie ein Fenster).
|
|
*/
|
|
export function getRunningRelease(): string | null {
|
|
return parseReleaseVersion(getAppVersion().version);
|
|
}
|