schema.graphqlで使えるディレクティブについて

aws amplifyでgraphQLを初めて触ったときのメモ

schema.graphqlで利用可能な3つのディレクティブについて。

# 参考

https://aws-amplify.github.io/docs/cli-toolchain/graphql

# @model

@modelをつける事で、デフォルトで以下のリソースが自動作成される。

  • オンデマンドキャパシティーモードが有効化されたDynamoDBテーブル
  • 上記のテーブルにアクセスできるAWS AppSync DataSource
  • AWS AppSync DataSource用のIAMロール
  • 8つのリゾルバ(create, update, delete, get, list, onCreate, onUpdate, onDelete)。ただしqueries, mutations,subscriptionsなどの引数を@modelにつける必要あり。
  • create, update, delete操作をする際に用いる入力オブジェクト
  • レコードや項目を絞り込むためのフィルターオブジェクト
type Order @model {
    email: String!
    createdAt: String!
    orderId: ID!
}

# @key

@keyをつけることで、パーティションキーとソートキーを指定できる。 (=絞り込み条件やソート条件の指定をするために必要。)

例: emailで絞り込み、createdAtでソートするための設定。

# Get orders by customer by createdAt.
type Order @model @key(fields: ["email", "createdAt"]) {
    email: String!
    createdAt: String!
    orderId: ID!
}

# @auth

何もせずともAPI全体にAPI認証は適用されているが、 typeやfieldごとに詳細な認証設定をしたいときは@authを利用する。

# オーナー認証

引数にrules: [{allow: owner}]を指定すると、取得できるデータを所有している物のみに制限できる。 例えば、ログインユーザに紐づく投稿だけを取得できるようにしたいときなど。

type Post @model @auth(rules: [{allow: owner}]) {
  id: ID!
  title: String!
}

@auth(rules: [{allow: owner}])は、以下の記述の省略記法であり、 「CRUD操作全て」において、「ownerフィールドがログインユーザIDと同じ」データしか取得できなくなる。

@auth(
    rules: [
      {
	      allow: owner, ownerField: "owner", 
	      operations: [create, update, delete, read]
      },
    ]
)