List of usage examples for com.amazonaws.services.apigateway.model PutIntegrationResponseRequest setResourceId
public void setResourceId(String resourceId)
[Required] Specifies a put integration response request's resource identifier.
From source file:squash.deployment.lambdas.ApiGatewayCustomResourceLambda.java
License:Apache License
PutMethodResult createMethodOnResource(String methodName, String resourceId, String restApiId,
Map<String, String> extraParameters, AmazonApiGateway client, String revvingSuffix, String region,
LambdaLogger logger) throws IOException {
logger.log("Creating method: " + methodName + " on resource with id: " + resourceId);
// Short sleep - this avoids the Too Many Requests error in this
// custom resource when creating the cloudformation stack.
pause(logger);/*ww w. ja v a2 s.com*/
// Variables for method request
PutMethodRequest putMethodRequest = new PutMethodRequest();
putMethodRequest.setAuthorizationType("None");
putMethodRequest.setApiKeyRequired(false);
putMethodRequest.setRestApiId(restApiId);
putMethodRequest.setResourceId(resourceId);
Map<String, Boolean> methodRequestParameters = new HashMap<>();
// Variables for the happy-path method response
PutMethodResponseRequest putMethod200ResponseRequest = new PutMethodResponseRequest();
putMethod200ResponseRequest.setRestApiId(restApiId);
putMethod200ResponseRequest.setResourceId(resourceId);
putMethod200ResponseRequest.setStatusCode("200");
// Variables for the server-error 500 method response. This response has the
// same parameters as the 200 response.
PutMethodResponseRequest putMethod500ResponseRequest = new PutMethodResponseRequest();
putMethod500ResponseRequest.setRestApiId(restApiId);
putMethod500ResponseRequest.setResourceId(resourceId);
putMethod500ResponseRequest.setStatusCode("500");
// Variables for the bad-request 400 method response. This response has the
// same parameters as the 200 response.
PutMethodResponseRequest putMethod400ResponseRequest = new PutMethodResponseRequest();
putMethod400ResponseRequest.setRestApiId(restApiId);
putMethod400ResponseRequest.setResourceId(resourceId);
putMethod400ResponseRequest.setStatusCode("400");
// Response models are used to specify the response Body schema - so we can
// populate the values using the integration response template (when we have
// one)
Map<String, String> methodResponseModels = new HashMap<>();
// Response parameters allows us to specify response headers
Map<String, Boolean> methodResponseParameters = new HashMap<>();
// Add CORS response headers
methodResponseParameters.put("method.response.header.access-control-allow-headers",
Boolean.valueOf("true"));
methodResponseParameters.put("method.response.header.access-control-allow-methods",
Boolean.valueOf("true"));
methodResponseParameters.put("method.response.header.access-control-allow-origin", Boolean.valueOf("true"));
methodResponseParameters.put("method.response.header.access-control-max-age", Boolean.valueOf("true"));
methodResponseParameters.put("method.response.header.content-type", Boolean.valueOf("true"));
if (!methodName.equals("OPTIONS")) {
// Add header to prevent caching of booking pages, except for OPTIONS -
// which is not cached.
methodResponseParameters.put("method.response.header.cache-control", Boolean.valueOf("true"));
}
// Variables for integration input
PutIntegrationRequest putIntegrationRequest = new PutIntegrationRequest();
putIntegrationRequest.setRestApiId(restApiId);
putIntegrationRequest.setResourceId(resourceId);
// Request parameters follow pattern like:
// "requestParameters" : {
// "integration.request.path.integrationPathParam" :
// "method.request.querystring.latitude",
// "integration.request.querystring.integrationQueryParam" :
// "method.request.querystring.longitude"
// }
Map<String, String> requestParameters = new HashMap<>();
// Request templates follow pattern like:
// "requestTemplates" : {
// "application/json" : "json request template 2",
// "application/xml" : "xml request template 2"
// }
Map<String, String> requestTemplates = new HashMap<>();
// Variables for integration response
// Configure the integration response for the happy-path case
PutIntegrationResponseRequest putIntegration200ResponseRequest = new PutIntegrationResponseRequest();
putIntegration200ResponseRequest.setRestApiId(restApiId);
putIntegration200ResponseRequest.setResourceId(resourceId);
putIntegration200ResponseRequest.setStatusCode("200");
// Configure the integration response for the server-error 500 case. This
// response has the same parameters as the 200 response.
PutIntegrationResponseRequest putIntegration500ResponseRequest = new PutIntegrationResponseRequest();
putIntegration500ResponseRequest.setRestApiId(restApiId);
putIntegration500ResponseRequest.setResourceId(resourceId);
putIntegration500ResponseRequest.setStatusCode("500");
// Configure the integration response for the bad-request 400 case. This
// response has the same parameters as the 200 response.
PutIntegrationResponseRequest putIntegration400ResponseRequest = new PutIntegrationResponseRequest();
putIntegration400ResponseRequest.setRestApiId(restApiId);
putIntegration400ResponseRequest.setResourceId(resourceId);
putIntegration400ResponseRequest.setStatusCode("400");
// Response parameters follow pattern like:
// "responseParameters" : {
// "method.response.header.test-method-response-header" :
// "integration.response.header.integrationResponseHeaderParam1"
// }
Map<String, String> responseParameters = new HashMap<>();
// Add CORS response headers to all method responses
responseParameters.put("method.response.header.access-control-allow-headers",
"'content-type,x-amz-date,authorization,accept,x-amz-security-token,location,cache-control'");
responseParameters.put("method.response.header.access-control-allow-origin", "'*'");
// This will reduce preflight calls...
responseParameters.put("method.response.header.access-control-max-age", "'86400'");
responseParameters.put("method.response.header.content-type", "'text/html; charset=utf-8'");
// Add no-cache header except to options methods
if (!methodName.contains("OPTIONS")) {
responseParameters.put("method.response.header.cache-control", "'no-cache, must-revalidate'");
}
// Response templates follow pattern like:
// "responseTemplates" : {
// "application/json" : "json 200 response template",
// "application/xml" : "xml 200 response template"
// }
// The response template to use will be chosen by Apigateway based on e.g.
// the Accept header in the client's request.
Map<String, String> response200Templates = new HashMap<>();
Map<String, String> response500Templates = new HashMap<>();
Map<String, String> response400Templates = new HashMap<>();
// Set as default response unless covered by other
// PutIntegrationResponseInput-s
putIntegration200ResponseRequest.setSelectionPattern(".*");
// N.B. For now we encode the redirect Url after an error as part of the
// errorMessage in exceptions thrown from Lambda. The templates below then
// parse this Url out from the errorMessage, display the message alone for a
// short time, then go to the redirect Url.
String errorResponseMappingTemplate = "#set($inputRoot = $input.path('$'))\n"
+ "#set($httpIndex = $inputRoot.errorMessage.lastIndexOf('http'))\n"
+ "#set($redirectUrl = $inputRoot.errorMessage.substring($httpIndex))\n" + "<head>\n"
+ "<title>Grrr</title>\n" + "<meta http-equiv=\"refresh\" content=\"5;URL='$redirectUrl'\" />\n"
+ "</head>\n" + "<body>\n" + "$inputRoot.errorMessage.substring(0, $httpIndex)\n"
+ "<p align='left'>\n"
+ "<a href= '$redirectUrl'>Please click here if you are not redirected automatically within a few seconds</a>\n"
+ "</p>\n" + "</body>\n";
// The PUT and DELETE lambda methods currently use the Cognito context
// variables to determine whether the caller was authenticated as admin.
// This template just adds these Cognito variables to the others
// already present in the request body.
// N.B. We add the request id to the body of all integration requests to
// allow end-to-end tracing of calls - see, e.g.,
// https://aws.amazon.com/blogs/compute/techniques-and-tools-for-better-serverless-api-logging-with-amazon-api-gateway-and-aws-lambda/
// (In short: the browser response when it calls apiGateway has a
// x-amzn-RequestId header with this request id, allowing tracing the call
// from the browser right through to lambda.)
String bookingsPutDeleteRequestTemplate = "{\n" + "\"requestId\" : \"$context.requestId\",\n"
+ "\"apiGatewayBaseUrl\" : $input.json('$.apiGatewayBaseUrl'),\n"
+ "\"court\" : $input.json('$.court'),\n" + "\"courtSpan\" : $input.json('$.courtSpan'),\n"
+ "\"slot\" : $input.json('$.slot'),\n" + "\"slotSpan\" : $input.json('$.slotSpan'),\n"
+ "\"date\" : $input.json('$.date'),\n" + "\"password\" : $input.json('$.password'),\n"
+ "\"name\" : $input.json('$.name'),\n" + "\"putOrDelete\" : $input.json('$.putOrDelete'),\n"
+ "\"redirectUrl\" : $input.json('$.redirectUrl'),\n"
+ "\"cognitoAuthenticationType\" : \"$context.identity.cognitoAuthenticationType\",\n"
+ "\"cognitoIdentityPoolId\" : \"$context.identity.cognitoIdentityPoolId\"\n" + "}";
String bookingRulesPutDeleteRequestTemplate = "{\n" + "\"requestId\" : \"$context.requestId\",\n"
+ "\"bookingRule\" : $input.json('$.bookingRule'),\n"
+ "\"dateToExclude\" : $input.json('$.dateToExclude'),\n"
+ "\"putOrDelete\" : $input.json('$.putOrDelete'),\n"
+ "\"cognitoAuthenticationType\" : \"$context.identity.cognitoAuthenticationType\",\n"
+ "\"cognitoIdentityPoolId\" : \"$context.identity.cognitoIdentityPoolId\"\n" + "}";
PutMethodResult method = null;
if (methodName.equals("ValidDatesGET")) {
putMethodRequest.setHttpMethod("GET");
putMethod200ResponseRequest.setHttpMethod("GET");
putIntegration200ResponseRequest.setHttpMethod("GET");
putMethod500ResponseRequest.setHttpMethod("GET");
putIntegration500ResponseRequest.setHttpMethod("GET");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("ValidDatesGETLambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("GET");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
response200Templates.put("application/json",
"#set($inputRoot = $input.path('$'))\n" + "{\"requestId\" : \"$context.requestId\",\n"
+ "\"dates\": " + "#foreach($elem in $inputRoot)\n" + " $elem\n"
+ "#if($foreach.hasNext),#end\n" + "#end\n" + "}");
response500Templates.put("application/json", errorResponseMappingTemplate);
responseParameters.put("method.response.header.access-control-allow-methods", "'GET,OPTIONS'");
// Lambda exception message regex that we want mapped to the 500 response
// .*The booking name.*|.*password.*
putIntegration500ResponseRequest
.setSelectionPattern("Apologies - something has gone wrong. Please try again.");
} else if (methodName.equals("ValidDatesOPTIONS")) {
// OPTIONS method is required for CORS.
putMethodRequest.setHttpMethod("OPTIONS");
putMethod200ResponseRequest.setHttpMethod("OPTIONS");
putIntegration200ResponseRequest.setHttpMethod("OPTIONS");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("OPTIONS");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
responseParameters.put("method.response.header.access-control-allow-methods", "'GET,OPTIONS'");
} else if (methodName.equals("BookingsGET")) {
methodRequestParameters.put("method.request.querystring.date", Boolean.valueOf("true"));
putMethodRequest.setRequestParameters(methodRequestParameters);
putMethodRequest.setHttpMethod("GET");
putMethod200ResponseRequest.setHttpMethod("GET");
putMethod500ResponseRequest.setHttpMethod("GET");
putMethod400ResponseRequest.setHttpMethod("GET");
putIntegration500ResponseRequest.setHttpMethod("GET");
putIntegration200ResponseRequest.setHttpMethod("GET");
putIntegration400ResponseRequest.setHttpMethod("GET");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingsGETLambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("GET");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
requestTemplates.put("application/json",
"#set($inputRoot = $input.path('$'))\n" + "{\n" + "\"requestId\" : \"$context.requestId\",\n"
+ "\"date\" : \"$input.params('date')\",\n" + "\"redirectUrl\" : \"http://"
+ squashWebsiteBucket + ".s3-website-" + region
+ ".amazonaws.com?selectedDate=${input.params('date')}.html\"\n" + "}");
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,POST,OPTIONS'");
putIntegration500ResponseRequest
.setSelectionPattern("Apologies - something has gone wrong. Please try again.");
putIntegration400ResponseRequest
.setSelectionPattern("The booking date.*|Cannot access bookings or rules.*");
responseParameters.put("method.response.header.content-type", "'application/json'");
} else if (methodName.equals("BookingsPUT")) {
putMethodRequest.setHttpMethod("PUT");
// Set IAM authorisation so ApiGateway provides the Cognito context
// variables
putMethodRequest.setAuthorizationType("AWS_IAM");
putMethod200ResponseRequest.setHttpMethod("PUT");
putMethod500ResponseRequest.setHttpMethod("PUT");
putMethod400ResponseRequest.setHttpMethod("PUT");
putIntegration500ResponseRequest.setHttpMethod("PUT");
putIntegration200ResponseRequest.setHttpMethod("PUT");
putIntegration400ResponseRequest.setHttpMethod("PUT");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingsPUTDELETELambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("PUT");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
requestTemplates.put("application/json", bookingsPutDeleteRequestTemplate);
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,POST,OPTIONS'");
putIntegration500ResponseRequest
.setSelectionPattern("Apologies - something has gone wrong. Please try again.");
putIntegration400ResponseRequest.setSelectionPattern(
"The booking court.*|The booking time.*|The booking name.*|The booking date.*|The password is incorrect.*|You must login to manage block bookings.*|Booking creation failed.*|Booking cancellation failed.*|Cannot mutate bookings or rules.*|Cannot access bookings or rules.*");
responseParameters.put("method.response.header.content-type", "'application/json'");
} else if (methodName.equals("BookingsDELETE")) {
putMethodRequest.setHttpMethod("DELETE");
// Set IAM authorisation so ApiGateway provides the Cognito context
// variables
putMethodRequest.setAuthorizationType("AWS_IAM");
putMethod200ResponseRequest.setHttpMethod("DELETE");
putMethod500ResponseRequest.setHttpMethod("DELETE");
putMethod400ResponseRequest.setHttpMethod("DELETE");
putIntegration500ResponseRequest.setHttpMethod("DELETE");
putIntegration200ResponseRequest.setHttpMethod("DELETE");
putIntegration400ResponseRequest.setHttpMethod("DELETE");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingsPUTDELETELambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("DELETE");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
requestTemplates.put("application/json", bookingsPutDeleteRequestTemplate);
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,POST,OPTIONS'");
putIntegration500ResponseRequest.setSelectionPattern(
"Apologies - something has gone wrong. Please try again.|Booking creation failed.*|Booking cancellation failed.*|Cannot mutate bookings or rules.*|Cannot access bookings or rules.*");
putIntegration400ResponseRequest.setSelectionPattern(
"The booking court.*|The booking time.*|The booking name.*|The booking date.*|The password is incorrect.*|You must login to manage block bookings.*");
responseParameters.put("method.response.header.content-type", "'application/json'");
} else if (methodName.equals("BookingsPOST")) {
// Redirect to the mutated booking page after creating or cancelling a
// booking
putMethod200ResponseRequest.setStatusCode("303");
putMethodRequest.setHttpMethod("POST");
putMethod500ResponseRequest.setHttpMethod("POST");
putMethod400ResponseRequest.setHttpMethod("POST");
putIntegration500ResponseRequest.setHttpMethod("POST");
putMethod200ResponseRequest.setHttpMethod("POST");
putIntegration400ResponseRequest.setHttpMethod("POST");
// Define the 303 integration response (which by default will match any
// response from lambda)
putIntegration200ResponseRequest.setStatusCode("303");
putIntegration200ResponseRequest.setHttpMethod("POST");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingsPUTDELETELambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("POST");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
response500Templates.put("application/json", errorResponseMappingTemplate);
response400Templates.put("application/json", errorResponseMappingTemplate);
// Need to convert html-post body from url-encoded string to json (which
// lambda likes)
requestTemplates.put("application/x-www-form-urlencoded", getBookingPostRequestTemplate(logger));
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,POST,OPTIONS'");
methodResponseParameters.put("method.response.header.location", Boolean.valueOf("true"));
// Redirect to the newly-mutated booking page in S3 if we have it in the
// json from our lambda function which will have put the appropriate
// redirectUrl into the body, unless there was an error. Recognised
// errors should have a redirectUrl appended to the error message by my
// lambdas(and so be handled by other status codes above). For errors I'm
// not expecting, there will be no redirectUrl in the json from lambda.
// In this last case, the template below will insert its own redirectUrl
// into the body pointing to today's page - as a last-ditch failsafe.
response200Templates.put("application/json",
"## Use quotes to get body into a string here (input.path('$') by itself would create a POJO in error cases)\n"
+ "#set($lambdaBody = \"$input.path('$')\")\n"
+ "#set($countRedirects = $lambdaBody.length() - $lambdaBody.replace(\"redirectUrl\", \"\").length())\n"
+ "#if ($countRedirects != 0)\n"
+ "## Success case with a redirectUrl - the Location header mapping will find it.\n"
+ "## But just in case not, put in some redirecting html also.\n"
+ "#set($redirectUrl = $input.path('$.redirectUrl'))\n" + "#else\n"
+ "## Unhandled error case: no redirect url from lambda, the Location header mapping will thus not find it.\n"
+ "## We thus need to redirect to today's page by providing suitable html instead\n"
+ "#set($redirectUrl = \"http://" + squashWebsiteBucket + ".s3-website-" + region
+ ".amazonaws.com/today.html\")\n" + "#end\n" + "<head>\n" + "<title>Grrr</title>\n"
+ "<meta http-equiv=\"refresh\" content=\"5;URL='$redirectUrl'\" />\n" + "</head>\n"
+ "<body>\n" + "Apologies - something has gone wrong. Please try again.\n"
+ "<p align='left'>\n"
+ "<a href= '$redirectUrl'>Please click here if you are not redirected automatically within a few seconds</a>\n"
+ "</p>\n" + "</body>\n");
responseParameters.put("method.response.header.location", "integration.response.body.redirectUrl");
putIntegration500ResponseRequest.setSelectionPattern(
"Apologies - something has gone wrong. Please try again.|Booking creation failed.*|Booking cancellation failed.*|Cannot mutate bookings or rules.*|Cannot access bookings or rules.*");
putIntegration400ResponseRequest.setSelectionPattern(
"The booking court.*|The booking time.*|The booking name.*|The booking date.*|The password is incorrect.*");
} else if (methodName.equals("BookingsOPTIONS")) {
// OPTIONS method is required for CORS.
putMethodRequest.setHttpMethod("OPTIONS");
putMethod200ResponseRequest.setHttpMethod("OPTIONS");
putIntegration200ResponseRequest.setHttpMethod("OPTIONS");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("OPTIONS");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,POST,OPTIONS'");
} else if (methodName.equals("BookingrulesGET")) {
putMethodRequest.setHttpMethod("GET");
putMethod200ResponseRequest.setHttpMethod("GET");
putMethod500ResponseRequest.setHttpMethod("GET");
putMethod400ResponseRequest.setHttpMethod("GET");
putIntegration500ResponseRequest.setHttpMethod("GET");
putIntegration200ResponseRequest.setHttpMethod("GET");
putIntegration400ResponseRequest.setHttpMethod("GET");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingRulesGETLambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("GET");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
requestTemplates.put("application/json", "{\"requestId\" : \"$context.requestId\"}");
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,OPTIONS'");
putIntegration500ResponseRequest.setSelectionPattern(
"Apologies - something has gone wrong. Please try again.|Cannot mutate bookings or rules.*|Cannot access bookings or rules.*");
responseParameters.put("method.response.header.content-type", "'application/json'");
} else if (methodName.equals("BookingrulesPUT")) {
putMethodRequest.setHttpMethod("PUT");
// Set IAM authorisation so ApiGateway provides the Cognito context
// variables
putMethodRequest.setAuthorizationType("AWS_IAM");
putMethod200ResponseRequest.setHttpMethod("PUT");
putMethod500ResponseRequest.setHttpMethod("PUT");
putMethod400ResponseRequest.setHttpMethod("PUT");
putIntegration500ResponseRequest.setHttpMethod("PUT");
putIntegration200ResponseRequest.setHttpMethod("PUT");
putIntegration400ResponseRequest.setHttpMethod("PUT");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingRulesPUTDELETELambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("PUT");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
requestTemplates.put("application/json", bookingRulesPutDeleteRequestTemplate);
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,OPTIONS'");
putIntegration500ResponseRequest.setSelectionPattern(
"Apologies - something has gone wrong. Please try again.|Cannot mutate bookings or rules.*|Cannot access bookings or rules.*");
putIntegration400ResponseRequest.setSelectionPattern(
"You must login to manage booking rules.*|Booking rule creation failed.*|Booking rule addition failed - too many rules.*|Booking rule exclusion addition failed - too many exclusions.*|Booking rule creation failed - new rule would clash.*");
responseParameters.put("method.response.header.content-type", "'application/json'");
} else if (methodName.equals("BookingrulesDELETE")) {
putMethodRequest.setHttpMethod("DELETE");
// Set IAM authorisation so ApiGateway provides the Cognito context
// variables
putMethodRequest.setAuthorizationType("AWS_IAM");
putMethod200ResponseRequest.setHttpMethod("DELETE");
putMethod500ResponseRequest.setHttpMethod("DELETE");
putMethod400ResponseRequest.setHttpMethod("DELETE");
putIntegration500ResponseRequest.setHttpMethod("DELETE");
putIntegration200ResponseRequest.setHttpMethod("DELETE");
putIntegration400ResponseRequest.setHttpMethod("DELETE");
method = client.putMethod(putMethodRequest);
// N.B. Using LAMBDA type here is not yet supported by this sdk - so use
// AWS instead.
putIntegrationRequest.setType(IntegrationType.AWS);
putIntegrationRequest.setUri(extraParameters.get("BookingRulesPUTDELETELambdaURI"));
// N.B. Lambda uses POST even for GET methods
putIntegrationRequest.setHttpMethod("DELETE");
putIntegrationRequest.setCredentials(extraParameters.get("BookingsApiGatewayInvocationRole"));
requestTemplates.put("application/json", bookingRulesPutDeleteRequestTemplate);
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,OPTIONS'");
putIntegration500ResponseRequest.setSelectionPattern(
"Apologies - something has gone wrong. Please try again.|Cannot mutate bookings or rules.*|Cannot access bookings or rules.*");
putIntegration400ResponseRequest.setSelectionPattern(
"You must login to manage booking rules.*|Booking rule deletion failed.*|Booking rule exclusion deletion failed - latent clash exists.*");
responseParameters.put("method.response.header.content-type", "'application/json'");
} else if (methodName.equals("BookingrulesOPTIONS")) {
// OPTIONS method is required for CORS.
putMethodRequest.setHttpMethod("OPTIONS");
putMethod200ResponseRequest.setHttpMethod("OPTIONS");
putIntegration200ResponseRequest.setHttpMethod("OPTIONS");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("OPTIONS");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
responseParameters.put("method.response.header.access-control-allow-methods",
"'GET,PUT,DELETE,OPTIONS'");
} else if (methodName.equals("ReservationformGET")) {
methodRequestParameters.put("method.request.querystring.court", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.slot", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.slotLong", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.date", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.dateLong", Boolean.valueOf("true"));
putMethodRequest.setRequestParameters(methodRequestParameters);
putMethodRequest.setHttpMethod("GET");
putMethod200ResponseRequest.setHttpMethod("GET");
putIntegration200ResponseRequest.setHttpMethod("GET");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("GET");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
response200Templates.put("text/html",
getReservationformResponseTemplate(revvingSuffix, region, logger));
responseParameters.put("method.response.header.access-control-allow-methods", "'GET,OPTIONS'");
} else if (methodName.equals("ReservationformOPTIONS")) {
// OPTIONS method is required for CORS.
putMethodRequest.setHttpMethod("OPTIONS");
putMethod200ResponseRequest.setHttpMethod("OPTIONS");
putIntegration200ResponseRequest.setHttpMethod("OPTIONS");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("OPTIONS");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
responseParameters.put("method.response.header.access-control-allow-methods", "'GET,OPTIONS'");
} else if (methodName.equals("CancellationformGET")) {
methodRequestParameters.put("method.request.querystring.court", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.slot", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.slotLong", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.name", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.date", Boolean.valueOf("true"));
methodRequestParameters.put("method.request.querystring.dateLong", Boolean.valueOf("true"));
putMethodRequest.setRequestParameters(methodRequestParameters);
putMethodRequest.setHttpMethod("GET");
putMethod200ResponseRequest.setHttpMethod("GET");
putIntegration200ResponseRequest.setHttpMethod("GET");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("GET");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
response200Templates.put("text/html",
getCancellationformResponseTemplate(revvingSuffix, region, logger));
responseParameters.put("method.response.header.access-control-allow-methods", "'GET,OPTIONS'");
} else if (methodName.equals("CancellationformOPTIONS")) {
// OPTIONS method is required for CORS.
putMethodRequest.setHttpMethod("OPTIONS");
putMethod200ResponseRequest.setHttpMethod("OPTIONS");
putIntegration200ResponseRequest.setHttpMethod("OPTIONS");
method = client.putMethod(putMethodRequest);
putIntegrationRequest.setType(IntegrationType.MOCK);
putIntegrationRequest.setHttpMethod("OPTIONS");
requestTemplates.put("application/json", "{\"statusCode\": 200}");
responseParameters.put("method.response.header.access-control-allow-methods", "'GET,OPTIONS'");
} else {
throw new InvalidArgumentException("Invalid method name: " + methodName);
}
// Method response
putMethod200ResponseRequest.setResponseModels(methodResponseModels);
putMethod200ResponseRequest.setResponseParameters(methodResponseParameters);
client.putMethodResponse(putMethod200ResponseRequest);
// Integration input
putIntegrationRequest.setRequestParameters(requestParameters);
putIntegrationRequest.setRequestTemplates(requestTemplates);
putIntegrationRequest.setIntegrationHttpMethod("POST");
client.putIntegration(putIntegrationRequest);
// Integration response
putIntegration200ResponseRequest.setResponseParameters(responseParameters);
putIntegration200ResponseRequest.setResponseTemplates(response200Templates);
putIntegration200ResponseRequest.setSelectionPattern(".*");
client.putIntegrationResponse(putIntegration200ResponseRequest);
if (methodName.equals("ValidDatesGET")) {
putMethod500ResponseRequest.setResponseModels(methodResponseModels);
putMethod500ResponseRequest.setResponseParameters(methodResponseParameters);
client.putMethodResponse(putMethod500ResponseRequest);
putIntegration500ResponseRequest.setResponseParameters(responseParameters);
putIntegration500ResponseRequest.setResponseTemplates(response500Templates);
client.putIntegrationResponse(putIntegration500ResponseRequest);
} else if (methodName.equals("BookingsGET") || methodName.equals("BookingsPUT")
|| methodName.equals("BookingsPOST") || methodName.equals("BookingsDELETE")
|| methodName.equals("BookingrulesGET") || methodName.equals("BookingrulesPUT")
|| methodName.equals("BookingrulesDELETE")) {
putMethod500ResponseRequest.setResponseModels(methodResponseModels);
putMethod500ResponseRequest.setResponseParameters(methodResponseParameters);
client.putMethodResponse(putMethod500ResponseRequest);
putMethod400ResponseRequest.setResponseModels(methodResponseModels);
putMethod400ResponseRequest.setResponseParameters(methodResponseParameters);
client.putMethodResponse(putMethod400ResponseRequest);
putIntegration500ResponseRequest.setResponseParameters(responseParameters);
putIntegration500ResponseRequest.setResponseTemplates(response500Templates);
client.putIntegrationResponse(putIntegration500ResponseRequest);
putIntegration400ResponseRequest.setResponseParameters(responseParameters);
putIntegration400ResponseRequest.setResponseTemplates(response400Templates);
client.putIntegrationResponse(putIntegration400ResponseRequest);
}
return method;
}