View Source JetExt.Absinthe.OneOf.Middleware.InputModifier (jet_ext v0.2.2)
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