import { Controller, Get, Inject, Param, StreamableFile } from '@nestjs/common'; import type { DesktopLatestResponse } from '@tessera/shared'; import { Public } from '../auth/decorators/public.decorator'; import { DesktopService } from './desktop.service'; @Controller('desktop') export class DesktopController { // `@Inject()` explizit (nicht nur der Konstruktor-Typ): Vitest transpiliert // ueber esbuild, das `emitDecoratorMetadata` nicht respektiert -- ohne den // expliziten Token findet Nests DI in diesem einen HTTP-Durchstich-Test // (desktop.service.spec.ts) keinen Provider und `desktopService` bleibt // `undefined`. Im echten Build (tsc via `nest build`) waere das auch ohne // `@Inject()` korrekt aufgeloest worden. constructor(@Inject(DesktopService) private readonly desktopService: DesktopService) {} // Bewusst oeffentlich (D-10, gleicher Grund wie HealthController.getVersion, // T-KU1-03): die Anmeldeseite zeigt den Download-Link, bevor eine Anmeldung // existiert. @Public() @Get('latest') getLatest(): DesktopLatestResponse { return this.desktopService.getLatest(); } // Bewusst oeffentlich (D-10): der Download selbst braucht keine Anmeldung, // gleicher Grund wie getLatest oben. @Public() @Get('download/:platform') download(@Param('platform') platform: string): StreamableFile { const { stream, entry } = this.desktopService.getPackage(platform); return new StreamableFile(stream, { type: 'application/octet-stream', disposition: `attachment; filename="${entry.name}"`, length: entry.size, }); } }