AWS AppSync and kintone REST API GraphQL Mutation Sample

AWS AppSync と kintone REST API を接続し、kintoneにレコードを登録するサンプルです。

# 環境

* mac
* AWS AppSync
* kintone

# 対象

* AWS AppSync から REST API データソースに接続する方法を知りたい方
* AppSyncコンソールからのスキーマ・リゾルバーの基本的な作成方法を知りたい方
* kintone REST API と AppSync を接続する方法を知りたい方

# 前提条件

* AWSのアカウントがあること
* AppSyncの基本的な操作が分かること
* kintone REST API の基本的な知識があること

# kintone データベース
AppSyncから接続する対象の kintoneアプリの設定は下記の通り


![スクリーンショット 2021-07-21 7.35.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/c7bdefff-e093-0d25-b026-c535582d8751.png)


* owner 文字列(1行)
* name 文字列(1行)
* description  文字列(1行)
* id レコード番号
* createdAt 作成日時
* updatedAt 更新日時

※フィールドコードとフィールド名は同じです。


# AppSync API の作成

※[拙稿をご覧ください。](https://qiita.com/sy250f/items/d52b5135062c58bf221c#appsync-api-%E3%81%AE%E4%BD%9C%E6%88%90)


## サンプルスキーマ

```graphql
type DateTime {
	type: FiledType
	value: AWSDateTime
}

type Description {
	type: FiledType
	value: String
}

enum FiledType {
	RECORD_NUMBER
	SINGLE_LINE_TEXT
	CREATED_TIME
	UPDATED_TIME
}

type Mutation {
	addNote(record: PostNote): PostRecord
}

type Name {
	type: FiledType
	value: String!
}

type Note {
	id: RecordNumber
	owner: Owner
	name: Name
	description: Description
	createdAt: DateTime
	updatedAt: DateTime
}

type Owner {
	type: FiledType
	value: String
}

input PostDescription {
	value: String
}

input PostName {
	value: String
}

input PostNote {
	owner: PostOwner
	name: PostName!
	description: PostDescription
}

input PostOwner {
	value: String
}

type PostRecord {
	id: String
	revision: String
}

type Query {
	singleNote(id: ID!): Record
	listNotes: Records
	listNotesForUser(owner: String): Records
}

type Record {
	record: Note
}

type RecordNumber {
	type: FiledType
	value: ID!
}

type Records {
	records: [Note]
}

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

# データソース作成
※[拙稿をご覧ください。](https://qiita.com/sy250f/items/d52b5135062c58bf221c#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E4%BD%9C%E6%88%90)

# マッピングテンプレートの作成
GraphQLクエリをHTTPの形式に変換するマッピングテンプレートを作成します。

## addNote リクエストマッピングテンプレート

* `<App ID>`・・・kintoneアプリID
* `<API Token>`・・・kintoneアプリのAPIトークン

```
{
  "version": "2018-05-29",
  "method": "POST",
  "resourcePath": "/k/v1/record.json",
  "params":{
      "headers": {
          "X-Cybozu-API-Token": "<App Token>",
          "Content-Type": "application/json"
      },
      "body": {
          "app": "<App ID>",
          "record": {
            "name": {"value": "$!{context.arguments.record.name.value}"},
            "owner": {"value": "$!{context.arguments.record.owner.value}"},
            "description": {"value": "$!{context.arguments.record.description.value}"}
          }
      }
  }
}
```

# GraphQL クエリ作成
GraphQL クエリを作成してテストします。

## クエリ

```graphql
mutation MyMutation {
  addNote(record: {name: {value: "sample001"}, owner: {value: "user1"}, description: {value: "This is sample001"}}) {
    id
    revision
  }
}
```

## 実行結果

```
{
  "data": {
    "addNote": {
      "id": "38",
      "revision": "1"
    }
  }
}
```


# 参考

https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/quickstart-write-queries.html

https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/configuring-resolvers.html

https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/resolver-mapping-template-reference.html