class GraphqlRails::Router

graphql router that mimics Rails.application.routes

Constants

RAW_ACTION_NAMES

Attributes

group_names[R]
module_name[R]
namespace_name[R]
raw_graphql_actions[R]
routes[R]

Public Class Methods

draw(&block) click to toggle source
# File lib/graphql_rails/router.rb, line 17
def self.draw(&block)
  new.tap do |router|
    router.instance_eval(&block)
  end
end
new(module_name: '', group_names: []) click to toggle source
# File lib/graphql_rails/router.rb, line 25
def initialize(module_name: '', group_names: [])
  @module_name = module_name
  @group_names = group_names
  @routes ||= Set.new
  @raw_graphql_actions ||= []
end

Public Instance Methods

graphql_schema(group = nil) click to toggle source
# File lib/graphql_rails/router.rb, line 66
def graphql_schema(group = nil)
  @graphql_schema ||= {}
  @graphql_schema[group&.to_sym] ||= SchemaBuilder.new(
    queries: routes.select(&:query?),
    mutations: routes.select(&:mutation?),
    raw_actions: raw_graphql_actions,
    group: group
  ).call
end
group(*group_names, &block) click to toggle source
# File lib/graphql_rails/router.rb, line 32
def group(*group_names, &block)
  scoped_router = router_with(group_names: group_names)
  scoped_router.instance_eval(&block)
  routes.merge(scoped_router.routes)
end
mutation(name, **options) click to toggle source
# File lib/graphql_rails/router.rb, line 56
def mutation(name, **options)
  routes << build_route(MutationRoute, name, **options)
end
query(name, **options) click to toggle source
# File lib/graphql_rails/router.rb, line 52
def query(name, **options)
  routes << build_route(QueryRoute, name, **options)
end
reload_schema() click to toggle source
# File lib/graphql_rails/router.rb, line 76
def reload_schema
  @graphql_schema = nil
end
resources(name, **options, &block) click to toggle source
# File lib/graphql_rails/router.rb, line 45
def resources(name, **options, &block)
  builder_options = full_route_options(options)
  routes_builder = ResourceRoutesBuilder.new(name, **builder_options)
  routes_builder.instance_eval(&block) if block
  routes.merge(routes_builder.routes)
end
scope(**options, &block) click to toggle source
# File lib/graphql_rails/router.rb, line 38
def scope(**options, &block)
  full_module_name = [module_name, options[:module]].reject(&:empty?).join('/')
  scoped_router = router_with(module_name: full_module_name)
  scoped_router.instance_eval(&block)
  routes.merge(scoped_router.routes)
end

Private Instance Methods

add_raw_action(name, *args, &block) click to toggle source
# File lib/graphql_rails/router.rb, line 91
def add_raw_action(name, *args, &block)
  raw_graphql_actions << { name: name, args: args, block: block }
end
build_route(route_builder, name, **options) click to toggle source
# File lib/graphql_rails/router.rb, line 95
def build_route(route_builder, name, **options)
  route_builder.new(name, **full_route_options(options))
end
default_route_options() click to toggle source
# File lib/graphql_rails/router.rb, line 107
def default_route_options
  { module: module_name, on: :member }
end
full_route_options(extra_options) click to toggle source
# File lib/graphql_rails/router.rb, line 99
def full_route_options(extra_options)
  extra_groups = Array(extra_options[:group]) + Array(extra_options[:groups])
  extra_options = extra_options.except(:group, :groups)
  groups = (group_names + extra_groups).uniq

  default_route_options.merge(extra_options).merge(groups: groups)
end
router_with(new_router_options = {}) click to toggle source
# File lib/graphql_rails/router.rb, line 84
def router_with(new_router_options = {})
  default_options = { module_name: module_name, group_names: group_names }
  full_options = default_options.merge(new_router_options)

  self.class.new(**full_options)
end