54121c1721
- SmtpConfig.bugReportRecipient (nullable, additive Migration 20260914170000), DTO @IsOptional @IsEmail, SAFE_SELECT, getBugReportRecipient gebunden - MailService: Versandkern deliver (wirft, Anhaenge), sendViaTenantTransport bleibt verschluckender Mantel (T-02-12), sendBugReport laesst Fehler durch - POST /bug-reports: Multipart 4 MiB je Route, alle angemeldeten Rollen, Drossel 5/10 min -> 429, PNG-Signatur -> 400, kein Empfaenger -> 409, Versandfehler -> 502, eine Protokollzeile - Falsifizierungen (a)-(d) als Specs; @Expose() im DTO, damit errors auch bei fehlendem Feld zu [] wird - Doku-Zeile fuer rls-access-inventory, TESSERA_BUGREPORT_TO in docker-compose.prod.yml Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018N9CD3ebPKm1b32bPpBknY
40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
import { Body, Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common';
|
|
import { FileInterceptor } from '@nestjs/platform-express';
|
|
import { CurrentUser } from '../auth/decorators/current-user.decorator';
|
|
import { BugReportsService } from './bug-reports.service';
|
|
import { BugReportDto } from './dto/bug-report.dto';
|
|
|
|
/**
|
|
* POST /bug-reports — Fehler-melden-Knopf (quick-260914-m97).
|
|
*
|
|
* Offen fuer ALLE angemeldeten Rollen: bewusst KEIN Rollen-Dekorator
|
|
* (Muster `user.controller.ts`, Selbstbedienungs-Avatar — `RolesGuard`
|
|
* laesst bei leerer Rollenliste durch, der globale `JwtAuthGuard` verlangt
|
|
* weiterhin eine Sitzung).
|
|
*
|
|
* Multipart mit Groessenlimit JE ROUTE (T-M97-03): `FileInterceptor` nimmt
|
|
* genau eine Datei `screenshot` bis 4 MiB entgegen; multers
|
|
* `LIMIT_FILE_SIZE` wird von Nest auf 413 abgebildet. `main.ts` bleibt
|
|
* ohne globales Body-Limit.
|
|
*
|
|
* Mandant und Benutzer kommen NUR aus dem Sitzungsnachweis
|
|
* (`@CurrentUser()`), nie aus dem Rumpf (T-M97-06) — das DTO kennt keine
|
|
* solchen Felder, die globale Pipe entfernt Fremdfelder.
|
|
*/
|
|
@Controller('bug-reports')
|
|
export class BugReportsController {
|
|
constructor(private readonly service: BugReportsService) {}
|
|
|
|
@Post()
|
|
@UseInterceptors(
|
|
FileInterceptor('screenshot', { limits: { fileSize: 4 * 1024 * 1024, files: 1 } }),
|
|
)
|
|
async submit(
|
|
@CurrentUser() user: any,
|
|
@Body() dto: BugReportDto,
|
|
@UploadedFile() file?: any,
|
|
) {
|
|
return this.service.submit(user, dto, file);
|
|
}
|
|
}
|