YieldVault validates incoming HTTP data with Zod before handlers run. Invalid payloads never reach business logic.
backend/src/middleware/validate.ts exports validate({ body, query, params }).
router.post('/admin/maintenance', validateApiKey, validate({ body: MaintenanceToggleSchema }), handler);On failure the middleware returns 400 with:
| Field | Meaning |
|---|---|
error |
Always Bad Request |
status |
400 |
code |
VALIDATION_ERROR |
message |
Human-readable summary of all issues |
summary |
Always Request validation failed |
errors[] |
{ code, field, message } per issue (frontend compatibility) |
details[] |
{ code, field, message } per issue |
retryable |
false |
Unknown body fields are stripped unless the schema uses .strict() (auth and
webhook register/update reject unknown keys).
| File | Contents |
|---|---|
backend/src/types/validation.ts |
Admin/list/body/query schemas |
backend/src/types/webhooks.ts |
Webhook event type literals |
backend/src/middleware/validate.ts |
Auth, alias, webhook register schemas + middleware |
packages/api-schemas |
Shared vault deposit/withdrawal contracts |
Build Order: The
@yieldvault/api-schemaspackage must be built (npm run build:schemasornpm run buildin backend) before TypeScript typechecking (tsc --noEmit) can resolve types imported bybackend/src/middleware/validate.ts.
- Stellar addresses on login/nonce: checksummed
G…public keys. - Pagination query: optional
limit,cursor,page,sortBy,sortOrder. - Webhook URLs:
httporhttpsonly; secrets 8–256 characters. - Dates:
YYYY-MM-DDfor APY backfill; ISO-8601 for maintenance windows. - IDs: path params such as
:idmust be non-empty strings.
- Define a Zod schema in
backend/src/types/validation.ts. - Attach
validate({ body })and/orvalidate({ query, params })on the route. - Add a case to
backend/src/__tests__/validation.test.tsorrequestValidation.test.ts. - Document the fields in this file if they are public API.