2024年4月7日日曜日

lacinia-pedestalのinterceptorでgraphqlの引数を扱う


背景

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}

おわり

Interceptorの説明があるものの具体的にlaciniaの変数を扱う方法が分からず戸惑いましたが、requestに解釈済みの情報が含まれているためそれを参照すれば良いと分かりました。

参考

Interceptors - com.walmartlabs/lacinia-pedestal

0 件のコメント :