lib/jsonapi_plug/plug/query_param.ex

defmodule JSONAPIPlug.Plug.QueryParam do
  @moduledoc """
  JSON:API Query Paramter parser plug

  Plug for parsing a JSON:API query parameter via a `JSONAPI.QueryParser` implementation.

  It takes an atom corresponding to the query parameter name to parse as its only option
  and stores the returned value in the `JSONAPIPlug` struct stored in `Plug.Conn` private
  assigns under the `jsonapi_plug` key.
  """

  alias JSONAPIPlug.API
  alias Plug.Conn

  @behaviour Plug

  @impl Plug
  def init(query_param), do: query_param

  @impl Plug
  def call(
        %Conn{private: %{jsonapi_plug: %JSONAPIPlug{} = jsonapi_plug}, query_params: query_params} =
          conn,
        query_param
      ) do
    parser = API.get_config(jsonapi_plug.api, [:query_parsers, query_param])
    value = Map.get(query_params, to_string(query_param))

    Conn.put_private(
      conn,
      :jsonapi_plug,
      struct(jsonapi_plug, [{query_param, parser.parse(jsonapi_plug, value)}])
    )
  end
end