abdoo_salem
abdoo_salem

Reputation: 332

Can I query objects based on SS in nested types in AppSync

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.

Upvotes: 1

Views: 1155

Answers (1)

T Caines
T Caines

Reputation: 253

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"
        }
      ]
    }
  }
}

Upvotes: 4

Related Questions