graphql_rails 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|