Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(apigateway): auto-create RequestValidator from options to addMethod() #6780

Merged
merged 39 commits into from
Apr 1, 2020
Merged
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
375a157
fix(apigateway): Allows configuring authorization scopes in apigatewa…
pankajy93 Feb 28, 2020
37249b2
Fixes build failure for Case sensitive fields
pankajy93 Feb 28, 2020
bab8d99
Merge branch 'master' into master
nirvana124 Feb 29, 2020
71ab433
Update packages/@aws-cdk/aws-apigateway/lib/method.ts
nirvana124 Mar 5, 2020
26c31ea
Update packages/@aws-cdk/aws-apigateway/lib/method.ts
nirvana124 Mar 5, 2020
14dfbe7
Update packages/@aws-cdk/aws-apigateway/lib/method.ts
nirvana124 Mar 5, 2020
4612c83
Update packages/@aws-cdk/aws-apigateway/test/test.method.ts
nirvana124 Mar 5, 2020
87cbb71
Update packages/@aws-cdk/aws-apigateway/test/test.method.ts
nirvana124 Mar 5, 2020
07a3188
Merge branch 'master' into master
nirvana124 Mar 5, 2020
49d3752
Added test cases to cover auth scopes absent and method options auth …
pankajy93 Mar 5, 2020
3399253
Updating readme for authorizationScopes
pankajy93 Mar 5, 2020
913df38
removing trailing white space to fix @aws-cdk/aws-apigateway: ERROR: …
pankajy93 Mar 5, 2020
3f451f7
Merge branch 'master' into master
nirvana124 Mar 9, 2020
9b558f4
Merge branch 'master' into master
nirvana124 Mar 10, 2020
6b3e232
adds comments under default integration and method section.
pankajy93 Mar 13, 2020
7518e33
Merge branch 'master' into master
nirvana124 Mar 13, 2020
5cea74b
adjust lang in README
Mar 13, 2020
4660a32
Reolved conflicts
pankajy93 Mar 13, 2020
c11dc30
Merge branch 'master' of https://github.com/nirvana124/aws-cdk
pankajy93 Mar 15, 2020
3f75fca
Merge branch 'master' of https://github.com/aws/aws-cdk
pankajy93 Mar 15, 2020
b7b169e
Merge branch 'master' of https://github.com/aws/aws-cdk
pankajy93 Mar 17, 2020
0399ffc
Merge branch 'master' of https://github.com/aws/aws-cdk
pankajy93 Mar 18, 2020
4f31455
feat(apigateway): configure RequestValidatorOptions instead of passin…
pankajy93 Mar 18, 2020
953fea7
removing unused import
pankajy93 Mar 18, 2020
25d5fa0
fixed formatting issues
pankajy93 Mar 18, 2020
ea3547c
Fixed wordings
pankajy93 Mar 18, 2020
897b358
comments
nirvana124 Mar 18, 2020
504755c
Fixed whitespaces
nirvana124 Mar 18, 2020
7475d6f
Merge branch 'master' into nirvana124/requestValidator
nirvana124 Mar 21, 2020
7b4e896
Review comments fixes
pankajy93 Mar 25, 2020
05ca9c5
Merge branch 'master' into nirvana124/requestValidator
nirvana124 Mar 25, 2020
3028e2e
Merge branch 'master' into nirvana124/requestValidator
nirvana124 Apr 1, 2020
265d8c5
Update packages/@aws-cdk/aws-apigateway/test/test.method.ts
nirvana124 Apr 1, 2020
38b5a5c
Update packages/@aws-cdk/aws-apigateway/test/test.method.ts
nirvana124 Apr 1, 2020
33cd0ec
Update packages/@aws-cdk/aws-apigateway/test/test.method.ts
nirvana124 Apr 1, 2020
4ed59a7
Update packages/@aws-cdk/aws-apigateway/test/test.method.ts
nirvana124 Apr 1, 2020
27b06ef
Merge branch 'master' into nirvana124/requestValidator
nirvana124 Apr 1, 2020
1e0567d
review comment fix
pankajy93 Apr 1, 2020
5868367
Merge branch 'master' into nirvana124/requestValidator
nirvana124 Apr 1, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions packages/@aws-cdk/aws-apigateway/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,18 +297,17 @@ const errorResponseModel = api.addModel('ErrorResponseModel', {
And reference all on your method definition.

```ts
// If you want to define parameter mappings for the request, you need a validator
const validator = api.addRequestValidator('DefaultValidator', {
validateRequestBody: false,
validateRequestParameters: true
});
resource.addMethod('GET', integration, {
// We can mark the parameters as required
requestParameters: {
'method.request.querystring.who': true
},
// We need to set the validator for ensuring they are passed
requestValidator: validator,
// we can set request validator options like below
requestValidatorOptions: {
requestValidatorName: 'test-validator',
validateRequestBody: true,
validateRequestParameters: false
}
methodResponses: [
{
// Successful response from the integration
Expand Down Expand Up @@ -340,6 +339,9 @@ resource.addMethod('GET', integration, {
});
```

Specifying `requestValidatorOptions` automatically creates the RequestValidator construct with the given options.
However, if you have your RequestValidator already initialized or imported, use the `requestValidator` option instead.

#### Default Integration and Method Options

The `defaultIntegration` and `defaultMethodOptions` properties can be used to
Expand Down
27 changes: 25 additions & 2 deletions packages/@aws-cdk/aws-apigateway/lib/method.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { ConnectionType, Integration } from './integration';
import { MockIntegration } from './integrations/mock';
import { MethodResponse } from './methodresponse';
import { IModel } from './model';
import { IRequestValidator } from './requestvalidator';
import { IRequestValidator, RequestValidatorOptions } from './requestvalidator';
import { IResource } from './resource';
import { RestApi } from './restapi';
import { validateHttpMethod } from './util';
Expand Down Expand Up @@ -73,6 +73,8 @@ export interface MethodOptions {

/**
* The ID of the associated request validator.
nirvana124 marked this conversation as resolved.
Show resolved Hide resolved
* Only one of `requestValidator` or `requestValidatorOptions` must be specified.
* @default - No default validator
*/
readonly requestValidator?: IRequestValidator;

Expand All @@ -83,6 +85,13 @@ export interface MethodOptions {
* @default - no authorization scopes
*/
readonly authorizationScopes?: string[]

/**
* Request validator options to create new validator
nirvana124 marked this conversation as resolved.
Show resolved Hide resolved
* Only one of `requestValidator` or `requestValidatorOptions` must be specified.
* @default - No default validator
*/
readonly requestValidatorOptions?: RequestValidatorOptions;
}

export interface MethodProps {
Expand Down Expand Up @@ -160,7 +169,7 @@ export class Method extends Resource {
integration: this.renderIntegration(props.integration),
methodResponses: this.renderMethodResponses(options.methodResponses),
requestModels: this.renderRequestModels(options.requestModels),
requestValidatorId: options.requestValidator ? options.requestValidator.requestValidatorId : undefined,
requestValidatorId: this.requestValidatorId(options),
authorizationScopes: options.authorizationScopes ?? defaultMethodOptions.authorizationScopes,
};

Expand Down Expand Up @@ -302,6 +311,20 @@ export class Method extends Resource {

return models;
}

private requestValidatorId(options: MethodOptions): string | undefined {
nirvana124 marked this conversation as resolved.
Show resolved Hide resolved
if (options.requestValidator && options.requestValidatorOptions) {
throw new Error(`Only one of 'requestValidator' or 'requestValidatorOptions' must be specified.`);
}

if (options.requestValidatorOptions) {
const validator = this.restApi.addRequestValidator('validator', options.requestValidatorOptions);
return validator.requestValidatorId;
}

// For backward compatibility
return options.requestValidator?.requestValidatorId;
}
}

export enum AuthorizationType {
Expand Down
78 changes: 78 additions & 0 deletions packages/@aws-cdk/aws-apigateway/test/test.method.ts
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,84 @@ export = {
AuthorizationScopes: ABSENT
}));

test.done();
},

'method has a request validator with provided properties'(test: Test) {
// GIVEN
const stack = new cdk.Stack();
const api = new apigw.RestApi(stack, 'test-api', { deploy: false });

// WHEN
new apigw.Method(stack, 'method-man', {
httpMethod: 'GET',
resource: api.root,
options: {
requestValidatorOptions: {
requestValidatorName: 'test-validator',
validateRequestBody: true,
validateRequestParameters: false
}
}
});

// THEN
expect(stack).to(haveResource('AWS::ApiGateway::RequestValidator', {
RestApiId: stack.resolve(api.restApiId),
ValidateRequestBody: true,
ValidateRequestParameters: false,
Name: 'test-validator'
}));

test.done();
},

'method does not have a request validator'(test: Test) {
// GIVEN
const stack = new cdk.Stack();
const api = new apigw.RestApi(stack, 'test-api', { deploy: false });

// WHEN
new apigw.Method(stack, 'method-man', {
httpMethod: 'GET',
resource: api.root
});

// THEN
expect(stack).to(haveResource('AWS::ApiGateway::Method', {
RequestValidatorId: ABSENT
}));

test.done();
},

'method does not support both request validator and request validator options'(test: Test) {
// GIVEN
const stack = new cdk.Stack();
const api = new apigw.RestApi(stack, 'test-api', { deploy: false });
const validator = api.addRequestValidator('test-validator1', {
validateRequestBody: true,
validateRequestParameters: false
});

// WHEN
const methodProps = {
httpMethod: 'GET',
resource: api.root,
options: {
requestValidatorOptions: {
requestValidatorName: 'test-validator2',
validateRequestBody: true,
validateRequestParameters: false
},
requestValidator: validator
}
};

// THEN
test.throws(() => new apigw.Method(stack, 'method', methodProps),
/Only one of 'requestValidator' or 'requestValidatorOptions' must be specified./);

test.done();
}
};