graphql_helpers.rb 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # frozen_string_literal: true
  2. module GraphQLHelpers
  3. # makes snake_case_field_name look like a graphql camelCaseFieldName
  4. # "many_pokemon" => "manyPokemon"
  5. def self.fieldnamerize(underscored_field_name)
  6. graphql_field_name = underscored_field_name.to_s.camelize
  7. graphql_field_name[0] = graphql_field_name[0].downcase
  8. graphql_field_name
  9. end
  10. def self.keys_for_klass(klass)
  11. case klass
  12. when GraphQL::Field
  13. klass.type
  14. else
  15. klass
  16. end.fields.keys
  17. end
  18. def self.arguments_for_field(field)
  19. case field
  20. when GraphQL::Schema::Resolver
  21. field.instance_variable_get('@arguments_by_keyword').map { |_, v| v.name }
  22. else
  23. field.arguments.keys
  24. end
  25. end
  26. def self.plural_arguments_for_field(field)
  27. keys = arguments_for_field(field)
  28. # Connections mandate extra fields, which are not owned by a plural based
  29. # resolver.
  30. # keys -= %w[after before first last]
  31. keys.map do |key|
  32. type_class = field.arguments[key.to_s].metadata[:type_class]
  33. plurals = type_class.owner.try(:plurals)
  34. if plurals
  35. arg = plurals[key.underscore.to_sym]
  36. fieldnamerize(arg.to_s) if arg
  37. end
  38. end.compact
  39. end
  40. def self.plural_argument_for_field(field, argument)
  41. field.arguments[argument.to_s].metadata[:type_class].owner.plurals[argument.to_sym]
  42. end
  43. # Shortcut for running resolvers #resolve methods
  44. def resolve(resolver_class, obj: nil, args: {}, ctx: {})
  45. resolver_class.new(object: obj, context: ctx).resolve(args)
  46. end
  47. end