背景
laciniaとはclojureでgraphqlを扱うためのライブラリの1つです。pedestalとはclojureのサーバープログラムの1つです。
lacinia-pedestalというライブラリがlaciniaの開発者によって提供されており、それを使うことでpedestal上でlaciniaを扱い易くなっています。
pedestalはinterceptorという概念で階層的な処理を扱っており、lacinia-pedestalでもlaciniaの前処理のinterceptorでcontextを追加する解説ページがあります。
Interceptors - com.walmartlabs/lacinia-pedestal
graphqlで渡された変数をpedestalのresponseでの参照に取り組んだところ、なかなか手間取ったので、把握した処理内容を記事に残します。
使ったもの
lacinia-pedestalで動くサーバー各バージョン
lacinia: 1.2.2
lacinia-pedestal: 1.2
pedestal.service: 0.6.3
pedestal.jetty: 0.6.3
mutationのloginの引数をinterceptorで取得
この記事では下記のlogin mutationの引数email passwordをinterceptorで取得します。lacinia pedestalのInterceptors説明ページのuser-info-interceptorで処理を行う想定です。
resources/schema.edn
{:objects
{:User
{:fields
{:id {:type (non-null Int)}
:email {:type (non-null String)}
:name {:type String}}}
:Mutation
{:fields
{:login
{:type :User
:args {:email {:type String}
:password {:type String}}}}}}}
graphql.edn
(def ^:private user-info-interceptor
(interceptor
{:name ::user-info
:enter
(fn [context]
(let [parsed-query (-> context
:request
:lacinia-app-context
:request
:parsed-lacinia-query)
args (->> parsed-query
:selections
(filter #(= :login (:field-name %)))
first
:arguments)]
(println :args args))
context)}))
概要を解説します。
contextを下記のように辿ると、laciniaの仕組みで解釈済みの情報を参照できます。
(let [parsed-query (-> context
:request
:lacinia-app-context
:request
:parsed-lacinia-query)])
解釈済みの情報には:selectionsキーに各要素がlistとして格納されているため、下記のようにfilterなどで必要な要素を選別し、:argumentsキーを参照するとqueryの引数を参照できます。
該当するselectionは:field-nameや:qualified-nameでキーを参照するのが良さそうでした。
(let [parsed-query (-> context
:request
:lacinia-app-context
:request
:parsed-lacinia-query)
args (->> parsed-query
:selections
(filter #(= :login (:field-name %)))
first
:arguments)]
(println :args args))
emailとしてsample@example.com、passwordとしてsample-passを代入してlogin mutationのrequestを送ると、期待通りに変数が表示されました。
:args {:email sample@example.com, :password sample-pass}
0 件のコメント :
コメントを投稿