mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-23 23:46:35 +00:00
ba7d55f999
BODY_CONTRACT_ALLOW_LIST is empty. The last seventeen handlers type their
body with a createZodDto class, so the fail-closed boot gate has nothing left
to forgive; it still refuses a boot for a new handler that reads @Body()
without one.
Several of those contracts describe rather than constrain, and that is the
whole care in this change. The pipe runs before the handler, so a schema
stricter than the handler moves a user-visible answer:
- TagsController.create answers { error: 'Tag name is required' }, pinned
byte-for-byte in two tests, and the pipe formats as `field: message`. The
DTO leaves name optional and the handler keeps the check that owns the
message. Same shape for the booking-import confirm body, which additionally
gains per-item validation the handler never did.
- PluginsController.activate and install answer 503 when plugins are disabled,
and check that BEFORE looking at the body. A schema that rejected first
would turn that into a 400 for an operator whose server has plugins off.
- setEgressHosts reads a non-array `hosts` as "clear the list", which is the
documented reset. Typing it as string[] would have removed a working admin
action rather than tightened anything.
- PluginRoutesController.route answers { route: null } at 200 for everything
it dislikes, so the client falls back to straight lines. A 400 there would
turn a graceful degradation into a visible error.
files.bridge is gone. The multer options are built by
MulterModule.registerAsync from an AllowedFileTypesService leaf, so the
fileFilter reads the operator's extension list from the container instead of
from a second FilesService built outside it. Nest injects
MULTER_MODULE_OPTIONS with @Optional(), so a token that fails to resolve is
not a boot error: it silently falls back to defaults, with no filter and no
size cap. FILE-020 already proved that for trip files by uploading an .svg
over HTTP and expecting 400; journey uploads had no such case, and now do.
VIDEO_UPLOAD is untouched, including the filename callback that forces .jpg
regardless of what the client sends, which guards the public share proxy.
PluginFrame gets an onError. A frame whose document fails to load left a
blank element at full height, which reads as a hung app rather than as a
plugin that is gone.
typecheck:tests runs in CI now, with the test tree at zero errors. tz-lookup
is left as it is: the build puts it in a lazy helpers chunk, not the entry
chunk, and the remaining split would trade a synchronous render for an async
one to move 172 kB that is already off the critical path.
19 lines
994 B
TypeScript
19 lines
994 B
TypeScript
/**
|
|
* Legacy mutation handlers that still read @Body() without a createZodDto
|
|
* class — grandfathered when the fail-closed boot gate landed
|
|
* (validate-body-contracts.ts). Entries are `ControllerClass.methodName`.
|
|
*
|
|
* EMPTY, and it stays that way. Every mutation handler in the tree now types
|
|
* its body with a createZodDto class, so the gate has nothing to forgive. It
|
|
* still runs: a new handler that reads @Body() without a contract refuses the
|
|
* boot rather than shipping unvalidated. Adding an entry here to get past that
|
|
* is not the fix.
|
|
*
|
|
* The last seventeen came off in the migration remainder. Several of their
|
|
* contracts describe rather than constrain, which is deliberate and documented
|
|
* at each DTO: those handlers own rejections the pipe would otherwise pre-empt,
|
|
* including two that answer 503 before ever looking at the body and one that
|
|
* answers `{ route: null }` at 200 for anything it dislikes.
|
|
*/
|
|
export const BODY_CONTRACT_ALLOW_LIST: string[] = [];
|