Kesa101
Kesa101

Reputation: 31

AppSync subscription authorization problem

Hi i am new in aws AppSync and GraphQl. I have a problem with subscription. I want to get notifiend in real time when new post is posted

Here is my graphql schema ``

type Mutation {
    addPost(
        id: ID!,
        author: String!,
        title: String,
        contennt: String,
        url: String
    ): Post!
    updatePost(
        id: ID!,
        author: String!,
        title: String,
        content: String,
        ups: Int!
    ): Post!
    deletePost(id: ID): Post!
}

type Post {
    id: ID!
    author: String!
    title: String!
    url: String
    content: String
    ups: Int!
}

type Query {
    allPost: [Post]
    getPost(id: ID!): Post
}

type Subscription {
    newPost: Post
        @aws_subscribe(mutations: ["addPost"])
}

schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}
``

Here is my Query for subs:

subscription NewPostSub{
  newPost{
    __typename
    title
    content
    author
    url
  }
}

Im getting error that provided key element doesnt match a schema, in dynamodb table pk is id and i generated mapping template. Thank you

Upvotes: 1

Views: 1229

Answers (1)

mparis
mparis

Reputation: 3683

Thanks for the info.

First, you do not need a resolver on your subscription field at all. The only reason you need to add a resolver to a subscription field is to do authorization checks based on the calling identity at connect time. You do not need to add a resolver to make subscriptions work. To fix it, remove the resolver off the subscription (Subscription.newPost) field.

To solve your use case and make it so you only subscribe to posts with a certain id, change your newPost subscription field to newPost(id: ID!). When you make the subscription query, provide an id and that subscription will only get pushed posts returned by the subscribed to mutation with that id. This is a feature baked into AppSync and the argument equality check happens automatically when you add the arguments to the subscription field.

Secondly as you pasted it in the comment, you currently have this request mapping template for Mutation.addPost:

{ 
  "version" : "2017-02-28", 
  "operation" : "PutItem", 
  "key" : { 
    $util.dynamodb.toDynamoDBJson($ctx.args.id) 
    "id": $util.dynamodb.toDynamoDBJson($util.autoId()), 
  }, 
  "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 
} 

There is a typo and it should be this:

{ 
  "version" : "2017-02-28", 
  "operation" : "PutItem", 
  "key" : { 
    "id": $util.dynamodb.toDynamoDBJson($util.autoId()), 
  }, 
  "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) 
} 

Upvotes: 2

Related Questions