Skip to content

Commit

Permalink
fix(aws-apigateway): change 'proxyPath' to 'proxyAll'
Browse files Browse the repository at this point in the history
The LambdaRestApi construct now takes a 'proxyAll' argument to enable
forwarding all requests to the given Lambda Function.

BREAKING CHANGE: specifying a path no longer works. If you used to
provide a '/', now supply true. Otherwise, you will have to construct
more complex resource paths yourself.

Fixes #959.
  • Loading branch information
Rico Huijbers committed Oct 18, 2018
1 parent 1ee8135 commit 92cd7a9
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 44 deletions.
41 changes: 26 additions & 15 deletions packages/@aws-cdk/aws-apigateway/lib/lambda-api.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import lambda = require('@aws-cdk/aws-lambda');
import cdk = require('@aws-cdk/cdk');
import { LambdaIntegration } from './integrations';
import { Method } from './method';
import { Resource } from './resource';
import { RestApi, RestApiProps } from './restapi';

export interface LambdaRestApiProps {
Expand All @@ -13,15 +15,14 @@ export interface LambdaRestApiProps {
handler: lambda.Function;

/**
* An API path for a greedy proxy with an "ANY" method, which will route all
* requests under that path to the defined handler.
* If true, route all requests to the Lambda Function
*
* If not defined, you will need to explicitly define the API model using
* If not set to true, you will need to explicitly define the API model using
* `addResource` and `addMethod` (or `addProxy`).
*
* @default undefined
* @default false
*/
proxyPath?: string;
proxyAll?: boolean;

/**
* Further customization of the REST API.
Expand Down Expand Up @@ -49,16 +50,26 @@ export class LambdaRestApi extends RestApi {
...props.options
});

// if proxyPath is specified, add a proxy at the specified path
// we will need to create all resources along the path.
const proxyPath = props.proxyPath;
if (proxyPath) {
const route = proxyPath.split('/').filter(x => x);
let curr = this.root;
for (const part of route) {
curr = curr.addResource(part);
}
curr.addProxy();
if (props.proxyAll) {
this.root.addProxy();
this.root.addMethod('ANY');

// Make sure users cannot call any other resource adding function
this.root.addResource = addResourceThrows;
this.root.addMethod = addMethodThrows;
this.root.addProxy = addProxyThrows;
}
}
}

function addResourceThrows(): Resource {
throw new Error(`Cannot call 'addResource' on a proyxing LambdaRestApi; set 'proxyAll' to false`);
}

function addMethodThrows(): Method {
throw new Error(`Cannot call 'addMethod' on a proyxing LambdaRestApi; set 'proxyAll' to false`);
}

function addProxyThrows(): Resource {
throw new Error(`Cannot call 'addProxy' on a proyxing LambdaRestApi; set 'proxyAll' to false`);
}
37 changes: 8 additions & 29 deletions packages/@aws-cdk/aws-apigateway/test/test.lambda-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,14 @@ export = {
});

// WHEN
new apigw.LambdaRestApi(stack, 'lambda-rest-api', { handler, proxyPath: '/' });
const api = new apigw.LambdaRestApi(stack, 'lambda-rest-api', { handler, proxyAll: true });

// THEN
// THEN -- can't customize further
test.throws(() => {
api.root.addResource('cant-touch-this');
});

// THEN -- template proxies everything
expect(stack).to(haveResource('AWS::ApiGateway::Resource', {
"PathPart": "{proxy+}"
}));
Expand Down Expand Up @@ -81,32 +86,6 @@ export = {
test.done();
},

'proxyPath can be used to attach the proxy to any route'(test: Test) {
// GIVEN
const stack = new cdk.Stack();

const handler = new lambda.Function(stack, 'handler', {
handler: 'index.handler',
code: lambda.Code.inline('boom'),
runtime: lambda.Runtime.NodeJS610,
});

// WHEN
new apigw.LambdaRestApi(stack, 'lambda-rest-api', {
handler,
proxyPath: '/backend/v2'
});

// THEN
expect(stack).to(haveResource('AWS::ApiGateway::Method', {
"ResourceId": {
"Ref": "lambdarestapibackendv2proxyC4980BD5"
}
}));

test.done();
},

'when "proxyPath" is not specified, users need to define the model'(test: Test) {
// GIVEN
const stack = new cdk.Stack();
Expand Down Expand Up @@ -162,5 +141,5 @@ export = {
}), /Cannot specify \"options\.defaultIntegration\" since Lambda integration is automatically defined/);

test.done();
}
},
};

0 comments on commit 92cd7a9

Please sign in to comment.