2021-06-02 01:59:40 +00:00
|
|
|
import {Instantiable} from '../di'
|
|
|
|
import {FormRequest} from './FormRequest'
|
|
|
|
import {ValidationError} from './Validator'
|
2021-06-03 03:36:25 +00:00
|
|
|
import {ResponseObject, RouteHandler} from '../http/routing/Route'
|
|
|
|
import {Request} from '../http/lifecycle/Request'
|
2021-06-02 01:59:40 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Builds a middleware function that validates a request's input against
|
|
|
|
* the given form request class and registers the FormRequest class into
|
|
|
|
* the request container.
|
|
|
|
*
|
|
|
|
* @example
|
|
|
|
* ```typescript
|
|
|
|
* Route.group(...).pre(formRequest(MyFormRequestClass))
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* @param formRequestClass
|
|
|
|
*/
|
|
|
|
export function formRequest<T>(formRequestClass: Instantiable<FormRequest<T>>): RouteHandler {
|
|
|
|
return async function formRequestRouteHandler(request: Request): Promise<ResponseObject> {
|
|
|
|
const formRequestInstance = <FormRequest<T>> request.make(formRequestClass)
|
|
|
|
|
|
|
|
try {
|
|
|
|
await formRequestInstance.get()
|
|
|
|
request.registerSingletonInstance<FormRequest<T>>(formRequestClass, formRequestInstance)
|
|
|
|
} catch (e: unknown) {
|
|
|
|
if ( e instanceof ValidationError ) {
|
|
|
|
return e.errors.toJSON()
|
|
|
|
}
|
|
|
|
|
|
|
|
throw e
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|