-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrequestQueryParamsValidation.ts
50 lines (42 loc) · 1.86 KB
/
requestQueryParamsValidation.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { HttpHandler } from '@azure/functions';
import { AnySchema } from 'joi';
import { ApplicationError } from '../error';
import { BeforeExecutionFunction, isErrorResult } from '../middleware';
export type RequestQueryParamsValidationOptions = {
shouldThrowOnValidationError?: boolean;
transformErrorMessage?: (message: string) => unknown;
printInputOnValidationError?: boolean;
};
export function requestQueryParamsValidation(
schema: AnySchema,
options?: RequestQueryParamsValidationOptions,
): BeforeExecutionFunction<HttpHandler> {
const shouldThrowOnValidationError = options?.shouldThrowOnValidationError ?? true;
const transformErrorMessage = options?.transformErrorMessage ?? ((message: string) => ({ message }));
const printInputOnValidationError = options?.printInputOnValidationError ?? true;
return async (req, context, result) => {
if (isErrorResult<ReturnType<HttpHandler>>(result)) {
context.info(`Skipping request query params validation because the result is faulty`);
return;
}
const validationResult = schema.validate(Object.fromEntries(req.query));
if (validationResult.error) {
context.error(
'Request query params did not match the given schema:',
JSON.stringify(validationResult.error),
);
if (printInputOnValidationError) {
context.info('Invalid request query params:', JSON.stringify(req.query));
}
if (shouldThrowOnValidationError) {
throw new ApplicationError(
'Request query params validation error',
400,
transformErrorMessage(validationResult.error.message),
);
}
} else {
context.info('Request query params are valid');
}
};
}