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>
18 lines
655 B
TypeScript
18 lines
655 B
TypeScript
import { IsString, Matches, MaxLength } from 'class-validator';
|
|
|
|
/**
|
|
* Body von `POST /users/me/release-seen` (quick-260925-bow, D-05).
|
|
*
|
|
* Nur die kanonische Form `X.Y.Z` (ohne `v`, ohne fuehrende Nullen, ohne
|
|
* Describe-Anhang) — so, wie `GET /users/me/release-notice` sie als
|
|
* `currentRelease` liefert. Die Methode im Controller prueft zusaetzlich
|
|
* `parseReleaseVersion(version) === version` und "nicht ueber der laufenden
|
|
* Version", weil Unit-Tests sie ohne ValidationPipe aufrufen.
|
|
*/
|
|
export class ReleaseSeenDto {
|
|
@IsString()
|
|
@MaxLength(32)
|
|
@Matches(/^(0|[1-9]\d{0,5})\.(0|[1-9]\d{0,5})\.(0|[1-9]\d{0,5})$/)
|
|
version!: string;
|
|
}
|