aws / aws/aws-appsync-community

REST result does not match GraphQL result

Open
#173 0 comments 2 reactions 0 assignees View on GitHub
question
Dominant language
HTML
Stars
507
Forks
37
PR merge metrics
No merged PRs in 30d

Description

When executing a query using GraphQL I get different result to when using the same data to query via REST.

Here is my GraphQL query:
```
query MyQuery {
formsByDateClubState(clubId: "1", formStateCreatedAt: {beginsWith: {createdAt: "2", formState: REJECTED}}) {
nextToken
items {
createdAt
formState
id
}
}
}
```
which returns this:
```
{
"data": {
"formsByDateClubState": {
"nextToken": null,
"items": []
}
}
}
```
This is the variables part of my REST request:
```
"variables": {
"clubId": "1",
"createdAtFormState": {
"beginsWith": {
"formState": "REJECTED",
"createdAt": "2"
}
},
"sortDirection": "DESC"
}
```
which returns this:
```
{
"data": {
"formsByDateClubState": {
"items": [
{
"id": "11682759-8dcb-4dda-8329-d8689186a65a",
"createdAt": "2021-07-16T18:32:07.754+02:00",
"formState": "CREATED"
}
],
"nextToken": null
}
}
}
```
Do you have any idea why the results differ and why the REST query returns results it shouldn't?

