in appsync-dynamodb-singletable-cdk/cdk/lib/appsync-cdk-stack.ts [7:106]
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// DynamoDB Table
const DDBTable = new Table(this, 'MDDBTable', {
partitionKey: {name:'PK', type: AttributeType.STRING},
sortKey: {name: "SK", type: AttributeType.STRING},
billingMode: BillingMode.PAY_PER_REQUEST
});
// AppSync GraphQL API
const AppSyncApi = new GraphqlApi(this, 'AppSyncApi', {
name: 'SingleTableApiCDK',
schema: Schema.fromAsset(join(__dirname, 'schema.graphql'))
})
// AppSync Data Source -> DynamoDB table
const DDBDataSource = AppSyncApi.addDynamoDbDataSource("DDBDataSource", DDBTable)
// Custom resolver
DDBDataSource.createResolver({
typeName: 'Query',
fieldName: 'getParentWithChildren',
requestMappingTemplate: MappingTemplate.fromString(`
{
"version" : "2017-02-28",
"operation" : "Query",
"query" : {
"expression": "PK = :pk",
"expressionValues" : {
":pk" : $util.dynamodb.toDynamoDBJson($ctx.args.PK)
}
}
}
`),
responseMappingTemplate: MappingTemplate.fromString(`
#set($children = [])
#foreach($item in $ctx.result.items)
#if($item['type'] == "parent")
#set($PK = $item['PK'])
#set($SK = $item['SK'])
#set($data = $item['data'])
#set($type = $item['type'])
#end
#if($item['type'] == "child")
$util.qr($children.add($item))
#end
#end
{
"PK": "\${PK}",
"SK": "\${SK}",
"children": $utils.toJson($children),
"data": "\${data}",
"type": "\${type}"
}
`)
})
// Mutation resolver
DDBDataSource.createResolver({
typeName: "Mutation",
fieldName: "createParentItem",
requestMappingTemplate: MappingTemplate.fromString(`
{
"version": "2018-05-29",
"operation": "PutItem",
"key": {
"PK": $util.dynamodb.toDynamoDBJson($ctx.args.PK),
"SK": $util.dynamodb.toDynamoDBJson($ctx.args.SK)
},
"attributeValues": {
"data": $util.dynamodb.toDynamoDBJson($ctx.args.data),
"type": $util.dynamodb.toDynamoDBJson($ctx.args.type)
}
}
`),
responseMappingTemplate: MappingTemplate.fromString("$util.toJson($ctx.result)")
})
// Mutation resolver
DDBDataSource.createResolver({
typeName: "Mutation",
fieldName: "createChildItem",
requestMappingTemplate: MappingTemplate.fromString(`
{
"version": "2018-05-29",
"operation": "PutItem",
"key": {
"PK": $util.dynamodb.toDynamoDBJson($ctx.args.PK),
"SK": $util.dynamodb.toDynamoDBJson($ctx.args.SK)
},
"attributeValues": {
"data": $util.dynamodb.toDynamoDBJson($ctx.args.data),
"type": $util.dynamodb.toDynamoDBJson($ctx.args.type)
}
}
`),
responseMappingTemplate: MappingTemplate.fromString("$util.toJson($ctx.result)")
})
}