Skip to content

Commit 19aeb0a

Browse files
feat: Add Nestjs options to turn off request validations (#362)
* start add options to turn off request validation * remove: option validateRequestParam & add tests * docs(nestjs): add section about request validation * add: turn off request validation params for @TsRest() * fix: docs * add changeset * Update stale-games-draw.md * Update nest.mdx --------- Co-authored-by: Michael Angelo Rivera <55844504+michaelangeloio@users.noreply.github.com>
1 parent 3ed322f commit 19aeb0a

8 files changed

Lines changed: 862 additions & 108 deletions

File tree

.changeset/stale-games-draw.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@ts-rest/nest': minor
3+
---
4+
5+
- feat: Add option to disable request validation
6+
- This is useful when a user wants to perform validation or handle validation errors themselves

apps/docs/docs/nest/nest.mdx

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,69 @@ export class MyController {
199199
}
200200
```
201201

202+
### Request Validation
203+
By default, `ts-rest` validates all request components - body, headers and query parameters.
204+
In case of validation errors, the server responds with a `ZodError` object in the response body and a status code of 400.
205+
You can disable the validation of these components if you wish to perform the validation manually or handle the error differently.
206+
207+
Using the `@TsRest()` decorator, you can configure request validation parameters for the entire controller:
208+
```typescript
209+
import { TsRest } from '@ts-rest/nest';
210+
211+
@Controller()
212+
@TsRest({
213+
validateRequestBody: false,
214+
validateRequestQuery: false,
215+
validateRequestHeaders: false
216+
})
217+
class MyController {}
218+
```
219+
220+
You can also override controller decorator values for a specific route:
221+
222+
```typescript
223+
import { TsRest } from '@ts-rest/nest';
224+
225+
@Controller()
226+
@TsRest({
227+
validateRequestBody: false,
228+
})
229+
class MyController {
230+
@TsRest(contract.create, {
231+
validateRequestBody: true
232+
})
233+
async create(@TsRestRequest() { body }) {
234+
// body validated
235+
}
236+
}
237+
```
238+
239+
Or finally, using `@TsRestHandler()` for specific route:
240+
241+
```typescript
242+
import { TsRestHandler, tsRestHandler } from '@ts-rest/nest';
243+
244+
@Controller()
245+
export class MyController {
246+
constructor() {}
247+
248+
@TsRestHandler(c.getPost, {
249+
validateRequestBody: false,
250+
validateRequestQuery: false,
251+
validateRequestHeaders: false
252+
})
253+
async getPost() {
254+
return tsRestHandler(c.getPost, async ({ query, body }) => {
255+
const isQueryValid = querySchema.safeParse(query);
256+
console.log(isQueryValid) // => { success: false; error: ZodError }
257+
258+
const isBodyValid = bodySchema.safeParse(body);
259+
console.log(isBodyValid) // => { success: true; data: {...} }
260+
});
261+
}
262+
}
263+
```
264+
202265
### Response Validation
203266

204267
You can enable response validation by passing the `validateResponses` option to the `@TsRest()` decorator.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
export const TsRestAppRouteMetadataKey = Symbol('ts-rest-app-route');
22
export const JsonQuerySymbol = Symbol('ts-rest-json-query');
33
export const ValidateResponsesSymbol = Symbol('ts-rest-validate-responses');
4+
export const ValidateRequestHeadersSymbol = Symbol(
5+
'ts-rest-validate-request-headers'
6+
);
7+
export const ValidateRequestQuerySymbol = Symbol(
8+
'ts-rest-validate-request-query'
9+
);
10+
export const ValidateRequestBodySymbol = Symbol(
11+
'ts-rest-validate-request-body'
12+
);

0 commit comments

Comments
 (0)