AWSで出てくるGraphQL(グラフ・キューエル)とは何か?
参考URL
https://employment.en-japan.com/engineerhub/entry/2018/12/26/103000
facebookが開発したWebAPIのための規格・仕様(オープンソース)
1, クエリ言語(SQLのSelectなど)
2, スキーマ言語(SQLのCreate TableやJSONなど)
から成り立っている。
イメージ的には、SQL+API=GraphQL
AWS AppSync(GraphQL APIサーバ。データはDynamoDB)にスキーマを定義すると、
1, クエリ言語
query(データ取得, select文)
mutation(データ更新, update文だけではなくinsert/deleteもコレ!)
subscription(サーバからのPUSH通知)
の3つから成る。insert/deleteもmutationなのは意外!
2, スキーマ言語(GraphQL APIの仕様)
リクエストされたクエリに対して、どのようなレスポンス(データ)を返すかを定義
type文でレスポンス名を定義、その中で返すデータを定義する。
type Query{
currentUser: User!
}
type User {
id: ID!
name: String!
}
query文でクエリ名を定義、その中で返すデータを定義する。
query GetCurrentUser {
currentUser{
# select文のようにここで指定したフィールドしか返ってこない。
id
name
}
}
このようなレスポンスが返ってくる。クエリとレスポンスが、ほぼ同じなのがgraphQLの特徴
{
“data”: {
“currentUser”: {
“id”: “dXNlci80Mgo=”,
“name”: “foo”,
}
}
}
npm install –save @material-ui/core@4.9.7 @material-ui/icons@4.9.1 moment@2.24.0 react-router@5.1.2 react-router-dom@5.1.2
npm install –save @material-ui/core @material-ui/icons moment react-router react-router-dom
type Post
# @modelでDynamoDBテーブル・Query/Mutation/Subscriptionを自動生成してくれる。
@model (subscriptions: { level: public })
# @authで認証付与。rulesで認証の定義
@auth(rules: [
# 作成者のみread,createを許可
{allow: owner, ownerField:”owner”, provider: userPools, operations:[read, create]}
# cognitoのuserPoolsで許可されたユーザは、readのみ許可
{allow: private, provider: userPools, operations:[read]}
])
# 検索用のキーを定義。nameがインデックス名、fieldが取得するフィールド名を指定、queryFieldはGraphQLのクエリ名(関数名)
@key(name: “SortByTimestamp”, fields:[“type”, “timestamp”], queryField: “listPostsSortedByTimestamp”)
@key(name: “BySpecificOwner”, fields:[“owner”, “timestamp”], queryField: “listPostsBySpecificOwner”)
# ここからフィールド定義
{
# フィールド名: データ型で定義。最後の!は必須を意味する。
type: String! # always set to ‘post’. used in the SortByTimestamp GSI
id: ID
content: String!
owner: String
timestamp: AWSTimestamp!
}