View Source JetExt.Absinthe.OneOf.Middleware.InputModifier (jet_ext v0.2.5)

Modify the input object.

使用方法

defmodule MyApp.GraphQL.Schema.Admin do
  @moduledoc false

  use Absinthe.Schema.Notation
  use Absinthe.Relay.Schema.Notation, :modern

  alias Absinthe.Blueprint.Input
  alias JetExt.Absinthe.OneOf.Helpers

  input_object :user_input do
    # 首先启用 :one_of directive
    directive :one_of

    # 使用 Helpers 提供的 input_modifier
    private(
      :input_modifier,
      :with,
      {Helpers, :fold_key_to_field, [:__type__]}
    )

    field :plain_user, :plain_user_input
    field :admin, :admin_input
  end

  input_object :plain_user_input do
    field :username, non_null(:string)
  end

  input_object :admin_input do
    field :role, non_null(:string)
  end

  object :mutations do
    payload field(:create_user) do
      input do
        field :attributes, non_null(list_of(non_null(:user_input)))
      end

      output do
        field :attributes, non_null(list_of(non_null(:user)))
      end

      # 在 input 使用了 one_of 后,再启用本 middleware
      middleware JetExt.Absinthe.OneOf.Middleware.InputModifier

      resolve &create_user/2
    end
  end

  defp create_user(args, _resolution) do
    IO.inspect(args)
    # 前端会这样调用:
    # mutation {
    #   createUser(input: {
    #     plainUser: { username: "foo" }
    #   }) {
    #     id
    #   }
    # }
    #
    # 我们这里拿到的 args 是(注意 plain_user 是从驼峰转成了蛇底的):
    # %{
    #   username: "foo",
    #   "__type__": "plain_user"
    # }
  end
end