Skip to content

Commit

Permalink
Added proxy helper.
Browse files Browse the repository at this point in the history
  • Loading branch information
julienblin committed Jun 6, 2018
1 parent 18f7c9d commit 67e1e6f
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 9 deletions.
27 changes: 27 additions & 0 deletions src/builder.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import { isAPIGatewayProxyResult, ServicesWithParseBody, ServicesWithParseParameters } from "@middlewares/proxy";
import { notFoundError } from "@src/errors";
import { ok } from "@src/responses";
import * as awsLambda from "aws-lambda";

export interface LambdaArg<TEvent, TServices> {
Expand Down Expand Up @@ -55,3 +58,27 @@ export class LambdaBuildImpl implements LambdaBuilder {
}

export const lambda = (): LambdaBuilder => new LambdaBuildImpl();

export type ProxyFunc<TServices> =
(
lambda: { event: awsLambda.APIGatewayProxyEvent, context: awsLambda.Context },
services: TServices & ServicesWithParseBody & ServicesWithParseParameters) => Promise<any>;

export const proxy = <TServices = any>(func: ProxyFunc<TServices>)
: LambdaExecution<awsLambda.APIGatewayProxyEvent, TServices> => {
return async (arg: LambdaArg<awsLambda.APIGatewayProxyEvent, TServices>) => {
const result = await func(
{ context: arg.context, event: arg.event },
arg.services as TServices & ServicesWithParseBody & ServicesWithParseParameters);

if (result && isAPIGatewayProxyResult(result)) {
return result;
}

if (result) {
return ok(result);
} else {
throw notFoundError(arg.event.path);
}
};
};
4 changes: 2 additions & 2 deletions src/middlewares/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export const serializeBodyAsJSON =
};
};

export const PARSE_BODY_METHOD = "_parseBody";
export const PARSE_BODY_METHOD = "parseBody";

export interface ServicesWithParseBody {
[PARSE_BODY_METHOD](): any;
Expand Down Expand Up @@ -169,7 +169,7 @@ export const parseBodyAsFORM = (reviver?: (key: any, value: any) => any, parseMe
};
};

export const PARSE_PARAMETERS_METHOD = "_parseParameters";
export const PARSE_PARAMETERS_METHOD = "parseParameters";

export interface ServicesWithParseParameters {
[PARSE_PARAMETERS_METHOD](): any;
Expand Down
8 changes: 4 additions & 4 deletions src/middlewares/validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ export const validateBody = (schema: JSONSchema)
arg: LambdaArg<awsLambda.APIGatewayProxyEvent, ServicesWithParseBody>,
next: LambdaExecution<any, any>): Promise<any> => {

if (!arg.services._parseBody) {
if (!arg.services.parseBody) {
throw new Error("Missing parseBody service - did you forget a middleware?");
}

const bodyAsObject = arg.services._parseBody();
const bodyAsObject = arg.services.parseBody();

if (!bodyAsObject) {
throw validationError([{ code: "required", message: "Missing body", target: "body" }]);
Expand All @@ -62,11 +62,11 @@ export const validateParameters = (schema: JSONSchema)
arg: LambdaArg<awsLambda.APIGatewayProxyEvent, ServicesWithParseParameters>,
next: LambdaExecution<any, any>): Promise<any> => {

if (!arg.services._parseParameters) {
if (!arg.services.parseParameters) {
throw new Error("Missing parseParameters service - did you forget a middleware?");
}

const validationErrors = validate(schema, arg.services._parseParameters(), "parameters");
const validationErrors = validate(schema, arg.services.parseParameters(), "parameters");
if (validationErrors.length > 0) {
throw validationError(validationErrors);
}
Expand Down
6 changes: 3 additions & 3 deletions test/unit/middlewares/proxy-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ describe("parseBodyAsJSON middleware", () => {
.use(parseBodyAsJSON())
.handler<any, APIGatewayProxyResult, ServicesWithParseBody>
(async ({ services }) => {
expect(services._parseBody()).to.deep.equal(body);
expect(services.parseBody()).to.deep.equal(body);
});

await handler(
Expand All @@ -223,7 +223,7 @@ describe("parseBodyAsFORM middleware", () => {
.use(parseBodyAsFORM())
.handler<any, APIGatewayProxyResult, ServicesWithParseBody>
(async ({ services }) => {
expect(services._parseBody()).to.deep.equal(body);
expect(services.parseBody()).to.deep.equal(body);
});

await handler(
Expand All @@ -248,7 +248,7 @@ describe("parseParameters middleware", () => {
.use(parseParameters())
.handler<any, APIGatewayProxyResult, ServicesWithParseParameters>
(async ({ services }) => {
expect(services._parseParameters()).to.deep.equal(parameters);
expect(services.parseParameters()).to.deep.equal(parameters);
});

await handler(
Expand Down

0 comments on commit 67e1e6f

Please sign in to comment.