From 5359ff4aeaeef0a035e484bc878c2af4ab6de056 Mon Sep 17 00:00:00 2001 From: solufa Date: Wed, 30 Dec 2020 06:08:12 +0900 Subject: [PATCH] feat: send validation errors to client --- servers/all/$server.ts | 13 +++++++------ servers/noMulter/$server.ts | 11 ++++++----- servers/noTypedParams/$server.ts | 13 +++++++------ src/buildServerFile.ts | 8 ++++++-- src/createControllersText.ts | 2 +- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/servers/all/$server.ts b/servers/all/$server.ts index bd5d260..246c0ea 100644 --- a/servers/all/$server.ts +++ b/servers/all/$server.ts @@ -132,7 +132,7 @@ const createTypedParamsHandler = (numberTypeParams: string[]): preValidationHook } const createValidateHandler = (validators: (req: FastifyRequest) => (Promise | 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 @@ -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) @@ -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 ]) ] }, @@ -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) ]) ] }, @@ -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) ]) ] }, @@ -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, diff --git a/servers/noMulter/$server.ts b/servers/noMulter/$server.ts index ad7521a..7253349 100644 --- a/servers/noMulter/$server.ts +++ b/servers/noMulter/$server.ts @@ -74,7 +74,7 @@ const createTypedParamsHandler = (numberTypeParams: string[]): preValidationHook } const createValidateHandler = (validators: (req: FastifyRequest) => (Promise | 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[LowerHttpMethod] @@ -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) @@ -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) @@ -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) @@ -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, diff --git a/servers/noTypedParams/$server.ts b/servers/noTypedParams/$server.ts index 6d5b683..6ab64ff 100644 --- a/servers/noTypedParams/$server.ts +++ b/servers/noTypedParams/$server.ts @@ -69,7 +69,7 @@ export type ServerMethods } const createValidateHandler = (validators: (req: FastifyRequest) => (Promise | 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 @@ -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) @@ -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) @@ -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) ]) ] }, @@ -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) ]) ] }, @@ -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, diff --git a/src/buildServerFile.ts b/src/buildServerFile.ts index 1d41dcc..d1815e5 100644 --- a/src/buildServerFile.ts +++ b/src/buildServerFile.ts @@ -165,7 +165,7 @@ const createTypedParamsHandler = (numberTypeParams: string[]): preValidationHook hasValidator ? ` const createValidateHandler = (validators: (req: FastifyRequest) => (Promise | 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)) ` : '' }${ @@ -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' diff --git a/src/createControllersText.ts b/src/createControllersText.ts index 8905383..1186567 100644 --- a/src/createControllersText.ts +++ b/src/createControllersText.ts @@ -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 ])` : '',