Skip to content

Commit

Permalink
feat: send validation errors to client
Browse files Browse the repository at this point in the history
  • Loading branch information
solufa committed Dec 29, 2020
1 parent ae7479c commit 5359ff4
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 20 deletions.
13 changes: 7 additions & 6 deletions servers/all/$server.ts
Expand Up @@ -132,7 +132,7 @@ const createTypedParamsHandler = (numberTypeParams: string[]): preValidationHook
}

const createValidateHandler = (validators: (req: FastifyRequest) => (Promise<void> | null)[]): preValidationHookHandler =>
(req, reply) => Promise.all(validators(req)).catch(() => reply.code(400).send())
(req, reply) => Promise.all(validators(req)).catch(err => reply.code(400).send(err))

const formatMultipartData = (arrayTypeKeys: [string, boolean][]): preValidationHookHandler => (req, _, done) => {
const body: any = req.body
Expand Down Expand Up @@ -181,6 +181,7 @@ const asyncMethodToHandler = (

export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
const basePath = options.basePath ?? ''
const validatorOptions: ValidatorOptions = { validationError: { target: false }, ...options.validator }
const hooks0 = hooksFn0(fastify)
const hooks1 = hooksFn1(fastify)
const hooks2 = hooksFn2(fastify)
Expand Down Expand Up @@ -210,7 +211,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
preValidation: [
parseNumberTypeQueryParams(query => !Object.keys(query).length ? [] : [['requiredNum', false, false], ['optionalNum', true, false], ['optionalNumArr', true, true], ['emptyNum', true, false], ['requiredNumArr', false, true]]),
createValidateHandler(req => [
Object.keys(req.query as any).length ? validateOrReject(Object.assign(new Validators.Query(), req.query as any), options.validator) : null
Object.keys(req.query as any).length ? validateOrReject(Object.assign(new Validators.Query(), req.query as any), validatorOptions) : null
])
]
},
Expand All @@ -226,8 +227,8 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
parseNumberTypeQueryParams(() => [['requiredNum', false, false], ['optionalNum', true, false], ['optionalNumArr', true, true], ['emptyNum', true, false], ['requiredNumArr', false, true]]),
formatMultipartData([]),
createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.Query(), req.query as any), options.validator),
validateOrReject(Object.assign(new Validators.Body(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.Query(), req.query as any), validatorOptions),
validateOrReject(Object.assign(new Validators.Body(), req.body as any), validatorOptions)
])
]
},
Expand Down Expand Up @@ -260,7 +261,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
preValidation: [
formatMultipartData([['requiredArr', false], ['optionalArr', true], ['empty', true], ['vals', false], ['files', false]]),
createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.MultiForm(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.MultiForm(), req.body as any), validatorOptions)
])
]
},
Expand Down Expand Up @@ -320,7 +321,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
onRequest: [...hooks0.onRequest, hooks2.onRequest],
preParsing: hooks0.preParsing,
preValidation: createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.UserInfo(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.UserInfo(), req.body as any), validatorOptions)
]),
preHandler: ctrlHooks1.preHandler
} as RouteShorthandOptions,
Expand Down
11 changes: 6 additions & 5 deletions servers/noMulter/$server.ts
Expand Up @@ -74,7 +74,7 @@ const createTypedParamsHandler = (numberTypeParams: string[]): preValidationHook
}

const createValidateHandler = (validators: (req: FastifyRequest) => (Promise<void> | null)[]): preValidationHookHandler =>
(req, reply) => Promise.all(validators(req)).catch(() => reply.code(400).send())
(req, reply) => Promise.all(validators(req)).catch(err => reply.code(400).send(err))

const methodToHandler = (
methodCallback: ServerMethods<any, any>[LowerHttpMethod]
Expand All @@ -98,6 +98,7 @@ const asyncMethodToHandler = (

export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
const basePath = options.basePath ?? ''
const validatorOptions: ValidatorOptions = { validationError: { target: false }, ...options.validator }
const hooks0 = hooksFn0(fastify)
const hooks1 = hooksFn1(fastify)
const ctrlHooks0 = ctrlHooksFn0(fastify)
Expand All @@ -114,7 +115,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
{
onRequest: [hooks0.onRequest, ctrlHooks0.onRequest],
preValidation: createValidateHandler(req => [
Object.keys(req.query as any).length ? validateOrReject(Object.assign(new Validators.Query(), req.query as any), options.validator) : null
Object.keys(req.query as any).length ? validateOrReject(Object.assign(new Validators.Query(), req.query as any), validatorOptions) : null
])
},
asyncMethodToHandler(controller0.get)
Expand All @@ -125,8 +126,8 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
{
onRequest: [hooks0.onRequest, ctrlHooks0.onRequest],
preValidation: createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.Query(), req.query as any), options.validator),
validateOrReject(Object.assign(new Validators.Body(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.Query(), req.query as any), validatorOptions),
validateOrReject(Object.assign(new Validators.Body(), req.body as any), validatorOptions)
])
},
methodToHandler(controller0.post)
Expand Down Expand Up @@ -178,7 +179,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
{
onRequest: [hooks0.onRequest, hooks1.onRequest],
preValidation: createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.UserInfo(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.UserInfo(), req.body as any), validatorOptions)
]),
preHandler: ctrlHooks1.preHandler
} as RouteShorthandOptions,
Expand Down
13 changes: 7 additions & 6 deletions servers/noTypedParams/$server.ts
Expand Up @@ -69,7 +69,7 @@ export type ServerMethods<T extends AspidaMethods, U extends Record<string, any>
}

