http://graphql-ruby.org/schema/class_based_api.html
In GraphQL 1.8+, you can use Ruby classes to build your schema. You can mix class-style and .define-style type definitions in a schema.
GraphQL-Ruby 1.8からクラス形式でのGraphQLの型定義が可能になりました
そのアップデート方法に関してドキュメントに記載のないこと、補足事項を記します
Field
GraphQL::Field
はResolver
に移行します
ベースクラスを定義し、
module Resolvers
class Base < GraphQL::Schema::Resolver
end
end
継承します
module Resolvers
class FindUser < Resolvers::Base
type Types::UserType null: false
description("ユーザ情報")
argument :user_id, ID, "並び順"
def resolve(user_id:)
User.find(user_id)
end
end
end
利用側でresolver:
でセットします
field :findUser, resolver: Resolvers::FindUser
Function
GraphQL::Functionはもともとクラスベースで定義することができましたが、
新しいクラスベースAPIのargumentの記法ではないため、GraphQL::Schema::Mutation
に移行します
resolveを書き換える
before
def call(object, inputs_, ctx)
...
end
after
def resolve(**inputs)
some_context_data = context[:some_context_data]
id = object.some_id
...
end
- 引数はセットしたargumentsがハッシュで渡ります
- context, objectは
GraphQL::Schema::Mutation
に定義されています
GraphQLGuard
GraphQL::Schema::Field
を継承し、field定義時にguardを受け取れるようにします
class Fields::Guardable < GraphQL::Schema::Field
def initialize(*args, guard: nil, **kwargs, &block)
@guard = guard
super *args, **kwargs, &block
end
def to_graphql
field_defn = super
field_defn.tap { |d| d.metadata[:guard] = @guard }
end
end
Type側
class Types::MutationType < GraphQL::Schema::Object
field_class Fields::Guardable
field :createUser, mutation: Mutations::CreateUser,
guard: ->(_obj, _args, _ctx) do
...
end
...
end