This is the request resolver:
```
## [Start] Set query expression for @key **
#set( $modelQueryExpression = {} )
## [Start] Validate key arguments. **
#if( !$util.isNull($ctx.args.formStateCreatedAt) && $util.isNullOrBlank($ctx.args.clubId) )
$util.error("When providing argument 'formStateCreatedAt' you must also provide 'clubId'.", "InvalidArgumentsError")
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) )
#set( $sortKeyArgumentOperations = $ctx.args.formStateCreatedAt.keySet() )
#if( $sortKeyArgumentOperations.size() > 1 )
$util.error("Argument formStateCreatedAt must specify at most one key condition operation.", "InvalidArgumentsError")
#end
#foreach( $operation in $sortKeyArgumentOperations )
#if( $operation == "between" )
#if( $ctx.args.formStateCreatedAt.between.size() != 2 )
$util.error("Argument 'formStateCreatedAt.between' expects exactly two elements.", "InvalidArgumentsError")
#end
#if( !$util.isNullOrBlank($ctx.args.formStateCreatedAt.between[0].createdAt) && $util.isNullOrBlank($ctx.args.formStateCreatedAt.between[0].formState) )
$util.error("When providing argument 'formStateCreatedAt.between[0].createdAt' you must also provide 'formStateCreatedAt.between[0].formState'.", "InvalidArgumentsError")
#end
#if( !$util.isNullOrBlank($ctx.args.formStateCreatedAt.between[1].createdAt) && $util.isNullOrBlank($ctx.args.formStateCreatedAt.between[1].formState) )
$util.error("When providing argument 'formStateCreatedAt.between[1].createdAt' you must also provide 'formStateCreatedAt.between[1].formState'.", "InvalidArgumentsError")
#end
#else
#if( !$util.isNullOrBlank($ctx.args.formStateCreatedAt.get("$operation").createdAt) && $util.isNullOrBlank($ctx.args.formStateCreatedAt.get("$operation").formState) )
$util.error("When providing argument 'formStateCreatedAt.$operation.createdAt' you must also provide 'formStateCreatedAt.$operation.formState'.", "InvalidArgumentsError")
#end
#end
#end
#end
## [End] Validate key arguments. **
#if( !$util.isNull($ctx.args.clubId) )
#set( $modelQueryExpression.expression = "#clubId = :clubId" )
#set( $modelQueryExpression.expressionNames = {
"#clubId": "clubId"
} )
#set( $modelQueryExpression.expressionValues = {
":clubId": {
"S": "$ctx.args.clubId"
}
} )
#end
## [Start] Applying Key Condition **
#set( $sortKeyValue = "" )
#set( $sortKeyValue2 = "" )
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.beginsWith) )
#if( !$util.isNull($ctx.args.formStateCreatedAt.beginsWith.formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.beginsWith.formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.beginsWith.createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.beginsWith.createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND begins_with(#sortKey, :sortKey)" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey", { "S": "$sortKeyValue" }))
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.between) )
#if( $ctx.args.formStateCreatedAt.between.size() != 2 )
$util.error("Argument formStateCreatedAt.between expects exactly 2 elements.")
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt.between[0].formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.between[0].formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.between[0].createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.between[0].createdAt" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.between[1].formState) ) #set( $sortKeyValue2 = "$ctx.args.formStateCreatedAt.between[1].formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.between[1].createdAt) ) #set( $sortKeyValue2 = "$sortKeyValue2#$ctx.args.formStateCreatedAt.between[1].createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND #sortKey BETWEEN :sortKey0 AND :sortKey1" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey0", { "S": "$sortKeyValue" }))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey1", { "S": "$sortKeyValue2" }))
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.eq) )
#if( !$util.isNull($ctx.args.formStateCreatedAt.eq.formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.eq.formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.eq.createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.eq.createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND #sortKey = :sortKey" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey", { "S": "$sortKeyValue" }))
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.lt) )
#if( !$util.isNull($ctx.args.formStateCreatedAt.lt.formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.lt.formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.lt.createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.lt.createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND #sortKey < :sortKey" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey", { "S": "$sortKeyValue" }))
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.le) )
#if( !$util.isNull($ctx.args.formStateCreatedAt.le.formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.le.formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.le.createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.le.createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND #sortKey <= :sortKey" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey", { "S": "$sortKeyValue" }))
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.gt) )
#if( !$util.isNull($ctx.args.formStateCreatedAt.gt.formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.gt.formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.gt.createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.gt.createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND #sortKey > :sortKey" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey", { "S": "$sortKeyValue" }))
#end
#if( !$util.isNull($ctx.args.formStateCreatedAt) && !$util.isNull($ctx.args.formStateCreatedAt.ge) )
#if( !$util.isNull($ctx.args.formStateCreatedAt.ge.formState) ) #set( $sortKeyValue = "$ctx.args.formStateCreatedAt.ge.formState" ) #end
#if( !$util.isNull($ctx.args.formStateCreatedAt.ge.createdAt) ) #set( $sortKeyValue = "$sortKeyValue#$ctx.args.formStateCreatedAt.ge.createdAt" ) #end
#set( $modelQueryExpression.expression = "$modelQueryExpression.expression AND #sortKey >= :sortKey" )
$util.qr($modelQueryExpression.expressionNames.put("#sortKey", "formState#createdAt"))
$util.qr($modelQueryExpression.expressionValues.put(":sortKey", { "S": "$sortKeyValue" }))
#end

## [End] Applying Key Condition **
## [End] Set query expression for @key **
#set( $limit = $util.defaultIfNull($context.args.limit, 100) )
#set( $QueryRequest = {
"version": "2018-05-29",
"operation": "Query",
"limit": $limit,
"query": $modelQueryExpression,
"index": "formsByDateClubState"
} )
#if( !$util.isNull($ctx.args.sortDirection)
&& $ctx.args.sortDirection == "DESC" )
#set( $QueryRequest.scanIndexForward = false )
#else
#set( $QueryRequest.scanIndexForward = true )
#end
#if( $context.args.nextToken ) #set( $QueryRequest.nextToken = $context.args.nextToken ) #end
#if( $context.args.filter ) #set( $QueryRequest.filter = $util.parseJson("$util.transform.toDynamoDBFilterExpression($ctx.args.filter)") ) #end
$util.toJson($QueryRequest)
```
and the response resolver:
```
## [Start] Determine request authentication mode **
#if( $util.isNullOrEmpty($authMode) && !$util.isNull($ctx.identity) && !$util.isNull($ctx.identity.sub) && !$util.isNull($ctx.identity.issuer) && !$util.isNull($ctx.identity.username) && !$util.isNull($ctx.identity.claims) && !$util.isNull($ctx.identity.sourceIp) && !$util.isNull($ctx.identity.defaultAuthStrategy) )
#set( $authMode = "userPools" )
#end
## [End] Determine request authentication mode **
## [Start] Check authMode and execute owner/group checks **
#if( $authMode == "userPools" )
## [Start] Static Group Authorization Checks **
#set($isStaticGroupAuthorized = $util.defaultIfNull(
$isStaticGroupAuthorized, false))
## Authorization rule: { allow: groups, groups: ["Admin"], groupClaim: "cognito:groups" } **
#set( $userGroups = $util.defaultIfNull($ctx.identity.claims.get("cognito:groups"), []) )
#set( $allowedGroups = ["Admin"] )
#foreach( $userGroup in $userGroups )
#if( $allowedGroups.contains($userGroup) )
#set( $isStaticGroupAuthorized = true )
#break
#end
#end
## Authorization rule: { allow: groups, groups: ["Manager"], groupClaim: "cognito:groups" } **
#set( $userGroups = $util.defaultIfNull($ctx.identity.claims.get("cognito:groups"), []) )
#set( $allowedGroups = ["Manager"] )
#foreach( $userGroup in $userGroups )
#if( $allowedGroups.contains($userGroup) )
#set( $isStaticGroupAuthorized = true )
#break
#end
#end
## [End] Static Group Authorization Checks **

## [Start] If not static group authorized, filter items **
#if( !$isStaticGroupAuthorized )
#set( $items = [] )
#foreach( $item in $ctx.result.items )
## No Dynamic Group Authorization Rules **

## [Start] Owner Authorization Checks **
#set( $isLocalOwnerAuthorized = false )
## Authorization rule: { allow: owner, ownerField: "owner", identityClaim: "cognito:username" } **
#set( $allowedOwners0 = $util.defaultIfNull($item.owner, []) )
#set( $identityValue = $util.defaultIfNull($ctx.identity.claims.get("username"), $util.defaultIfNull($ctx.identity.claims.get("cognito:username"), "___xamznone____")) )
#if( $util.isList($allowedOwners0) )
#foreach( $allowedOwner in $allowedOwners0 )
#if( $allowedOwner == $identityValue )
#set( $isLocalOwnerAuthorized = true )
#end
#end
#end
#if( $util.isString($allowedOwners0) )
#if( $allowedOwners0 == $identityValue )
#set( $isLocalOwnerAuthorized = true )
#end
#end
## [End] Owner Authorization Checks **

#if( ($isLocalDynamicGroupAuthorized == true || $isLocalOwnerAuthorized == true) )
$util.qr($items.add($item))
#end
#end
#set( $ctx.result.items = $items )
#end
## [End] If not static group authorized, filter items **
#end
## [End] Check authMode and execute owner/group checks **

#if( $ctx.error )
$util.error($ctx.error.message, $ctx.error.type)
#end
$util.toJson($ctx.result)
```

Contributor guide

Open the contributing guide

Research direction

Start with the request and response resolvers shown in the issue, comparing the GraphQL arguments with the REST variables and the generated DynamoDB query. Verify how the formsByDateClubState index query handles the sort key and what the response resolver returns; done means identifying the cause of the differing results and documenting or confirming the required correction.

Written by the indexing model from the issue text.

Assessment

Tech stack
aws, graphql
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.