Skip to content
This repository has been archived by the owner on Jul 25, 2024. It is now read-only.

Mutation with map argument causes KeyError #99

Open
dianjin opened this issue Jul 31, 2016 · 0 comments
Open

Mutation with map argument causes KeyError #99

dianjin opened this issue Jul 31, 2016 · 0 comments

Comments

@dianjin
Copy link

dianjin commented Jul 31, 2016

Hey there, I came across this problem while attempting to issue this mutation via GraphiQL:

mutation M {
  upsertSpread(input: { user_id: 1 }) {
    id
    description
  }
}

My mutation function:

  def mutation do
    %ObjectType{
      name: "mutation",
      fields: %{
        upsertSpread: %{
          type: Spread,
          args: %{
            input: %{ type: SpreadInput }
          },
          resolve: fn(_, args, _) -> TeamBuilder.Data.upsert_spread(args) end
        }
      }
    }
  end

The SpreadInput type:

  defmodule SpreadInput do
    def type do
      %ObjectType{
        name: "SpreadInput",
        fields: %{
          user_id: %{type: %Int{}, description: "user id"}
        }
      }
    end
  end

Stack trace when I issue the mutation in GraphiQL:

Request: POST /graphql/user?query=mutation%20M%20%7B%0A%20%20upsertSpread(input%3A%20%7B%20user_id%3A%201%20%7D)%20%7B%0A%20%20%20%20id%0A%20%20%20%20description%0A%20%20%7D%0A%7D%0A&variables=%7B%0A%20%20%22data%22%3A%20%7B%0A%20%20%20%20%22user_id%22%3A%201%0A%20%20%7D%0A%7D
** (exit) an exception was raised:
    ** (KeyError) key :value not found in: %{fields: [%{kind: :ObjectField, loc: %{start: 0}, name: %{kind: :Name, loc: %{start: 0}, value: "user_id"}, value: %{kind: :IntValue, loc: %{start: 0}, value: 1}}], kind: :ObjectValue, loc: %{start: 0}}
        (graphql) lib/graphql/type/definition.ex:12: GraphQL.Types.Any.parse_literal/2
        (graphql) lib/graphql/execution/executor.ex:255: anonymous fn/4 in GraphQL.Execution.Executor.argument_values/3
        (stdlib) lists.erl:1263: :lists.foldl/3
        (graphql) lib/graphql/execution/executor.ex:138: GraphQL.Execution.Executor.resolve_field/4
        (graphql) lib/graphql/execution/executor.ex:117: anonymous fn/4 in GraphQL.Execution.Executor.execute_fields/4
        (stdlib) lists.erl:1263: :lists.foldl/3
        (graphql) lib/graphql/execution/executor.ex:45: GraphQL.Execution.Executor.execute_operation/3
        (graphql) lib/graphql.ex:106: GraphQL.execute_with_optional_validation/3
        (plug_graphql) lib/graphql/plug/endpoint.ex:85: GraphQL.Plug.Endpoint.execute/2
        (plug_graphql) lib/graphql/plug.ex:54: GraphQL.Plug.call/2
        (hello_graphql) lib/phoenix/router.ex:261: HelloGraphQL.Router.dispatch/2
        (hello_graphql) web/router.ex:1: HelloGraphQL.Router.do_call/2
        (hello_graphql) lib/hello_graphql/endpoint.ex:1: HelloGraphQL.Endpoint.phoenix_pipeline/1
        (hello_graphql) lib/plug/debugger.ex:93: HelloGraphQL.Endpoint."call (overridable 3)"/2
        (hello_graphql) lib/hello_graphql/endpoint.ex:1: HelloGraphQL.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

Everything worked when I issued a mutation with a built-in type like Int or String. Is this the right way to issue a mutation that takes a custom type as an argument? I was under the impression that custom types for mutations should be created with %InputObjectType{} but I got the following error when trying to do that:

== Compilation error on file web/graphql/user_schema.ex ==
** (CompileError) web/graphql/user_schema.ex:8: GraphQL.Type.InputObjectType.__struct__/1 is undefined, cannot expand struct GraphQL.Type.InputObjectType
    web/graphql/user_schema.ex:6: (module)
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (stdlib) erl_eval.erl:122: :erl_eval.exprs/5

Thank you!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant