Tạo đối tượng phức tạp

Các phần trước chúng ta đã tạo các đối tượng theo mô hình khoá - giá trị. Trong bước này chúng ta sẽ tạo các đối tượng phức tạp hơn với AWS AppSync DynamoDB như là sets, list và maps.

  1. Chọn tab Schema
  • Thêm thuộc tính tags cho bài đăng
  type Post {
  id: ID!
  author: String
  title: String
  content: String
  url: String
  ups: Int!
  downs: Int!
  version: Int!
  tags: [String!]
}
  • Thêm dòng dưới đây vào kiểu Query để thêm một truy vấn mới là allPostsByTag
  allPostsByTag(tag: String!, count: Int, nextToken: String): PaginatedPosts!
  • Thêm hai mutation mới - addTag và removeTag - vào kiểu Mutation
type Mutation {
  addTag(id: ID!, tag: String!): Post
  removeTag(id: ID!, tag: String!): Post
  .....
}
  • Ấn Save Schema

CreateGetPostByTag

  1. Tiếp theo trong ngăn Resolvers ở bên phải, tìm trường allPostsByTag thuộc kiểu Query, sau đó chọn Attach

CreateGetPostByTag

  1. Tại trang cấu hình Attach resolver:
  • Resolver type: Chọn Unit resolver
  • Resolver runtime: Chọn Velocity Template Language (VTL)
  • Data source name: Chọn PostDynamoDBTable
  • Ấn nút Create màu cam.
  1. Tại trang soạn thảo mã của Resolver vừa tạo:
  • Xóa mã mặc định và dán nội dung dưới đây vào phần Configure the request mapping template (Mẫu ánh xạ yêu cầu):
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "filter": {
      "expression": "contains (tags, :tag)",
        "expressionValues": {
          ":tag": $util.dynamodb.toDynamoDBJson($context.arguments.tag)
        }
    }
    #if( ${context.arguments.count} )
        ,"limit": $util.toJson($context.arguments.count)
    #end
    #if( ${context.arguments.nextToken} )
        ,"nextToken": $util.toJson($context.arguments.nextToken)
    #end
}
  • Kéo xuống dưới, xóa mã mặc định và dán nội dung dưới đây vào mục Configure the response mapping template (Mẫu ánh xạ phản hồi):
#if($context.error)
  $util.error($context.error.message, $context.error.type)
#end
{
    "posts": $utils.toJson($context.result.items)
    #if( ${context.result.nextToken} )
        ,"nextToken": $util.toJson($context.result.nextToken)
    #end
}
  • Ấn Save ở góc trang để lưu lại

CreateGetPostByTag

  1. Chọn tab Schema ở menu bên trái
  • Trong ngăn Resolvers ở bên phải, tìm trường addTag thuộc kiểu Mutation, sau đó chọn Attach

CreateGetPostByTag

  1. Tại trang cấu hình Attach resolver:
  • Resolver type: Chọn Unit resolver
  • Resolver runtime: Chọn Velocity Template Language (VTL)
  • Data source name: Chọn PostDynamoDBTable
  • Ấn nút Create màu cam.
  1. Tại trang soạn thảo mã của Resolver vừa tạo:
  • Xóa mã mặc định và dán nội dung dưới đây vào phần Configure the request mapping template (Mẫu ánh xạ yêu cầu):
{
    "version" : "2017-02-28",
    "operation" : "UpdateItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($context.arguments.id)
    },
    "update" : {
        "expression" : "ADD tags :tags, version :plusOne",
        "expressionValues" : {
            ":tags" : { "SS": [ $util.toJson($context.arguments.tag) ] },
            ":plusOne" : { "N" : 1 }
        }
    }
}
  • Kéo xuống dưới, xóa mã mặc định và dán nội dung dưới đây vào mục Configure the response mapping template (Mẫu ánh xạ phản hồi):
#if($context.error)
  $util.error($context.error.message, $context.error.type)
#end
$util.toJson($context.result)
  • Ấn Save ở góc trang để lưu lại

CreateGetPostByTag

  1. Chọn tab Schema ở menu bên trái
  • Trong ngăn Resolvers ở bên phải, tìm trường removeTag thuộc kiểu Mutation, sau đó chọn Attach

CreateGetPostByTag

  1. Tại trang cấu hình Attach resolver:
  • Resolver type: Chọn Unit resolver
  • Resolver runtime: Chọn Velocity Template Language (VTL)
  • Data source name: Chọn PostDynamoDBTable
  • Ấn nút Create màu cam.
  1. Tại trang soạn thảo mã của Resolver vừa tạo:
  • Xóa mã mặc định và dán nội dung dưới đây vào phần Configure the request mapping template (Mẫu ánh xạ yêu cầu):
{
    "version" : "2017-02-28",
    "operation" : "UpdateItem",
    "key" : {
        "id" : $util.dynamodb.toDynamoDBJson($context.arguments.id)
    },
    "update" : {
        "expression" : "DELETE tags :tags ADD version :plusOne",
        "expressionValues" : {
            ":tags" : { "SS": [ $util.toJson($context.arguments.tag) ] },
            ":plusOne" : { "N" : 1 }
        }
    }
}
  • Kéo xuống dưới, xóa mã mặc định và dán nội dung dưới đây vào mục Configure the response mapping template (Mẫu ánh xạ phản hồi):
#if($context.error)
  $util.error($context.error.message, $context.error.type)
#end
$util.toJson($context.result)
  • Ấn Save ở góc trang để lưu lại

CreateGetPostByTag

  1. Chọn tab Queries ở menu bên trái
  • Xóa mã mặc định, dán đoạn lệnh dưới đây vào phần Queries
query allPostsByAuthor {
  allPostsByAuthor(
    author: "Nadia"
  ) {
    posts {
      id
      title
    }
    nextToken
  }
}
  • Sau đó ấn nút Run (biểu tượng Play màu cam)

CreateGetPostByTag

  1. Xóa mã cũ, dán đoạn lệnh sau để thêm tag cho bài đăng vừa lấy được, sau đó ấn nút Run (biểu tượng Play màu cam)
mutation addTag {
  addTag(id:"10" tag: "dog") {
    id
    title
    tags
  }
}

CreateGetPostByTag

Kết quả trả về đối tượng đã được thêm danh sách tags với giá trị là “dog”

  1. Đổi giá trị của tham số tag thành puppy rồi ấn nút Run (biểu tượng Play màu cam)

CreateGetPostByTag

Kết quả trả về đối tượng đã được thêm “puppy” vào danh sách tags

  1. Xóa mã cũ, dán đoạn lệnh sau để xoá một tag, sau đó ấn nút Run (biểu tượng Play màu cam)
mutation removeTag {
  removeTag(id:"10" tag: "puppy") {
    id
    title
    tags
  }
}

CreateGetPostByTag

  1. Xóa mã cũ, dán lệnh sau để lấy ra toàn bộ bài đăng có tag là dog, sau đó ấn nút Run (biểu tượng Play màu cam)
query allPostsByTag {
  allPostsByTag(tag: "dog") {
    posts {
      id
      title
      tags
    }
    nextToken
  }
}

CreateGetPostByTag

  1. Tiếp theo chúng ta thêm Comments vào bài đăng. Điều này sẽ được mô hình hóa dưới dạng danh sách các đối tượng map trên Post trong DynamoDB.
  2. Chọn tab Schema ở menu bên trái
  • Thêm một kiểu Comment mới
type Comment {
    author: String!
    comment: String!
}
  • Thêm thuộc tính comments cho kiểu Post
type Post {
  id: ID!
  author: String
  title: String
  content: String
  url: String
  ups: Int!
  downs: Int!
  version: Int!
  tags: [String!]
  comments: [Comment!]
}
  • Thêm dòng sau vào kiểu Mutation để thêm một mutation mới addComment
  addComment(id: ID!, author: String!, comment: String!): Post
  • Ấn Save Schema, sau đó ấn Attach ở phần Resolvers của mutation addComment

CreateGetPostByTag CreateGetPostByTag

  1. Tại trang cấu hình Attach resolver:
  • Resolver type: Chọn Unit resolver
  • Resolver runtime: Chọn Velocity Template Language (VTL)
  • Data source name: Chọn PostDynamoDBTable
  • Ấn nút Create màu cam.
  1. Tại trang soạn thảo mã của Resolver vừa tạo:
  • Xóa mã mặc định và dán nội dung dưới đây vào phần Configure the request mapping template (Mẫu ánh xạ yêu cầu):
{
  "version" : "2017-02-28",
  "operation" : "UpdateItem",
  "key" : {
    "id" : $util.dynamodb.toDynamoDBJson($context.arguments.id)
  },
  "update" : {
    "expression" : "SET comments = list_append(if_not_exists(comments, :emptyList), :newComment) ADD version :plusOne",
    "expressionValues" : {
      ":emptyList": { "L" : [] },
      ":newComment" : { "L" : [
        { "M": {
          "author": $util.dynamodb.toDynamoDBJson($context.arguments.author),
          "comment": $util.dynamodb.toDynamoDBJson($context.arguments.comment)
          }
        }
      ] },
      ":plusOne" : $util.dynamodb.toDynamoDBJson(1)
    }
  }
}
  • Kéo xuống dưới, xóa mã mặc định và dán nội dung dưới đây vào mục Configure the response mapping template (Mẫu ánh xạ phản hồi):
#if($context.error)
  $util.error($context.error.message, $context.error.type)
#end
$util.toJson($context.result)
  • Sau đó ấn Save ở góc trang để lưu lại

CreateGetPostByTag

  1. Chọn tab Queries ở menu bên trái
  • Xóa mã mặc định, dán đoạn lệnh dưới đây vào phần Queries để thử nghiệm tạo một bình luận:
mutation testAddComment {
  addComment(id: "10", author: "Người dùng mới", comment: "Bài viết rất hữu ích!") {
    id
    title
    comments {
      author
      comment
    }
  }
}
  • Sau đó ấn nút Run (biểu tượng Play màu cam)

CreateGetPostByTag