J. Hesters
J. Hesters

Reputation: 14768

AppSync + DynamoDB: filter by owner

I'm trying to write a resolver template for a Scan that filters by owner.

Here is what I tried so far (this is my request template):

#set( $identityValue = $util.defaultIfNull($ctx.identity.claims.get("username"),
$util.defaultIfNull($ctx.identity.claims.get("cognito:username"), "___xamznone____")) )
#set( $ScanRequest = {
"version": "2017-02-28",
  "operation": "Scan",
  "filter": {
    "expression": "owner = :owner",
    "expressionValues": {
      ":owner": { "S": $identityValue }
    }
  }
} )
$util.toJson($ScanRequest)

This template fails, because owner is a reserved keyword. However, I can't figure out how to handle reserved words with AppSync.

How do you handle reserved words with AppSync? And is there a better way to write this Scan than my hardcoded one?

Upvotes: 2

Views: 1594

Answers (3)

StayPerfect
StayPerfect

Reputation: 21

You should use "expressionNames" to work around reserved keywords. Filter expression will look something like this then:

"filter": {
  "expression": "#owner = :owner",
  "expressionNames": {
    "#owner": "owner"
  },
  "expressionValues": {
    ":owner": { "S": $identityValue }
  }
}

Upvotes: 0

Gergo Bacskai
Gergo Bacskai

Reputation: 31

#set($ctx.args.filter.sub = { "eq" : $context.identity.claims.sub })

##if( $context.args.filter )
  #set( $ListRequest.filter = $util.parseJson("$util.transform.toDynamoDBFilterExpression($ctx.args.filter)") )
##end

Upvotes: 0

J. Hesters
J. Hesters

Reputation: 14768

So I solved it while hardcoding it:

#set( $identityValue = $util.defaultIfNull($ctx.identity.claims.get("username"),
$util.defaultIfNull($ctx.identity.claims.get("cognito:username"), "___xamznone____")) )
#set( $ScanRequest = {
"version": "2017-02-28",
  "operation": "Scan",
  "filter": {
    "expression": "#owner = :owner",
    "expressionValues": {
      ":owner": { "S": $identityValue }
    },
    "expressionNames": {
      "#owner": "owner"
    }
  }
} )
$util.toJson($ScanRequest)

If someone can come up with a not hardcoded answer like e.g. dynamically setting filter like this:

#if( $context.args.filter )
  #set( $ListRequest.filter = $util.parseJson("$util.transform.toDynamoDBFilterExpression($ctx.args.filter)") )
#end

While still filtering by owner, I will gladly accept that answer.

Upvotes: 3

Related Questions