graphql-api 0.1.3 → 0.1.4
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/README.md +29 -1
- data/lib/graphql/api/command_type.rb +5 -0
- data/lib/graphql/api/resolvers/command_mutation.rb +16 -0
- data/lib/graphql/api/resolvers/field.rb +20 -0
- data/lib/graphql/api/resolvers/model_create_mutation.rb +16 -0
- data/lib/graphql/api/resolvers/model_delete_mutation.rb +17 -0
- data/lib/graphql/api/resolvers/model_find_query.rb +19 -0
- data/lib/graphql/api/resolvers/model_list_query.rb +29 -0
- data/lib/graphql/api/resolvers/model_update_mutation.rb +17 -0
- data/lib/graphql/api/resolvers/query_object_query.rb +15 -0
- data/lib/graphql/api/schema.rb +31 -55
- data/lib/graphql/api/version.rb +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 477daabc28be110eb038b74769ba03c0aafa0362
|
4
|
+
data.tar.gz: fbe73ba70e1eaf7f31c3b6e63eeb6c3f0f0d5be2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad96e49af75b0e1e957d681b07e0654da9f92bddcc9f191e373ac97cb80bc2398cdd346ef229e772a46210d0a176515cdfbe845e072fc9fbbba53cc10a212e55
|
7
|
+
data.tar.gz: 63d532a93ea3d90fe477d8111e257831ebbc25bce61b840208c8b313d75f13710dd01adba7feae304eceaa6ebc2156ffc34f9d6aa077869115a1e34719d85ca0
|
data/README.md
CHANGED
@@ -183,7 +183,35 @@ They take a set of inputs as well as a graphql context and provide a
|
|
183
183
|
`perform` method that returns a Graphql understandable type. These objects
|
184
184
|
give you an object oriented abstraction for handling mutations.
|
185
185
|
|
186
|
-
Command objects must implement the interface defined in `GraphQL::Api::CommandType
|
186
|
+
Command objects must implement the interface defined in `GraphQL::Api::CommandType`.
|
187
|
+
|
188
|
+
To better model controllers, you can define the commands `actions` this
|
189
|
+
will allow a command to respond to multiple methods on the same class. For
|
190
|
+
example, the following code will model a restful controller using commands.
|
191
|
+
The mutation will be prefixed with the action name. For example, the code
|
192
|
+
below will create a `updateBlogCommand` mutation as well as a `deleteBlogCommand`.
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
class BlogCommand < GraphQL::Api::CommandType
|
196
|
+
inputs name: :string, tags: [:string], id: :integer
|
197
|
+
returns blog: Blog
|
198
|
+
|
199
|
+
# this tells GraphQL-Api to make two mutations that call the below methods.
|
200
|
+
actions :update, :delete
|
201
|
+
|
202
|
+
def update
|
203
|
+
blog = Blog.find(inputs[:id])
|
204
|
+
blog.update!(inputs.to_h)
|
205
|
+
{blog: blog}
|
206
|
+
end
|
207
|
+
|
208
|
+
def delete
|
209
|
+
blog = Blog.find(inputs[:id]).destroy!
|
210
|
+
{blog: blog}
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
```
|
187
215
|
|
188
216
|
### Query Objects
|
189
217
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module GraphQL::Api
|
2
|
+
module Resolvers
|
3
|
+
class Field
|
4
|
+
|
5
|
+
def initialize(model, name)
|
6
|
+
@model = model
|
7
|
+
@name = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(obj, args, ctx)
|
11
|
+
if obj.respond_to?("access_#{@name}?")
|
12
|
+
obj.send(@name) if obj.send("access_#{@name}?", ctx)
|
13
|
+
else
|
14
|
+
obj.send(@name)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module GraphQL::Api
|
2
|
+
module Resolvers
|
3
|
+
class ModelCreateMutation
|
4
|
+
|
5
|
+
def initialize(model)
|
6
|
+
@model = model
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(inputs, ctx)
|
10
|
+
item = @model.create!(inputs.to_h)
|
11
|
+
{@model.name.underscore.to_sym => item}
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GraphQL::Api
|
2
|
+
module Resolvers
|
3
|
+
class ModelDeleteMutation
|
4
|
+
|
5
|
+
def initialize(model)
|
6
|
+
@model = model
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(inputs, ctx)
|
10
|
+
item = @model.find(inputs[:id])
|
11
|
+
item.destroy!
|
12
|
+
{"#{@model.name.underscore.to_sym}_id".to_sym => inputs[:id]}
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module GraphQL::Api
|
2
|
+
module Resolvers
|
3
|
+
class ModelFindQuery
|
4
|
+
|
5
|
+
def initialize(model)
|
6
|
+
@model = model
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(obj, args, ctx)
|
10
|
+
if @model.respond_to?(:graph_find)
|
11
|
+
@model.graph_find(args, ctx)
|
12
|
+
else
|
13
|
+
@model.find_by!(args.to_h)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GraphQL::Api
|
2
|
+
module Resolvers
|
3
|
+
class ModelListQuery
|
4
|
+
|
5
|
+
def initialize(model)
|
6
|
+
@model = model
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(obj, args, ctx)
|
10
|
+
if @model.respond_to?(:graph_where)
|
11
|
+
@model.graph_where(args, ctx)
|
12
|
+
else
|
13
|
+
eager_load = []
|
14
|
+
ctx.irep_node.children.each do |child|
|
15
|
+
eager_load << child[0] if @model.reflections.find { |name, _| name == child[0] }
|
16
|
+
end
|
17
|
+
|
18
|
+
query_args = args.to_h
|
19
|
+
query_args.delete('limit')
|
20
|
+
|
21
|
+
q = @model.where(query_args)
|
22
|
+
q.eager_load(*eager_load) if eager_load.any?
|
23
|
+
q.limit(args[:limit] || 30)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GraphQL::Api
|
2
|
+
module Resolvers
|
3
|
+
class ModelUpdateMutation
|
4
|
+
|
5
|
+
def initialize(model)
|
6
|
+
@model = model
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(inputs, ctx)
|
10
|
+
item = @model.find(inputs[:id])
|
11
|
+
item.update!(inputs.to_h)
|
12
|
+
{@model.name.underscore.to_sym => item}
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/graphql/api/schema.rb
CHANGED
@@ -2,6 +2,14 @@ require 'graphql/api/command_type'
|
|
2
2
|
require 'graphql/api/query_type'
|
3
3
|
require 'graphql/api/helpers'
|
4
4
|
require 'graphql/api/schema_error'
|
5
|
+
require 'graphql/api/resolvers/model_create_mutation'
|
6
|
+
require 'graphql/api/resolvers/model_delete_mutation'
|
7
|
+
require 'graphql/api/resolvers/model_update_mutation'
|
8
|
+
require 'graphql/api/resolvers/model_find_query'
|
9
|
+
require 'graphql/api/resolvers/model_list_query'
|
10
|
+
require 'graphql/api/resolvers/query_object_query'
|
11
|
+
require 'graphql/api/resolvers/command_mutation'
|
12
|
+
require 'graphql/api/resolvers/field'
|
5
13
|
require 'graphql'
|
6
14
|
|
7
15
|
include GraphQL::Api::Helpers
|
@@ -45,7 +53,7 @@ module GraphQL::Api
|
|
45
53
|
model_class.columns.each do |column|
|
46
54
|
field column.name do
|
47
55
|
type graphql_type(column)
|
48
|
-
resolve
|
56
|
+
resolve Resolvers::Field.new(model_class, column.name)
|
49
57
|
end
|
50
58
|
end
|
51
59
|
end
|
@@ -64,7 +72,7 @@ module GraphQL::Api
|
|
64
72
|
else
|
65
73
|
type object_types[association.class_name.constantize]
|
66
74
|
end
|
67
|
-
resolve
|
75
|
+
resolve Resolvers::Field.new(model_class, name)
|
68
76
|
end
|
69
77
|
end
|
70
78
|
end
|
@@ -72,12 +80,12 @@ module GraphQL::Api
|
|
72
80
|
end
|
73
81
|
end
|
74
82
|
|
75
|
-
def create_command_type(object_type)
|
83
|
+
def create_command_type(object_type, action)
|
76
84
|
object_types = @types
|
77
85
|
|
78
86
|
GraphQL::Relay::Mutation.define do
|
79
87
|
name object_type.name
|
80
|
-
description "Command #{object_type.name}"
|
88
|
+
description "Command #{object_type.name} #{action}"
|
81
89
|
|
82
90
|
object_type.inputs.each do |input, type|
|
83
91
|
input_field input, graphql_type_of(type)
|
@@ -87,9 +95,7 @@ module GraphQL::Api
|
|
87
95
|
return_field return_name, graphql_type_for_object(return_type, object_types)
|
88
96
|
end
|
89
97
|
|
90
|
-
resolve
|
91
|
-
object_type.new(inputs, ctx).perform
|
92
|
-
}
|
98
|
+
resolve Resolvers::CommandMutation.new(object_type, action)
|
93
99
|
end
|
94
100
|
end
|
95
101
|
|
@@ -107,11 +113,7 @@ module GraphQL::Api
|
|
107
113
|
end
|
108
114
|
|
109
115
|
return_field model_class.name.underscore.to_sym, object_types[model_class]
|
110
|
-
|
111
|
-
resolve -> (inputs, ctx) {
|
112
|
-
item = model_class.create!(inputs.to_h)
|
113
|
-
{model_class.name.underscore.to_sym => item}
|
114
|
-
}
|
116
|
+
resolve Resolvers::ModelCreateMutation.new(model_class)
|
115
117
|
end
|
116
118
|
end
|
117
119
|
|
@@ -130,12 +132,7 @@ module GraphQL::Api
|
|
130
132
|
end
|
131
133
|
|
132
134
|
return_field model_class.name.underscore.to_sym, object_types[model_class]
|
133
|
-
|
134
|
-
resolve -> (inputs, ctx) {
|
135
|
-
item = model_class.find(inputs[:id])
|
136
|
-
item.update!(inputs.to_h)
|
137
|
-
{model_class.name.underscore.to_sym => item}
|
138
|
-
}
|
135
|
+
resolve Resolvers::ModelUpdateMutation.new(model_class)
|
139
136
|
end
|
140
137
|
end
|
141
138
|
|
@@ -149,18 +146,14 @@ module GraphQL::Api
|
|
149
146
|
input_field :id, !types.ID
|
150
147
|
|
151
148
|
return_field "#{model_class.name.underscore}_id".to_sym, types.ID
|
152
|
-
|
153
|
-
resolve -> (inputs, ctx) {
|
154
|
-
item = model_class.find(inputs[:id]).destroy!
|
155
|
-
{"#{model_class.name.underscore}_id".to_sym => item.id}
|
156
|
-
}
|
149
|
+
resolve Resolvers::ModelDeleteMutation.new(model_class)
|
157
150
|
end
|
158
151
|
end
|
159
152
|
|
160
153
|
def query(&block)
|
161
154
|
object_types = @types
|
162
155
|
|
163
|
-
|
156
|
+
GraphQL::ObjectType.define do
|
164
157
|
name 'Query'
|
165
158
|
description 'The query root for this schema'
|
166
159
|
|
@@ -179,13 +172,7 @@ module GraphQL::Api
|
|
179
172
|
end
|
180
173
|
end
|
181
174
|
|
182
|
-
resolve
|
183
|
-
if object_class.respond_to?(:graph_find)
|
184
|
-
object_class.graph_find(args, ctx)
|
185
|
-
else
|
186
|
-
object_class.find_by!(args.to_h)
|
187
|
-
end
|
188
|
-
}
|
175
|
+
resolve Resolvers::ModelFindQuery.new(object_class)
|
189
176
|
end
|
190
177
|
|
191
178
|
field(object_class.name.camelize(:lower).pluralize) do
|
@@ -198,23 +185,7 @@ module GraphQL::Api
|
|
198
185
|
end
|
199
186
|
end
|
200
187
|
|
201
|
-
resolve
|
202
|
-
if object_class.respond_to?(:graph_where)
|
203
|
-
object_class.graph_where(args, ctx)
|
204
|
-
else
|
205
|
-
eager_load = []
|
206
|
-
ctx.irep_node.children.each do |child|
|
207
|
-
eager_load << child[0] if object_class.reflections.find { |name, _| name == child[0] }
|
208
|
-
end
|
209
|
-
|
210
|
-
query_args = args.to_h
|
211
|
-
query_args.delete('limit')
|
212
|
-
|
213
|
-
q = object_class.where(query_args)
|
214
|
-
q.eager_load(*eager_load) if eager_load.any?
|
215
|
-
q.limit(args[:limit] || 30)
|
216
|
-
end
|
217
|
-
}
|
188
|
+
resolve Resolvers::ModelListQuery.new(object_class)
|
218
189
|
end
|
219
190
|
|
220
191
|
elsif object_class.respond_to?(:arguments) && object_class.respond_to?(:return_type)
|
@@ -226,9 +197,7 @@ module GraphQL::Api
|
|
226
197
|
argument argument_name, graphql_type_of(argument_type)
|
227
198
|
end
|
228
199
|
|
229
|
-
resolve
|
230
|
-
object_class.new(args, ctx).execute
|
231
|
-
}
|
200
|
+
resolve Resolvers::QueryObjectQuery.new(object_class)
|
232
201
|
end
|
233
202
|
|
234
203
|
end
|
@@ -240,7 +209,7 @@ module GraphQL::Api
|
|
240
209
|
def mutation(&block)
|
241
210
|
mutations = @mutations
|
242
211
|
|
243
|
-
|
212
|
+
GraphQL::ObjectType.define do
|
244
213
|
name 'Mutation'
|
245
214
|
instance_eval(&block) if block
|
246
215
|
|
@@ -274,9 +243,16 @@ module GraphQL::Api
|
|
274
243
|
end
|
275
244
|
|
276
245
|
all_commands.each do |command|
|
277
|
-
|
278
|
-
|
279
|
-
|
246
|
+
if command.respond_to?(:actions) && command.actions.any?
|
247
|
+
@mutations[command] = []
|
248
|
+
command.actions.each do |action|
|
249
|
+
@mutations[command] << ["#{action}#{command.name}", create_command_type(command, action)]
|
250
|
+
end
|
251
|
+
else
|
252
|
+
@mutations[command] = [
|
253
|
+
[command.name.camelize(:lower), create_command_type(command, :perform)]
|
254
|
+
]
|
255
|
+
end
|
280
256
|
end
|
281
257
|
end
|
282
258
|
|
data/lib/graphql/api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Walker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -72,6 +72,14 @@ files:
|
|
72
72
|
- lib/graphql/api/command_type.rb
|
73
73
|
- lib/graphql/api/helpers.rb
|
74
74
|
- lib/graphql/api/query_type.rb
|
75
|
+
- lib/graphql/api/resolvers/command_mutation.rb
|
76
|
+
- lib/graphql/api/resolvers/field.rb
|
77
|
+
- lib/graphql/api/resolvers/model_create_mutation.rb
|
78
|
+
- lib/graphql/api/resolvers/model_delete_mutation.rb
|
79
|
+
- lib/graphql/api/resolvers/model_find_query.rb
|
80
|
+
- lib/graphql/api/resolvers/model_list_query.rb
|
81
|
+
- lib/graphql/api/resolvers/model_update_mutation.rb
|
82
|
+
- lib/graphql/api/resolvers/query_object_query.rb
|
75
83
|
- lib/graphql/api/schema.rb
|
76
84
|
- lib/graphql/api/schema_error.rb
|
77
85
|
- lib/graphql/api/version.rb
|