このエントリはMagento Advent Calendar 2019の19日目です。

今回はGraphQLを使ってデータ更新をするための仕組み「Mutation」について解説します。

Mutationとは

GraphQLの仕様上、データを取得するための形式は「Query」と定義されています。これに対し、データを更新するための形式は「Mutation」と定義されています。
どちらも同じエンドポイントから利用でき、HTTPメソッドも同じものが使えます。

QueryとMutationの違い

Queryの例

前回の例では、

{ 
query: `{ 
    products (
        filter: {
          name: { like: "%キーワード%"}
        }
        pageSize: 18
    ) {
        total_count
        items {
            id
            name
            url_path
            thumbnail {
                url
            }
            price {
                regularPrice {
                    amount {
                        value
                        currency
                    }
                }
            }
        }
    }
}`
}

というようなデータをMagento側に送信しました。このJSONデータの最上位要素に書いてある「query」をもってMagento側は「これは問い合わせリクエストなのだな」と解釈をするわけです。

Mutationの例

DevDocsでは、以下のような例があげられています。

{
mutation {
  addSimpleProductsToCart(
    input: {
      cart_id: "カートID"
      cart_items: [
        {
          data: {
            quantity: 1
            sku: "追加する商品のSKU"
          }
        }
      ]
    }
  ) {
    cart {
      items {
        id
        product {
          name
          sku
        }
        quantity
      }
    }
  }
}
}

この例ではJSONデータの最上位要素が「mutation」になっていて、次の要素に何をしたいかが書かれています。
addSimpleProductsToCartという名称の通り、シンプル商品を指定したIDのカートに追加しているわけです。
このように、Mutationを使えばGraphQLベースでデータの更新ができる仕組みがMagentoには備わっています。

Mutationを使う際の注意点

Mutationはデータの更新を行うための仕組みです。
当然ですが、「誰の」データを更新するのかをはっきりさせておく必要があります。
REST APIの認証で少し触れましたが、GraphQLでも必要に応じて認証を使うことができます。

GraphQLの場合、セッション認証を用いて「閲覧している本人」の情報を操作することはできます。
あるいはgenerateCustomerToken mutationを用いてトークンを取得し、それをHTTPヘッダーに含めても構いません。
(利便性からするとセッション認証のほうが実装は楽でしょう)

次回はMagentoのGraphQLスキーマを独自に拡張し、標準で使えない項目を使えるようにする方法をご紹介します。