| 18-desktop-client-fertigstellen |
01 |
infra |
| nestjs |
| tauri |
| gitea-actions |
| streamable-file |
| desktop-distribution |
|
| phase |
provides |
| 06-desktop-client-ci-cd |
Tauri-Grundgeruest (apps/desktop, AppImage+NSIS-Bundle-Ziele, Tray, Setup-Seite) |
|
|
| .gitea/scripts/desktop-collect.sh (Pakete einsammeln, manifest.json schreiben) |
| .gitea/scripts/desktop-version.sh (Version aus dem Freigabe-Tag schreiben) |
| apps/api/src/desktop/ (GET /desktop/latest, GET /desktop/download/:platform, beide @Public()) |
| packages/shared DesktopPlatform/DesktopManifest(File)/DesktopLatest(Response) Typen |
| apps/api/Dockerfile mit COPY desktop-dist |
| Basislinie 1.1.0 in tauri.conf.json/Cargo.toml/Cargo.lock/package.json |
|
| 18-02-ci-pipeline-release-assets |
| 18-03-web-oberflaeche |
| 18-04-client-updateprüfung |
|
| tokens |
tasks |
commits |
| 6718 |
2 |
2 |
|
0e4eb9b |
| added |
patterns |
|
|
| NestJS StreamableFile fuer grosse Downloads statt res.send(buffer) (Installer-Groessenordnung) |
| Manifest-getriebene Dateiauswahl: Dateiname kommt ausschliesslich aus manifest.json, nie aus dem Request-Pfad (Whitelist vor Dateisystemzugriff) |
| HTTP-Durchstich-Spec ueber NestFactory.create() + app.listen(0) statt fs-Mocks fuer datei-lesende Module |
|
|
| created |
modified |
| .gitea/scripts/desktop-collect.sh |
| .gitea/scripts/desktop-version.sh |
| apps/api/src/desktop/desktop.module.ts |
| apps/api/src/desktop/desktop.controller.ts |
| apps/api/src/desktop/desktop.service.ts |
| apps/api/src/desktop/desktop.service.spec.ts |
| desktop-dist/.gitkeep |
|
| .gitignore |
| apps/api/Dockerfile |
| apps/api/src/app.module.ts |
| packages/shared/src/index.ts |
| apps/desktop/package.json |
| apps/desktop/src-tauri/Cargo.toml |
| apps/desktop/src-tauri/Cargo.lock |
| apps/desktop/src-tauri/tauri.conf.json |
|
|
| DesktopController braucht @Inject(DesktopService) explizit auf dem Konstruktor-Parameter — Vitest transpiliert ueber esbuild, das emitDecoratorMetadata nicht abbildet; ohne den expliziten Token bleibt desktopService bei einem echten NestFactory-Bau (der HTTP-Durchstich-Test) undefined, obwohl derselbe Code unter tsc (nest build) korrekt aufgeloest wuerde. |
| Lokaler Stack am Ende beider Tasks zweimal neu gebaut (einmal je Task) statt nur einmal am Schluss, damit jede Verify-Stufe gegen den tatsaechlich damals gueltigen desktop-dist-Inhalt prueft und der Stack in einem konsistenten 1.1.0-Endzustand stehen bleibt. |
|
| PLATFORMS-Konstante (geschlossener Wertevorrat) vor jedem Dateisystemzugriff pruefen, danach erst das Manifest lesen — Reihenfolge ist die Sicherheitseigenschaft (T-18-01). |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
GET /desktop/latest liefert Version/Kanal/Dateiliste aus manifest.json (200) oder 404 ohne Manifest |
DESK-03 |
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 1 (latest, Manifest vorhanden) |
pass |
|
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 2 (getLatest ohne Manifest) |
pass |
|
|
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
GET /desktop/download/:platform streamt die Datei mit attachment-Header, Whitelist vor Dateisystemzugriff, Traversal/unbekannte Plattform enden mit 400, fehlende Pakete/Namen mit 404 |
DESK-03 |
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 3 (download/linux) |
pass |
|
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 4 (Plattform-Whitelist + Traversal ueber HTTP) |
pass |
|
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 5 (Whitelist vor Dateisystem) |
pass |
|
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 6 (Manifest nur mit windows) |
pass |
|
| kind |
ref |
status |
| integration |
apps/api/src/desktop/desktop.service.spec.ts#Test 7 (manipulierter Name im Manifest) |
pass |
|
|
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
Beide Routen tragen @Public() (kein Anmelde-Zwang) |
DESK-03 |
| kind |
ref |
status |
| unit |
apps/api/src/desktop/desktop.service.spec.ts#Test 8 (bewusst oeffentlich) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
desktop-collect.sh sammelt das Tauri-AppImage ein, benennt es kanonisch um und schreibt manifest.json mit korrekter Groesse/SHA-256 |
DESK-01 |
| kind |
ref |
status |
| other |
sh .gitea/scripts/desktop-collect.sh --require linux + sha256sum-Vergleich gegen manifest.json (zweimal ausgefuehrt: 0.0.1 und 1.1.0) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D5 |
desktop-version.sh schreibt die reine X.Y.Z-Version des letzten Freigabe-Tags in tauri.conf.json/Cargo.toml, verweigert Vorab-/Metadatenformen |
DESK-05 |
| kind |
ref |
status |
| other |
sh .gitea/scripts/desktop-version.sh --print + Negativproben (v1.2.3-beta abgelehnt, v2.0.0 akzeptiert-aber-ungeschrieben) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D6 |
Basislinie 1.1.0 in allen vier Client-Dateien eingecheckt, cargo check bleibt gruen |
DESK-05 |
| kind |
ref |
status |
| other |
cargo check (apps/desktop/src-tauri) -> Finished |
pass |
|
|
false |
|
|
13min |
2026-09-16 |
complete |