graphql-api 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|