1

I'm using AWS appsync along with DynamoDB for my project, and I have the following schema:

type List {
  id: String!
  title: String!
  items: [String!]!       ## it's of String Set (SS) type on DynamoDB
}

type Item {
  id: String!
  name: String!
}

I want to get a specific list along with their items. the ids of these items are in the List object. e.g

e.g:

List
{
  id: "list0001",
  title: "My First list",
  items: ["item_001", "item_002"]
}

Item
{
  id: "item_001",
  name: "Item 001"
}

I want to have the following result when querying list0001

{
  id: "list0001",
  title: "My First list",
  items: [
    {
      id: "item_001",
      name: "Item 001"
    },
    {
      id: "item_002",
      name: "Item 002"
    }
  ]
}

I know that I can have the list id on Item type and then I use that id to fetch the items but I want to have it as described above by getting the items from the set of the string in List type. I want to know whether it's feasible. if so, what are the mapping templates for both queries.

N.B: I'm using serverless for my project with serverless-appsync-plugin plugin.

1 Answer 1

4

You could set this up with two tables, ListTable and ItemTable.
The ListTable would store the information about lists. An example entry would look like:

{
    "id": "list_0000",
    "title": "List0"
}

The ItemTable would be used to to relate Items to the List that they belong to. An example entry would look like:

{
    "id": "item_0001",
    "name": "item1",
    "listId": "list_0000"
}

You would need to modify your schema as follows:

type List {
  id: String!
  title: String!
  items: [Item!]!       ## A List of Items
}

type Item {
  id: String!
  name: String!
}

type Query {
  getList(listId: ID!): List
}

This setup would request setting up 2 resolvers, 1 on getList and 1 on the field items of the type List.

Schema Query List Type Schema

Your request mapping template for getList would look like:

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.listId),
    }
}

The response mapping template would be:

$util.toJson($ctx.result)

Your request mapping template for items of the type List would look like:

{
    "version" : "2018-05-29",
    "operation" : "Query",
    "query" : {
        "expression": "listId = :listId",
        "expressionValues" : {
            ":listId" : { "S": "$ctx.source.id" }
        }
    }
}

The response mapping template would be:

$util.toJson($ctx.result.items)

Running the query:

query {
  getList(listId: "list_0000") {
    id
    title
    items {
      id
      name
    }
  }
}

Would have a result like:

{
  "data": {
    "getList": {
      "id": "list_0000",
      "title": "List0",
      "items": [
        {
          "id": "item_0001",
          "name": "item1"
        }
      ]
    }
  }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.