const createValidateHandler = (validators: (req: FastifyRequest) => (Promise<void> | null)[]): preValidationHookHandler =>
(req, reply) => Promise.all(validators(req)).catch(() => reply.code(400).send())
(req, reply) => Promise.all(validators(req)).catch(err => reply.code(400).send(err))

const formatMultipartData = (arrayTypeKeys: [string, boolean][]): preValidationHookHandler => (req, _, done) => {
const body: any = req.body
Expand Down Expand Up @@ -118,6 +118,7 @@ const asyncMethodToHandler = (

export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
const basePath = options.basePath ?? ''
const validatorOptions: ValidatorOptions = { validationError: { target: false }, ...options.validator }
const hooks0 = hooksFn0(fastify)
const hooks1 = hooksFn1(fastify)
const ctrlHooks0 = ctrlHooksFn0(fastify)
Expand All @@ -136,7 +137,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
{
onRequest: [hooks0.onRequest, ctrlHooks0.onRequest],
preValidation: createValidateHandler(req => [
Object.keys(req.query as any).length ? validateOrReject(Object.assign(new Validators.Query(), req.query as any), options.validator) : null
Object.keys(req.query as any).length ? validateOrReject(Object.assign(new Validators.Query(), req.query as any), validatorOptions) : null
])
},
asyncMethodToHandler(controller0.get)
Expand All @@ -149,8 +150,8 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
preValidation: [
formatMultipartData([]),
createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.Query(), req.query as any), options.validator),
validateOrReject(Object.assign(new Validators.Body(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.Query(), req.query as any), validatorOptions),
validateOrReject(Object.assign(new Validators.Body(), req.body as any), validatorOptions)
])
]
},
Expand All @@ -172,7 +173,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
preValidation: [
formatMultipartData([['empty', false], ['vals', false], ['files', false]]),
createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.MultiForm(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.MultiForm(), req.body as any), validatorOptions)
])
]
},
Expand Down Expand Up @@ -217,7 +218,7 @@ export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
{
onRequest: [hooks0.onRequest, hooks1.onRequest],
preValidation: createValidateHandler(req => [
validateOrReject(Object.assign(new Validators.UserInfo(), req.body as any), options.validator)
validateOrReject(Object.assign(new Validators.UserInfo(), req.body as any), validatorOptions)
]),
preHandler: ctrlHooks1.preHandler
} as RouteShorthandOptions,
Expand Down
8 changes: 6 additions & 2 deletions src/buildServerFile.ts
Expand Up @@ -165,7 +165,7 @@ const createTypedParamsHandler = (numberTypeParams: string[]): preValidationHook
hasValidator
? `
const createValidateHandler = (validators: (req: FastifyRequest) => (Promise<void> | null)[]): preValidationHookHandler =>
(req, reply) => Promise.all(validators(req)).catch(() => reply.code(400).send())
(req, reply) => Promise.all(validators(req)).catch(err => reply.code(400).send(err))
`
: ''
}${
Expand Down Expand Up @@ -202,7 +202,11 @@ const formatMultipartData = (arrayTypeKeys: [string, boolean][]): preValidationH
}
export default (fastify: FastifyInstance, options: FrourioOptions = {}) => {
const basePath = options.basePath ?? ''
${consts}
${
hasValidator
? ' const validatorOptions: ValidatorOptions = { validationError: { target: false }, ...options.validator }\n'
: ''
}${consts}
${
hasMultipart
? ' fastify.register(multipart, { attachFieldsToBody: true, limits: { fileSize: 1024 ** 3 }, ...options.multipart })\n\n'
Expand Down
2 changes: 1 addition & 1 deletion src/createControllersText.ts
Expand Up @@ -460,7 +460,7 @@ ${validateInfo
v.hasQuestion ? `Object.keys(req.${v.name} as any).length ? ` : ''
}validateOrReject(Object.assign(new Validators.${checker.typeToString(v.type)}(), req.${
v.name
} as any), options.validator)${v.hasQuestion ? ' : null' : ''}`
} as any), validatorOptions)${v.hasQuestion ? ' : null' : ''}`
)
.join(',\n')}\n ])`
: '',
Expand Down

0 comments on commit 5359ff4

Please sign in to comment.