Simplify the way ApiTypesCreator is used
This commit is contained in:
@@ -20,7 +20,7 @@ class GraphqlController < ApplicationController
|
||||
private
|
||||
|
||||
def consul_schema
|
||||
api_types = GraphQL::ApiTypesCreator.new(API_TYPE_DEFINITIONS).create
|
||||
api_types = GraphQL::ApiTypesCreator.create(API_TYPE_DEFINITIONS)
|
||||
query_type = GraphQL::QueryTypeCreator.create(api_types)
|
||||
|
||||
GraphQL::Schema.define do
|
||||
|
||||
@@ -10,16 +10,10 @@ module GraphQL
|
||||
string: GraphQL::STRING_TYPE
|
||||
}
|
||||
|
||||
attr_accessor :created_types
|
||||
|
||||
def initialize(api_type_definitions)
|
||||
@api_type_definitions = api_type_definitions
|
||||
@created_types = {}
|
||||
end
|
||||
|
||||
def create
|
||||
@api_type_definitions.each do |model, info|
|
||||
self.create_type(model, info[:fields])
|
||||
def self.create(api_types_definitions)
|
||||
created_types = {}
|
||||
api_types_definitions.each do |model, info|
|
||||
create_type(model, info[:fields], created_types)
|
||||
end
|
||||
created_types
|
||||
end
|
||||
@@ -34,10 +28,9 @@ module GraphQL
|
||||
end
|
||||
end
|
||||
|
||||
def create_type(model, fields)
|
||||
api_types_creator = self
|
||||
def self.create_type(model, fields, created_types)
|
||||
|
||||
created_type = GraphQL::ObjectType.define do
|
||||
created_types[model] = GraphQL::ObjectType.define do
|
||||
|
||||
name model.graphql_type_name
|
||||
description model.graphql_type_description
|
||||
@@ -48,7 +41,7 @@ module GraphQL
|
||||
when :scalar
|
||||
field(field_name, SCALAR_TYPES[field_type], model.human_attribute_name(field_name))
|
||||
when :singular_association
|
||||
field(field_name, -> { api_types_creator.created_types[field_type] }) do
|
||||
field(field_name, -> { created_types[field_type] }) do
|
||||
resolve -> (object, arguments, context) do
|
||||
association_target = object.send(field_name)
|
||||
if association_target.nil?
|
||||
@@ -60,15 +53,13 @@ module GraphQL
|
||||
end
|
||||
when :multiple_association
|
||||
field_type = field_type.first
|
||||
connection(field_name, -> { api_types_creator.created_types[field_type].connection_type }) do
|
||||
connection(field_name, -> { created_types[field_type].connection_type }) do
|
||||
resolve -> (object, arguments, context) { field_type.public_for_api & object.send(field_name) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
created_types[model] = created_type
|
||||
return created_type # GraphQL::ObjectType
|
||||
end
|
||||
|
||||
def self.parse_api_config_file(file)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe GraphQL::ApiTypesCreator do
|
||||
let(:api_types_creator) { GraphQL::ApiTypesCreator.new( {} ) }
|
||||
let(:created_types) { {} }
|
||||
|
||||
describe "::create_type" do
|
||||
it "creates fields for Int attributes" do
|
||||
debate_type = api_types_creator.create_type(Debate, { id: :integer })
|
||||
debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { id: :integer }, created_types)
|
||||
created_field = debate_type.fields['id']
|
||||
|
||||
expect(created_field).to be_a(GraphQL::Field)
|
||||
@@ -14,7 +14,7 @@ describe GraphQL::ApiTypesCreator do
|
||||
end
|
||||
|
||||
it "creates fields for String attributes" do
|
||||
debate_type = api_types_creator.create_type(Debate, { title: :string })
|
||||
debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { title: :string }, created_types)
|
||||
created_field = debate_type.fields['title']
|
||||
|
||||
expect(created_field).to be_a(GraphQL::Field)
|
||||
@@ -23,8 +23,8 @@ describe GraphQL::ApiTypesCreator do
|
||||
end
|
||||
|
||||
it "creates connections for :belongs_to associations" do
|
||||
user_type = api_types_creator.create_type(User, { id: :integer })
|
||||
debate_type = api_types_creator.create_type(Debate, { author: User })
|
||||
user_type = GraphQL::ApiTypesCreator.create_type(User, { id: :integer }, created_types)
|
||||
debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { author: User }, created_types)
|
||||
|
||||
connection = debate_type.fields['author']
|
||||
|
||||
@@ -34,8 +34,8 @@ describe GraphQL::ApiTypesCreator do
|
||||
end
|
||||
|
||||
it "creates connections for :has_one associations" do
|
||||
user_type = api_types_creator.create_type(User, { organization: Organization })
|
||||
organization_type = api_types_creator.create_type(Organization, { id: :integer })
|
||||
user_type = GraphQL::ApiTypesCreator.create_type(User, { organization: Organization }, created_types)
|
||||
organization_type = GraphQL::ApiTypesCreator.create_type(Organization, { id: :integer }, created_types)
|
||||
|
||||
connection = user_type.fields['organization']
|
||||
|
||||
@@ -45,8 +45,8 @@ describe GraphQL::ApiTypesCreator do
|
||||
end
|
||||
|
||||
it "creates connections for :has_many associations" do
|
||||
comment_type = api_types_creator.create_type(Comment, { id: :integer })
|
||||
debate_type = api_types_creator.create_type(Debate, { comments: [Comment] })
|
||||
comment_type = GraphQL::ApiTypesCreator.create_type(Comment, { id: :integer }, created_types)
|
||||
debate_type = GraphQL::ApiTypesCreator.create_type(Debate, { comments: [Comment] }, created_types)
|
||||
|
||||
connection = debate_type.fields['comments']
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ describe GraphQL::QueryTypeCreator do
|
||||
Proposal => { fields: { id: :integer, title: :string } }
|
||||
}
|
||||
end
|
||||
let(:api_types) { GraphQL::ApiTypesCreator.new(api_type_definitions).create }
|
||||
let(:api_types) { GraphQL::ApiTypesCreator.create(api_type_definitions) }
|
||||
|
||||
describe "::create" do
|
||||
let(:query_type) { GraphQL::QueryTypeCreator.create(api_types) }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require 'rails_helper'
|
||||
|
||||
api_types = GraphQL::ApiTypesCreator.new(API_TYPE_DEFINITIONS).create
|
||||
api_types = GraphQL::ApiTypesCreator.create(API_TYPE_DEFINITIONS)
|
||||
query_type = GraphQL::QueryTypeCreator.create(api_types)
|
||||
ConsulSchema = GraphQL::Schema.define do
|
||||
query query_type
|
||||
|
||||
Reference in New Issue
Block a user