import { createRequire } from 'node:module'; import type { NextFunction, Request, Response } from 'express'; /** * Eigener JSON-Leser fuer POST build (quick-261009-ikt, D-26). * * Nests Standardgrenze fuer JSON ist 100 kB. Eine Anfrage innerhalb der DTO-Grenzen * (cert-build.dto.ts) kann aber bis etwa 384 kB gross werden: viele Zertifikate im Pool, dazu * Schluessel und Anfrage. Darum bekommt genau diese Route 512 KiB; jede andere Route behaelt * die 100 kB. Eine groessere Anfrage wird mit 413 und dem Code tooLarge beantwortet (statt mit * einer Antwort ohne Code), fehlerhaftes JSON mit 400 und dem Code invalidInput. * * Registriert wird der Leser in main.ts mit app.use(CERT_BUILD_ROUTE, ...) vor app.listen. * Wichtig: * - Die Funktion darf NICHT jsonParser heissen. Nests Express-Adapter ueberspringt seinen * globalen JSON-Leser fuer ALLE Routen, sobald eine Schicht mit diesem Namen existiert; dann * wuerde auch die Anmeldung kein JSON mehr lesen. Darum der Name certBuildJsonBody. * - `express` ist vom API-Paket aus nicht direkt aufloesbar. Es wird ueber @nestjs/platform-express * geladen, also aus derselben Kopie, die Nest selbst benutzt. Ein neues Paket kommt nicht hinzu. * - body-parser lehnt eine Anfrage ab, deren Koerper schon gelesen ist; Nests globaler Leser liest * den Koerper daher kein zweites Mal. */ export const CERT_BUILD_ROUTE = '/modules/cert-manager/build'; export const CERT_BUILD_JSON_LIMIT = 512 * 1024; const expressFromNest = createRequire( createRequire(__filename).resolve('@nestjs/platform-express'), )('express') as typeof import('express'); const parseJson = expressFromNest.json({ limit: CERT_BUILD_JSON_LIMIT }); export function certBuildJsonBody(req: Request, res: Response, next: NextFunction): void { parseJson(req, res, next); } interface BodyParserError { type?: string; status?: number; } /** Fehler des Lesers: zu gross -> 413 tooLarge, kein gueltiges JSON -> 400 invalidInput, sonst weiter. */ export function certBuildBodyErrors( error: unknown, _req: Request, res: Response, next: NextFunction, ): void { const e = (error ?? {}) as BodyParserError; if (e.type === 'entity.too.large') { res.status(413).json({ code: 'tooLarge', message: 'Request body exceeds 512 KiB' }); return; } if (e.type === 'entity.parse.failed') { res.status(400).json({ code: 'invalidInput', message: 'Request body is not valid JSON' }); return; } next(error); }