in source/patterns/@aws-solutions-constructs/aws-apigateway-dynamodb/lib/index.ts [122:244]
constructor(scope: Construct, id: string, props: ApiGatewayToDynamoDBProps) {
super(scope, id);
defaults.CheckProps(props);
let partitionKeyName: string;
let dynamoTableProps: dynamodb.TableProps;
// Set the default props for DynamoDB table
if (props.dynamoTableProps) {
dynamoTableProps = overrideProps(defaults.DefaultTableProps, props.dynamoTableProps);
partitionKeyName = dynamoTableProps.partitionKey.name;
} else {
partitionKeyName = defaults.DefaultTableProps.partitionKey.name;
dynamoTableProps = defaults.DefaultTableProps;
}
if (props.existingTableObj) {
partitionKeyName = getPartitionKeyNameFromTable(props.existingTableObj);
}
this.dynamoTable = defaults.buildDynamoDBTable(this, {
existingTableObj: props.existingTableObj,
dynamoTableProps,
});
// Setup the API Gateway
[this.apiGateway, this.apiGatewayCloudWatchRole, this.apiGatewayLogGroup] = defaults.GlobalRestApi(this,
props.apiGatewayProps, props.logGroupProps);
// Setup the API Gateway role
this.apiGatewayRole = new iam.Role(this, 'api-gateway-role', {
assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com')
});
// Setup the API Gateway Resource
const apiGatewayResource: api.Resource = this.apiGateway.root.addResource("{" + partitionKeyName + "}");
// Setup API Gateway Method
// Create
if (props.allowCreateOperation && props.allowCreateOperation === true && props.createRequestTemplate) {
const createRequestTemplate = props.createRequestTemplate.replace("${Table}", this.dynamoTable.tableName);
this.addActionToPolicy("dynamodb:PutItem");
defaults.addProxyMethodToApiResource({
service: "dynamodb",
action: "PutItem",
apiGatewayRole: this.apiGatewayRole,
apiMethod: "POST",
apiResource: this.apiGateway.root,
requestTemplate: createRequestTemplate
});
}
// Read
if (props.allowReadOperation === undefined || props.allowReadOperation === true) {
let readRequestTemplate;
if (props.readRequestTemplate) {
readRequestTemplate = props.readRequestTemplate;
} else {
readRequestTemplate =
`{ \
"TableName": "${this.dynamoTable.tableName}", \
"KeyConditionExpression": "${partitionKeyName} = :v1", \
"ExpressionAttributeValues": { \
":v1": { \
"S": "$input.params('${partitionKeyName}')" \
} \
} \
}`;
}
this.addActionToPolicy("dynamodb:Query");
defaults.addProxyMethodToApiResource({
service: "dynamodb",
action: "Query",
apiGatewayRole: this.apiGatewayRole,
apiMethod: "GET",
apiResource: apiGatewayResource,
requestTemplate: readRequestTemplate
});
}
// Update
if (props.allowUpdateOperation && props.allowUpdateOperation === true && props.updateRequestTemplate) {
const updateRequestTemplate = props.updateRequestTemplate.replace("${Table}", this.dynamoTable.tableName);
this.addActionToPolicy("dynamodb:UpdateItem");
defaults.addProxyMethodToApiResource({
service: "dynamodb",
action: "UpdateItem",
apiGatewayRole: this.apiGatewayRole,
apiMethod: "PUT",
apiResource: apiGatewayResource,
requestTemplate: updateRequestTemplate
});
}
// Delete
if (props.allowDeleteOperation && props.allowDeleteOperation === true) {
let deleteRequestTemplate;
if (props.deleteRequestTemplate) {
deleteRequestTemplate = props.deleteRequestTemplate;
} else {
deleteRequestTemplate =
`{ \
"TableName": "${this.dynamoTable.tableName}", \
"Key": { \
"${partitionKeyName}": { \
"S": "$input.params('${partitionKeyName}')" \
} \
}, \
"ReturnValues": "ALL_OLD" \
}`;
}
this.addActionToPolicy("dynamodb:DeleteItem");
defaults.addProxyMethodToApiResource({
service: "dynamodb",
action: "DeleteItem",
apiGatewayRole: this.apiGatewayRole,
apiMethod: "DELETE",
apiResource: apiGatewayResource,
requestTemplate: deleteRequestTemplate
});
}
}