constructor()

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
      });
    }
  }