You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
import {Instantiable} from '../di'
|
|
|
|
import {FormRequest} from './FormRequest'
|
|
|
|
import {ValidationError} from './Validator'
|
|
|
|
import {ResponseObject, RouteHandler} from '../http/routing/Route'
|
|
|
|
import {Request} from '../http/lifecycle/Request'
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|