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); }