graphql_rails 2.2.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +3 -2
- data/.ruby-version +1 -1
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +17 -17
- data/docs/README.md +23 -45
- data/docs/_sidebar.md +0 -1
- data/docs/components/controller.md +15 -1
- data/docs/components/decorator.md +1 -1
- data/docs/components/model.md +100 -5
- data/docs/components/routes.md +61 -15
- data/graphql_rails.gemspec +1 -1
- data/lib/generators/graphql_rails/templates/graphql_controller.erb +1 -1
- data/lib/graphql_rails/attributes/attribute.rb +16 -14
- data/lib/graphql_rails/attributes/attribute_configurable.rb +24 -0
- data/lib/graphql_rails/attributes/attribute_name_parser.rb +4 -4
- data/lib/graphql_rails/attributes/input_attribute.rb +19 -2
- data/lib/graphql_rails/attributes/type_parseable.rb +4 -5
- data/lib/graphql_rails/controller/action_configuration.rb +1 -1
- data/lib/graphql_rails/controller/build_controller_action_resolver.rb +2 -0
- data/lib/graphql_rails/controller/configuration.rb +1 -1
- data/lib/graphql_rails/controller/request/format_errors.rb +1 -1
- data/lib/graphql_rails/controller/request.rb +3 -2
- data/lib/graphql_rails/controller.rb +1 -1
- data/lib/graphql_rails/decorator/relation_decorator.rb +24 -20
- data/lib/graphql_rails/decorator.rb +12 -4
- data/lib/graphql_rails/errors/custom_execution_error.rb +1 -1
- data/lib/graphql_rails/errors/execution_error.rb +1 -1
- data/lib/graphql_rails/errors/system_error.rb +11 -1
- data/lib/graphql_rails/errors/validation_error.rb +14 -1
- data/lib/graphql_rails/model/find_or_build_graphql_input_type.rb +28 -0
- data/lib/graphql_rails/model/find_or_build_graphql_type.rb +14 -5
- data/lib/graphql_rails/model/find_or_build_graphql_type_class.rb +4 -3
- data/lib/graphql_rails/model/input.rb +3 -3
- data/lib/graphql_rails/router/build_schema_action_type.rb +112 -0
- data/lib/graphql_rails/router/event_route.rb +52 -0
- data/lib/graphql_rails/router/mutation_route.rb +1 -1
- data/lib/graphql_rails/router/query_route.rb +1 -1
- data/lib/graphql_rails/router/resource_routes_builder.rb +0 -8
- data/lib/graphql_rails/router/route.rb +4 -3
- data/lib/graphql_rails/router/schema_builder.rb +18 -26
- data/lib/graphql_rails/router.rb +32 -16
- data/lib/graphql_rails/rspec_controller_helpers.rb +3 -1
- data/lib/graphql_rails/types/hidable_by_group.rb +23 -3
- data/lib/graphql_rails/types/input_object_type.rb +16 -0
- data/lib/graphql_rails/version.rb +1 -1
- metadata +11 -16
- data/docs/getting_started/quick_start.md +0 -62
- data/lib/graphql_rails/model/build_graphql_input_type.rb +0 -43
- data/lib/graphql_rails/router/subscription_route.rb +0 -22
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'route'
|
4
|
+
|
5
|
+
module GraphqlRails
|
6
|
+
class Router
|
7
|
+
# stores subscription type graphql action info
|
8
|
+
class EventRoute
|
9
|
+
attr_reader :name, :module_name, :subscription_class, :groups, :scope_names
|
10
|
+
|
11
|
+
def initialize(name, subscription_class: nil, groups: nil, scope_names: [], **options)
|
12
|
+
@name = name.to_s.camelize(:lower)
|
13
|
+
@module_name = options[:module].to_s
|
14
|
+
@groups = groups
|
15
|
+
@subscription_class = subscription_class
|
16
|
+
@scope_names = scope_names
|
17
|
+
end
|
18
|
+
|
19
|
+
def show_in_group?(group_name)
|
20
|
+
return true if groups.nil? || groups.empty?
|
21
|
+
|
22
|
+
groups.include?(group_name&.to_sym)
|
23
|
+
end
|
24
|
+
|
25
|
+
def field_options
|
26
|
+
{ subscription: subscription }
|
27
|
+
end
|
28
|
+
|
29
|
+
def subscription
|
30
|
+
if subscription_class.present?
|
31
|
+
subscription_class.is_a?(String) ? Object.const_get(subscription_class) : subscription_class
|
32
|
+
else
|
33
|
+
klass_name = ['subscriptions/', name.underscore, 'subscription'].join('_').camelize
|
34
|
+
|
35
|
+
Object.const_get(klass_name)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def mutation?
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
43
|
+
def query?
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
def event?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -28,10 +28,6 @@ module GraphqlRails
|
|
28
28
|
routes << build_mutation(*args, **kwargs)
|
29
29
|
end
|
30
30
|
|
31
|
-
def subscription(*args, **kwargs)
|
32
|
-
routes << build_subscription(*args, **kwargs)
|
33
|
-
end
|
34
|
-
|
35
31
|
private
|
36
32
|
|
37
33
|
attr_reader :autogenerated_action_names, :name, :options
|
@@ -66,10 +62,6 @@ module GraphqlRails
|
|
66
62
|
build_route(QueryRoute, *args, **kwargs)
|
67
63
|
end
|
68
64
|
|
69
|
-
def build_subscription(*args, **kwargs)
|
70
|
-
build_route(SubscriptionRoute, *args, **kwargs)
|
71
|
-
end
|
72
|
-
|
73
65
|
# rubocop:disable Metrics/ParameterLists
|
74
66
|
def build_route(builder, action, prefix: action, suffix: false, on: :member, **custom_options)
|
75
67
|
if suffix == true
|
@@ -6,15 +6,16 @@ module GraphqlRails
|
|
6
6
|
class Router
|
7
7
|
# Generic class for any type graphql action. Should not be used directly
|
8
8
|
class Route
|
9
|
-
attr_reader :name, :module_name, :on, :relative_path, :groups
|
9
|
+
attr_reader :name, :module_name, :on, :relative_path, :groups, :scope_names
|
10
10
|
|
11
|
-
def initialize(name, to: '',
|
11
|
+
def initialize(name, on:, to: '', groups: nil, scope_names: [], **options) # rubocop:disable Metrics/ParameterLists
|
12
12
|
@name = name.to_s.camelize(:lower)
|
13
13
|
@module_name = options[:module].to_s
|
14
14
|
@function = options[:function]
|
15
15
|
@groups = groups
|
16
16
|
@relative_path = to
|
17
17
|
@on = on.to_sym
|
18
|
+
@scope_names = scope_names
|
18
19
|
end
|
19
20
|
|
20
21
|
def path
|
@@ -37,7 +38,7 @@ module GraphqlRails
|
|
37
38
|
if function
|
38
39
|
{ function: function }
|
39
40
|
else
|
40
|
-
{ resolver: resolver }
|
41
|
+
{ resolver: resolver, extras: [:lookahead] }
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
@@ -5,13 +5,14 @@ module GraphqlRails
|
|
5
5
|
# builds GraphQL::Schema based on previously defined grahiti data
|
6
6
|
class SchemaBuilder
|
7
7
|
require_relative './plain_cursor_encoder'
|
8
|
+
require_relative './build_schema_action_type'
|
8
9
|
|
9
|
-
attr_reader :queries, :mutations, :
|
10
|
+
attr_reader :queries, :mutations, :events, :raw_actions
|
10
11
|
|
11
|
-
def initialize(queries:, mutations:,
|
12
|
+
def initialize(queries:, mutations:, events:, raw_actions:, group: nil)
|
12
13
|
@queries = queries
|
13
14
|
@mutations = mutations
|
14
|
-
@
|
15
|
+
@events = events
|
15
16
|
@raw_actions = raw_actions
|
16
17
|
@group = group
|
17
18
|
end
|
@@ -19,26 +20,31 @@ module GraphqlRails
|
|
19
20
|
def call
|
20
21
|
query_type = build_group_type('Query', queries)
|
21
22
|
mutation_type = build_group_type('Mutation', mutations)
|
22
|
-
subscription_type = build_group_type('Subscription',
|
23
|
-
raw = raw_actions
|
23
|
+
subscription_type = build_group_type('Subscription', events)
|
24
24
|
|
25
|
+
define_schema_class(query_type, mutation_type, subscription_type, raw_actions)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :group
|
31
|
+
|
32
|
+
# rubocop:disable Metrics/MethodLength
|
33
|
+
def define_schema_class(query_type, mutation_type, subscription_type, raw)
|
25
34
|
Class.new(GraphQL::Schema) do
|
26
35
|
connections.add(
|
27
36
|
GraphqlRails::Decorator::RelationDecorator,
|
28
37
|
GraphQL::Pagination::ActiveRecordRelationConnection
|
29
38
|
)
|
30
39
|
cursor_encoder(Router::PlainCursorEncoder)
|
31
|
-
raw.each { |action| send(action[:name], *action[:args], &action[:block]) }
|
40
|
+
raw.each { |action| send(action[:name], *action[:args], **action[:kwargs], &action[:block]) }
|
32
41
|
|
33
42
|
query(query_type) if query_type
|
34
43
|
mutation(mutation_type) if mutation_type
|
35
44
|
subscription(subscription_type) if subscription_type
|
36
45
|
end
|
37
46
|
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
attr_reader :group
|
47
|
+
# rubocop:enable Metrics/MethodLength
|
42
48
|
|
43
49
|
def build_group_type(type_name, routes)
|
44
50
|
group_name = group
|
@@ -49,23 +55,9 @@ module GraphqlRails
|
|
49
55
|
.uniq(&:name)
|
50
56
|
.reverse
|
51
57
|
|
52
|
-
return if group_routes.empty?
|
53
|
-
|
54
|
-
build_type(type_name, group_routes)
|
55
|
-
end
|
58
|
+
return if group_routes.empty? && type_name != 'Query'
|
56
59
|
|
57
|
-
|
58
|
-
Class.new(GraphQL::Schema::Object) do
|
59
|
-
graphql_name(type_name)
|
60
|
-
|
61
|
-
group_routes.each do |route|
|
62
|
-
field(*route.name, **route.field_options)
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.inspect
|
66
|
-
"#{GraphQL::Schema::Object}(#{graphql_name})"
|
67
|
-
end
|
68
|
-
end
|
60
|
+
BuildSchemaActionType.call(type_name: type_name, routes: group_routes)
|
69
61
|
end
|
70
62
|
end
|
71
63
|
end
|
data/lib/graphql_rails/router.rb
CHANGED
@@ -5,7 +5,7 @@ require 'active_support/core_ext/string/inflections'
|
|
5
5
|
require 'graphql_rails/router/schema_builder'
|
6
6
|
require 'graphql_rails/router/mutation_route'
|
7
7
|
require 'graphql_rails/router/query_route'
|
8
|
-
require 'graphql_rails/router/
|
8
|
+
require 'graphql_rails/router/event_route'
|
9
9
|
require 'graphql_rails/router/resource_routes_builder'
|
10
10
|
|
11
11
|
module GraphqlRails
|
@@ -21,9 +21,10 @@ module GraphqlRails
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
attr_reader :routes, :namespace_name, :raw_graphql_actions
|
24
|
+
attr_reader :routes, :namespace_name, :raw_graphql_actions, :scope_names
|
25
25
|
|
26
|
-
def initialize(module_name: '', group_names: [])
|
26
|
+
def initialize(module_name: '', group_names: [], scope_names: [])
|
27
|
+
@scope_names = scope_names
|
27
28
|
@module_name = module_name
|
28
29
|
@group_names = group_names
|
29
30
|
@routes ||= Set.new
|
@@ -37,13 +38,16 @@ module GraphqlRails
|
|
37
38
|
routes.merge(scoped_router.routes)
|
38
39
|
end
|
39
40
|
|
40
|
-
def scope(**options, &block)
|
41
|
-
|
42
|
-
scoped_router = router_with(module_name: full_module_name)
|
41
|
+
def scope(new_scope_name = nil, **options, &block)
|
42
|
+
scoped_router = router_with_scope_params(new_scope_name, **options)
|
43
43
|
scoped_router.instance_eval(&block)
|
44
44
|
routes.merge(scoped_router.routes)
|
45
45
|
end
|
46
46
|
|
47
|
+
def namespace(namespace_name, &block)
|
48
|
+
scope(path: namespace_name, module: namespace_name, &block)
|
49
|
+
end
|
50
|
+
|
47
51
|
def resources(name, **options, &block)
|
48
52
|
builder_options = full_route_options(options)
|
49
53
|
routes_builder = ResourceRoutesBuilder.new(name, **builder_options)
|
@@ -59,13 +63,13 @@ module GraphqlRails
|
|
59
63
|
routes << build_route(MutationRoute, name, **options)
|
60
64
|
end
|
61
65
|
|
62
|
-
def
|
63
|
-
routes << build_route(
|
66
|
+
def event(name, **options)
|
67
|
+
routes << build_route(EventRoute, name, **options)
|
64
68
|
end
|
65
69
|
|
66
70
|
RAW_ACTION_NAMES.each do |action_name|
|
67
|
-
define_method(action_name) do |*args, &block|
|
68
|
-
add_raw_action(action_name, *args, &block)
|
71
|
+
define_method(action_name) do |*args, **kwargs, &block|
|
72
|
+
add_raw_action(action_name, *args, **kwargs, &block)
|
69
73
|
end
|
70
74
|
end
|
71
75
|
|
@@ -73,7 +77,7 @@ module GraphqlRails
|
|
73
77
|
@graphql_schema[group&.to_sym] ||= SchemaBuilder.new(
|
74
78
|
queries: routes.select(&:query?),
|
75
79
|
mutations: routes.select(&:mutation?),
|
76
|
-
|
80
|
+
events: routes.select(&:event?),
|
77
81
|
raw_actions: raw_graphql_actions,
|
78
82
|
group: group
|
79
83
|
).call
|
@@ -87,15 +91,27 @@ module GraphqlRails
|
|
87
91
|
|
88
92
|
attr_reader :module_name, :group_names
|
89
93
|
|
94
|
+
def router_with_scope_params(new_scope_name, **options)
|
95
|
+
new_scope_name ||= options[:path]
|
96
|
+
|
97
|
+
full_module_name = [module_name, options[:module]].select(&:present?).join('/')
|
98
|
+
full_scope_names = [*scope_names, new_scope_name].select(&:present?)
|
99
|
+
|
100
|
+
router_with(module_name: full_module_name, scope_names: full_scope_names)
|
101
|
+
end
|
102
|
+
|
90
103
|
def router_with(new_router_options = {})
|
91
|
-
|
92
|
-
full_options = default_options.merge(new_router_options)
|
104
|
+
full_options = default_router_options.merge(new_router_options)
|
93
105
|
|
94
106
|
self.class.new(**full_options)
|
95
107
|
end
|
96
108
|
|
97
|
-
def
|
98
|
-
|
109
|
+
def default_router_options
|
110
|
+
{ module_name: module_name, group_names: group_names, scope_names: scope_names }
|
111
|
+
end
|
112
|
+
|
113
|
+
def add_raw_action(name, *args, **kwargs, &block)
|
114
|
+
raw_graphql_actions << { name: name, args: args, kwargs: kwargs, block: block }
|
99
115
|
end
|
100
116
|
|
101
117
|
def build_route(route_builder, name, **options)
|
@@ -111,7 +127,7 @@ module GraphqlRails
|
|
111
127
|
end
|
112
128
|
|
113
129
|
def default_route_options
|
114
|
-
{ module: module_name, on: :member }
|
130
|
+
{ module: module_name, on: :member, scope_names: scope_names }
|
115
131
|
end
|
116
132
|
end
|
117
133
|
end
|
@@ -95,7 +95,9 @@ module GraphqlRails
|
|
95
95
|
# controller request object more suitable for testing
|
96
96
|
class Request < GraphqlRails::Controller::Request
|
97
97
|
def initialize(params, context)
|
98
|
-
|
98
|
+
inputs = params || {}
|
99
|
+
inputs = inputs.merge(lookahead: ::GraphQL::Execution::Lookahead::NullLookahead.new)
|
100
|
+
super(nil, inputs, context)
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
@@ -6,10 +6,11 @@ module GraphqlRails
|
|
6
6
|
module Types
|
7
7
|
# Add visibility option based on groups
|
8
8
|
module HidableByGroup
|
9
|
-
def initialize(*args, groups: [], **kwargs, &block)
|
9
|
+
def initialize(*args, groups: [], hidden_in_groups: [], **kwargs, &block)
|
10
10
|
super(*args, **kwargs, &block)
|
11
11
|
|
12
|
-
@
|
12
|
+
@hidden_in_groups = hidden_in_groups.map(&:to_s)
|
13
|
+
@groups = groups.map(&:to_s) - @hidden_in_groups
|
13
14
|
end
|
14
15
|
|
15
16
|
def visible?(context)
|
@@ -22,10 +23,29 @@ module GraphqlRails
|
|
22
23
|
@groups
|
23
24
|
end
|
24
25
|
|
26
|
+
def hidden_in_groups
|
27
|
+
@hidden_in_groups
|
28
|
+
end
|
29
|
+
|
25
30
|
def visible_in_context_group?(context)
|
31
|
+
group = context_graphql_group(context)
|
32
|
+
|
33
|
+
return true if no_visibility_configuration?(group)
|
34
|
+
return groups.include?(group) unless groups.empty?
|
35
|
+
|
36
|
+
!hidden_in_groups.include?(group)
|
37
|
+
end
|
38
|
+
|
39
|
+
def no_visibility_configuration?(group)
|
40
|
+
return true if group.nil?
|
41
|
+
|
42
|
+
groups.empty? && hidden_in_groups.empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
def context_graphql_group(context)
|
26
46
|
group = context[:graphql_group] || context['graphql_group']
|
27
47
|
|
28
|
-
group.nil?
|
48
|
+
group.nil? ? nil : group.to_s
|
29
49
|
end
|
30
50
|
end
|
31
51
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'graphql_rails/types/argument_type'
|
4
|
+
|
5
|
+
module GraphqlRails
|
6
|
+
module Types
|
7
|
+
# Base graphql type class for all GraphqlRails models
|
8
|
+
class InputObjectType < GraphQL::Schema::InputObject
|
9
|
+
argument_class(GraphqlRails::Types::ArgumentType)
|
10
|
+
|
11
|
+
def self.inspect
|
12
|
+
"#{GraphQL::Schema::InputObject}(#{graphql_name})"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,35 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Povilas Jurčys
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.12'
|
20
|
-
- - ">="
|
17
|
+
- - '='
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
19
|
+
version: 2.0.21
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.12'
|
30
|
-
- - ">="
|
24
|
+
- - '='
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: 2.0.21
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: activesupport
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,7 +150,6 @@ files:
|
|
156
150
|
- docs/components/decorator.md
|
157
151
|
- docs/components/model.md
|
158
152
|
- docs/components/routes.md
|
159
|
-
- docs/getting_started/quick_start.md
|
160
153
|
- docs/getting_started/setup.md
|
161
154
|
- docs/index.html
|
162
155
|
- docs/logging_and_monitoring/logging_and_monitoring.md
|
@@ -210,23 +203,24 @@ files:
|
|
210
203
|
- lib/graphql_rails/model/build_connection_type.rb
|
211
204
|
- lib/graphql_rails/model/build_connection_type/count_items.rb
|
212
205
|
- lib/graphql_rails/model/build_enum_type.rb
|
213
|
-
- lib/graphql_rails/model/build_graphql_input_type.rb
|
214
206
|
- lib/graphql_rails/model/call_graphql_model_method.rb
|
215
207
|
- lib/graphql_rails/model/configurable.rb
|
216
208
|
- lib/graphql_rails/model/configuration.rb
|
209
|
+
- lib/graphql_rails/model/find_or_build_graphql_input_type.rb
|
217
210
|
- lib/graphql_rails/model/find_or_build_graphql_type.rb
|
218
211
|
- lib/graphql_rails/model/find_or_build_graphql_type_class.rb
|
219
212
|
- lib/graphql_rails/model/input.rb
|
220
213
|
- lib/graphql_rails/query_runner.rb
|
221
214
|
- lib/graphql_rails/railtie.rb
|
222
215
|
- lib/graphql_rails/router.rb
|
216
|
+
- lib/graphql_rails/router/build_schema_action_type.rb
|
217
|
+
- lib/graphql_rails/router/event_route.rb
|
223
218
|
- lib/graphql_rails/router/mutation_route.rb
|
224
219
|
- lib/graphql_rails/router/plain_cursor_encoder.rb
|
225
220
|
- lib/graphql_rails/router/query_route.rb
|
226
221
|
- lib/graphql_rails/router/resource_routes_builder.rb
|
227
222
|
- lib/graphql_rails/router/route.rb
|
228
223
|
- lib/graphql_rails/router/schema_builder.rb
|
229
|
-
- lib/graphql_rails/router/subscription_route.rb
|
230
224
|
- lib/graphql_rails/rspec_controller_helpers.rb
|
231
225
|
- lib/graphql_rails/tasks/dump_graphql_schema.rb
|
232
226
|
- lib/graphql_rails/tasks/dump_graphql_schemas.rb
|
@@ -234,6 +228,7 @@ files:
|
|
234
228
|
- lib/graphql_rails/types/argument_type.rb
|
235
229
|
- lib/graphql_rails/types/field_type.rb
|
236
230
|
- lib/graphql_rails/types/hidable_by_group.rb
|
231
|
+
- lib/graphql_rails/types/input_object_type.rb
|
237
232
|
- lib/graphql_rails/types/object_type.rb
|
238
233
|
- lib/graphql_rails/version.rb
|
239
234
|
homepage: https://github.com/samesystem/graphql_rails
|
@@ -255,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
250
|
- !ruby/object:Gem::Version
|
256
251
|
version: '0'
|
257
252
|
requirements: []
|
258
|
-
rubygems_version: 3.
|
253
|
+
rubygems_version: 3.3.7
|
259
254
|
signing_key:
|
260
255
|
specification_version: 4
|
261
256
|
summary: Rails style structure for GraphQL API.
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# Quick Start
|
2
|
-
|
3
|
-
## Generate initial code
|
4
|
-
|
5
|
-
```bash
|
6
|
-
bundle exec rails g graphql_rails:install
|
7
|
-
```
|
8
|
-
|
9
|
-
## Define GraphQL schema as RoR routes
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
# config/graphql/routes.rb
|
13
|
-
GraphqlRails::Router.draw do
|
14
|
-
# will create createUser, updateUser, destroyUser mutations and user, users queries.
|
15
|
-
# expects that UsersController class exist
|
16
|
-
resources :users
|
17
|
-
|
18
|
-
# if you want custom queries or mutation
|
19
|
-
query 'searchLogs', to: 'logs#search' # redirects request to LogsController
|
20
|
-
mutation 'changeUserPassword', to: 'users#change_password'
|
21
|
-
end
|
22
|
-
```
|
23
|
-
|
24
|
-
## Define your Graphql model
|
25
|
-
|
26
|
-
```ruby
|
27
|
-
class User # works with any class including ActiveRecord
|
28
|
-
include GraphqlRails::Model
|
29
|
-
|
30
|
-
graphql do |c|
|
31
|
-
# most common attributes, like :id, :name, :title has default type, so you don't have to specify it (but you can!)
|
32
|
-
c.attribute :id
|
33
|
-
|
34
|
-
c.attribute :email, :string
|
35
|
-
c.attribute :surname, :string
|
36
|
-
end
|
37
|
-
end
|
38
|
-
```
|
39
|
-
|
40
|
-
## Define controller
|
41
|
-
|
42
|
-
```ruby
|
43
|
-
class UsersController < ApplicationGraphqlController
|
44
|
-
# graphql requires to describe which attributes controller action accepts and which returns
|
45
|
-
action(:change_user_password)
|
46
|
-
.permit(:password!, :id!) # Bang (!) indicates that attribute is required
|
47
|
-
|
48
|
-
def change_user_password
|
49
|
-
user = User.find(params[:id])
|
50
|
-
user.update!(password: params[:password])
|
51
|
-
|
52
|
-
# returned value needs to have all methods defined in model `graphql do` part
|
53
|
-
user # or SomeDecorator.new(user)
|
54
|
-
end
|
55
|
-
|
56
|
-
action(:search).permit(search_fields!: SearchFieldsInput) # you can specify your own input fields
|
57
|
-
def search
|
58
|
-
end
|
59
|
-
end
|
60
|
-
```
|
61
|
-
|
62
|
-
Congrats, you are done!
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'graphql_rails/types/argument_type'
|
4
|
-
require 'graphql_rails/concerns/service'
|
5
|
-
|
6
|
-
module GraphqlRails
|
7
|
-
module Model
|
8
|
-
# stores information about model specific config, like attributes and types
|
9
|
-
class BuildGraphqlInputType
|
10
|
-
include ::GraphqlRails::Service
|
11
|
-
|
12
|
-
def initialize(name:, description: nil, attributes:)
|
13
|
-
@name = name
|
14
|
-
@attributes = attributes
|
15
|
-
@description = description
|
16
|
-
end
|
17
|
-
|
18
|
-
def call
|
19
|
-
type_name = name
|
20
|
-
type_description = description
|
21
|
-
type_attributes = attributes
|
22
|
-
|
23
|
-
Class.new(GraphQL::Schema::InputObject) do
|
24
|
-
argument_class(GraphqlRails::Types::ArgumentType)
|
25
|
-
graphql_name(type_name)
|
26
|
-
description(type_description)
|
27
|
-
|
28
|
-
type_attributes.each_value do |type_attribute|
|
29
|
-
argument(*type_attribute.input_argument_args, **type_attribute.input_argument_options)
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.inspect
|
33
|
-
"#{GraphQL::Schema::InputObject}(#{graphql_name})"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
attr_reader :model_configuration, :attributes, :name, :description
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'route'
|
4
|
-
|
5
|
-
module GraphqlRails
|
6
|
-
class Router
|
7
|
-
# stores subscription type graphql action info
|
8
|
-
class SubscriptionRoute < Route
|
9
|
-
def query?
|
10
|
-
false
|
11
|
-
end
|
12
|
-
|
13
|
-
def mutation?
|
14
|
-
false
|
15
|
-
end
|
16
|
-
|
17
|
-
def subscription?
|
18
|
-
true
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|