From 3f65a03bd443e5605c922a0eddf95a44a85e7981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Fri, 4 Aug 2017 11:30:40 +0200 Subject: [PATCH] core: add binding "sequence.actions.parseParams" Rework DefaultSequence to allow injection of "parseParams" action. --- .../authentication/test/acceptance/basic-auth.ts | 6 ++++-- packages/core/src/application.ts | 14 ++++++++++++-- packages/core/src/index.ts | 1 + packages/core/src/internal-types.ts | 8 ++++++++ packages/core/src/sequence.ts | 5 +++-- .../acceptance/sequence/sequence.acceptance.ts | 6 ++++-- .../test/integration/http-handler.integration.ts | 2 ++ 7 files changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/authentication/test/acceptance/basic-auth.ts b/packages/authentication/test/acceptance/basic-auth.ts index b0c841857b79..d1ef3cf01015 100644 --- a/packages/authentication/test/acceptance/basic-auth.ts +++ b/packages/authentication/test/acceptance/basic-auth.ts @@ -7,8 +7,8 @@ import { Application, api, ServerResponse, - parseOperationArgs, ParsedRequest, + ParseParams, FindRoute, InvokeMethod, GetFromContext, @@ -110,6 +110,8 @@ describe('Basic Authentication', () => { class MySequence implements SequenceHandler { constructor( @inject('sequence.actions.findRoute') protected findRoute: FindRoute, + @inject('sequence.actions.parseParams') + protected parseParams: ParseParams, @inject('sequence.actions.invokeMethod') protected invoke: InvokeMethod, @inject('sequence.actions.send') protected send: Send, @inject('sequence.actions.reject') protected reject: Reject, @@ -130,7 +132,7 @@ describe('Basic Authentication', () => { else throw new HttpErrors.InternalServerError('auth error'); // Authentication successful, proceed to invoke controller - const args = await parseOperationArgs(req, route); + const args = await this.parseParams(req, route); const result = await this.invoke(route, args); this.send(res, result); } catch (err) { diff --git a/packages/core/src/application.ts b/packages/core/src/application.ts index eb455711ff04..ece67e135289 100644 --- a/packages/core/src/application.ts +++ b/packages/core/src/application.ts @@ -19,6 +19,7 @@ import { ControllerRoute, RouteEntry, createEmptyApiSpec, + parseOperationArgs, } from '.'; import {ServerRequest, ServerResponse, createServer} from 'http'; import {Component, mountComponent} from './component'; @@ -27,7 +28,13 @@ import {HttpHandler} from './http-handler'; import {writeResultToResponse} from './writer'; import {DefaultSequence, SequenceHandler, SequenceFunction} from './sequence'; import {RejectProvider} from './router/reject'; -import {FindRoute, InvokeMethod, Send, Reject} from './internal-types'; +import { + FindRoute, + InvokeMethod, + Send, + Reject, + ParseParams, +} from './internal-types'; import {ControllerClass} from './router/routing-table'; // NOTE(bajtos) we cannot use `import * as cloneDeep from 'lodash/cloneDeep' @@ -85,6 +92,7 @@ export class Application extends Context { } }; + this.bind('sequence.actions.parseParams').to(parseOperationArgs); this.bind('sequence.actions.logError').to(this._logError.bind(this)); this.bind('sequence.actions.send').to(writeResultToResponse); this.bind('sequence.actions.reject').toProvider(RejectProvider); @@ -403,11 +411,13 @@ export class Application extends Context { // in order for our DI/IoC framework to inject constructor arguments constructor( @inject('sequence.actions.findRoute') protected findRoute: FindRoute, + @inject('sequence.actions.parseParams') + protected parseParams: ParseParams, @inject('sequence.actions.invokeMethod') protected invoke: InvokeMethod, @inject('sequence.actions.send') public send: Send, @inject('sequence.actions.reject') public reject: Reject, ) { - super(findRoute, invoke, send, reject); + super(findRoute, parseParams, invoke, send, reject); } async handle( diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6951c1443cb2..2464ce0ece2f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -33,6 +33,7 @@ export { GetFromContext, BindElement, PathParameterValues, + ParseParams, Reject, Send, } from './internal-types'; diff --git a/packages/core/src/internal-types.ts b/packages/core/src/internal-types.ts index d8ac011381fd..9076d49e222e 100644 --- a/packages/core/src/internal-types.ts +++ b/packages/core/src/internal-types.ts @@ -24,6 +24,14 @@ export interface ParsedRequest extends ServerRequest { */ export type FindRoute = (request: ParsedRequest) => ResolvedRoute; +/** + * + */ +export type ParseParams = ( + request: ParsedRequest, + route: ResolvedRoute, +) => Promise; + /** * Invokes a method defined in the Application Controller * diff --git a/packages/core/src/sequence.ts b/packages/core/src/sequence.ts index 84f7811360e2..9993cd332697 100644 --- a/packages/core/src/sequence.ts +++ b/packages/core/src/sequence.ts @@ -14,8 +14,8 @@ import { ParsedRequest, Send, Reject, + ParseParams, } from './internal-types'; -import {parseOperationArgs} from './parser'; import {writeResultToResponse} from './writer'; import {HttpError} from 'http-errors'; @@ -71,6 +71,7 @@ export class DefaultSequence implements SequenceHandler { */ constructor( @inject('sequence.actions.findRoute') protected findRoute: FindRoute, + @inject('sequence.actions.parseParams') protected parseParams: ParseParams, @inject('sequence.actions.invokeMethod') protected invoke: InvokeMethod, @inject('sequence.actions.send') public send: Send, @inject('sequence.actions.reject') public reject: Reject, @@ -96,7 +97,7 @@ export class DefaultSequence implements SequenceHandler { async handle(req: ParsedRequest, res: ServerResponse) { try { const route = this.findRoute(req); - const args = await parseOperationArgs(req, route); + const args = await this.parseParams(req, route); const result = await this.invoke(route, args); debug('%s result -', route.describe(), result); diff --git a/packages/core/test/acceptance/sequence/sequence.acceptance.ts b/packages/core/test/acceptance/sequence/sequence.acceptance.ts index 80dfc78615a0..e6fb5662cbbe 100644 --- a/packages/core/test/acceptance/sequence/sequence.acceptance.ts +++ b/packages/core/test/acceptance/sequence/sequence.acceptance.ts @@ -9,7 +9,6 @@ import { ParameterObject, ServerRequest, ServerResponse, - parseOperationArgs, ParsedRequest, OperationArgs, FindRoute, @@ -17,6 +16,7 @@ import { Send, Reject, SequenceHandler, + ParseParams, } from '../../..'; import {expect, Client, createClientForApp} from '@loopback/testlab'; import {anOpenApiSpec} from '@loopback/openapi-spec-builder'; @@ -61,13 +61,15 @@ describe('Sequence', () => { class MySequence { constructor( @inject('sequence.actions.findRoute') protected findRoute: FindRoute, + @inject('sequence.actions.parseParams') + protected parseParams: ParseParams, @inject('sequence.actions.invokeMethod') protected invoke: InvokeMethod, @inject('sequence.actions.send') protected send: Send, ) {} async handle(req: ParsedRequest, res: ServerResponse) { const route = this.findRoute(req); - const args = await parseOperationArgs(req, route); + const args = await this.parseParams(req, route); const result = await this.invoke(route, args); this.send(res, `MySequence ${result}`); } diff --git a/packages/core/test/integration/http-handler.integration.ts b/packages/core/test/integration/http-handler.integration.ts index d98ac4eeb3af..8b39ac6778b0 100644 --- a/packages/core/test/integration/http-handler.integration.ts +++ b/packages/core/test/integration/http-handler.integration.ts @@ -10,6 +10,7 @@ import { writeResultToResponse, RejectProvider, ControllerSpec, + parseOperationArgs, } from '../..'; import {Context} from '@loopback/context'; import {expect, Client, createClientForHandler} from '@loopback/testlab'; @@ -383,6 +384,7 @@ describe('HttpHandler', () => { let handler: HttpHandler; function givenHandler() { rootContext = new Context(); + rootContext.bind('sequence.actions.parseParams').to(parseOperationArgs); rootContext.bind('sequence.actions.logError').to(logger); rootContext.bind('sequence.actions.send').to(writeResultToResponse); rootContext.bind('sequence.actions.reject').toProvider(RejectProvider);