35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
|
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
|
||
|
}
|
||
|
}
|
||
|
}
|