graphql-rails-api 0.9.5 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graphql/hydrate_query.rb +87 -9
- data/lib/graphql/rails/api/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2eb89c21597bdbc0a59ebe13ec5030d847fd356901600700ae3be29f33c3f54f
|
4
|
+
data.tar.gz: a276f011746654e122e7b574707fa1df57590e753ca64ea3d23e232d2fcb356a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf96a1ce8f8f0d18a7d5ca9844fa3802c84664e05e1a790a257007cfd71444fff823a2b916b0e1e436694e9402edb38a484a1fe58c26b33e9b86ecbd551eee13
|
7
|
+
data.tar.gz: 438629cf1b5213e919639f60b52b2f8f64b02d086578570fc8924bedf770d5826af51506b6191d458dc4ba851839cd11f1abbb44775b3579b993aa336da87056
|
@@ -58,7 +58,7 @@ module Graphql
|
|
58
58
|
return if @order_by.blank?
|
59
59
|
|
60
60
|
sign = @order_by.split(" ").last.downcase == "desc" ? "desc" : "asc"
|
61
|
-
column = @order_by.split(" ").first.strip
|
61
|
+
column = @order_by.split(" ").first.strip.underscore
|
62
62
|
|
63
63
|
if column.include?(".")
|
64
64
|
associated_model = column.split(".").first
|
@@ -120,6 +120,8 @@ module Graphql
|
|
120
120
|
handle_LessNode(node, model)
|
121
121
|
elsif node.instance_of?(RKelly::Nodes::GreaterNode)
|
122
122
|
handle_GreaterNode(node, model)
|
123
|
+
elsif node.instance_of?(RKelly::Nodes::ModulusNode)
|
124
|
+
handle_ModulusNode(node, model)
|
123
125
|
else
|
124
126
|
raise GraphQL::ExecutionError, "Invalid filter: #{node.class} unknown operator"
|
125
127
|
end
|
@@ -174,9 +176,17 @@ module Graphql
|
|
174
176
|
if node.instance_of?(RKelly::Nodes::StringNode)
|
175
177
|
val = node.value.gsub(/^'|'$|^"|"$/, "")
|
176
178
|
if sym_type == :datetime
|
177
|
-
|
179
|
+
begin
|
180
|
+
DateTime.parse(val)
|
181
|
+
rescue
|
182
|
+
val
|
183
|
+
end
|
178
184
|
elsif sym_type == :date
|
179
|
-
|
185
|
+
begin
|
186
|
+
DateTime.parse(val)
|
187
|
+
rescue
|
188
|
+
val
|
189
|
+
end
|
180
190
|
elsif sym_type == :integer
|
181
191
|
# Enums are handled here : We are about to compare a string with an integer column
|
182
192
|
# If the symbol and the value correspond to an existing enum into the model
|
@@ -208,6 +218,7 @@ module Graphql
|
|
208
218
|
|
209
219
|
def handle_NotEqualNode(node, model)
|
210
220
|
arel_field, model, type, value = handle_operator_node(node, model)
|
221
|
+
arel_field.name = arel_field.name.underscore
|
211
222
|
|
212
223
|
if value.nil?
|
213
224
|
model.where.not(arel_field.eq(nil))
|
@@ -220,6 +231,7 @@ module Graphql
|
|
220
231
|
|
221
232
|
def handle_NotStrictEqualNode(node, model)
|
222
233
|
arel_field, model, type, value = handle_operator_node(node, model)
|
234
|
+
arel_field.name = arel_field.name.underscore
|
223
235
|
|
224
236
|
if value.nil?
|
225
237
|
model.where.not(arel_field.eq(nil))
|
@@ -232,6 +244,7 @@ module Graphql
|
|
232
244
|
|
233
245
|
def handle_EqualNode(node, model)
|
234
246
|
arel_field, model, type, value = handle_operator_node(node, model)
|
247
|
+
arel_field.name = arel_field.name.underscore
|
235
248
|
|
236
249
|
if value.nil?
|
237
250
|
model.where(arel_field.eq(nil))
|
@@ -244,6 +257,7 @@ module Graphql
|
|
244
257
|
|
245
258
|
def handle_StrictEqualNode(node, model)
|
246
259
|
arel_field, model, type, value = handle_operator_node(node, model)
|
260
|
+
arel_field.name = arel_field.name.underscore
|
247
261
|
|
248
262
|
if value.nil?
|
249
263
|
model.where(arel_field.eq(nil))
|
@@ -256,24 +270,68 @@ module Graphql
|
|
256
270
|
|
257
271
|
def handle_GreaterOrEqualNode(node, model)
|
258
272
|
arel_field, model, type, value = handle_operator_node(node, model)
|
273
|
+
arel_field.name = arel_field.name.underscore
|
274
|
+
|
259
275
|
model.where(arel_field.gteq(value))
|
260
276
|
end
|
261
277
|
|
262
278
|
def handle_LessOrEqualNode(node, model)
|
263
279
|
arel_field, model, type, value = handle_operator_node(node, model)
|
280
|
+
arel_field.name = arel_field.name.underscore
|
281
|
+
|
264
282
|
model.where(arel_field.lteq(value))
|
265
283
|
end
|
266
284
|
|
267
285
|
def handle_LessNode(node, model)
|
268
286
|
arel_field, model, type, value = handle_operator_node(node, model)
|
287
|
+
arel_field.name = arel_field.name.underscore
|
288
|
+
|
269
289
|
model.where(arel_field.lt(value))
|
270
290
|
end
|
271
291
|
|
272
292
|
def handle_GreaterNode(node, model)
|
273
293
|
arel_field, model, type, value = handle_operator_node(node, model)
|
294
|
+
arel_field.name = arel_field.name.underscore
|
295
|
+
|
274
296
|
model.where(arel_field.gt(value))
|
275
297
|
end
|
276
298
|
|
299
|
+
# Example: "US" should match "US" and "USA" and "AUS"
|
300
|
+
def handle_ModulusNode(node, model)
|
301
|
+
arel_field, model, type, value = handle_operator_node(node, model)
|
302
|
+
arel_field.name = arel_field.name.underscore
|
303
|
+
|
304
|
+
if value.nil?
|
305
|
+
model.where(arel_field.eq(nil))
|
306
|
+
elsif type == :text || type == :string
|
307
|
+
model.where(arel_field.matches("%" + sanitize_sql_like(value) + "%"))
|
308
|
+
elsif type == :datetime
|
309
|
+
if value.instance_of?(DateTime)
|
310
|
+
model.where(arel_field.gteq(value).and(arel_field.lteq(value + 1.day)))
|
311
|
+
else
|
312
|
+
model.where(
|
313
|
+
Arel::Nodes::NamedFunction.new(
|
314
|
+
"CAST",
|
315
|
+
[Arel::Nodes::As.new(arel_field, Arel::Nodes::SqlLiteral.new("text"))]
|
316
|
+
).matches("%" + sanitize_sql_like(value) + "%")
|
317
|
+
)
|
318
|
+
end
|
319
|
+
elsif type == :uuid
|
320
|
+
model.where(
|
321
|
+
Arel::Nodes::NamedFunction.new(
|
322
|
+
"CAST",
|
323
|
+
[Arel::Nodes::As.new(arel_field, Arel::Nodes::SqlLiteral.new("text"))]
|
324
|
+
).matches("%" + sanitize_sql_like(value) + "%")
|
325
|
+
)
|
326
|
+
else
|
327
|
+
model.where(arel_field.eq(value))
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
def uuid_to_string(uuid)
|
332
|
+
uuid.delete("-")
|
333
|
+
end
|
334
|
+
|
277
335
|
def valid_id?(id)
|
278
336
|
valid_uuid?(id) || id.is_a?(Integer)
|
279
337
|
end
|
@@ -291,7 +349,7 @@ module Graphql
|
|
291
349
|
end
|
292
350
|
|
293
351
|
def get_field_type!(model, field_name)
|
294
|
-
field = model.column_for_attribute(field_name.to_sym)
|
352
|
+
field = model.column_for_attribute(field_name.underscore.to_sym)
|
295
353
|
unless field.present?
|
296
354
|
raise GraphQL::ExecutionError, "Invalid filter: #{field_name} is not a field of #{model}"
|
297
355
|
end
|
@@ -299,12 +357,33 @@ module Graphql
|
|
299
357
|
end
|
300
358
|
|
301
359
|
def deep_pluck_to_structs(irep_node)
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
).load_all,
|
360
|
+
attributes = (hash_to_array_of_hashes(parse_fields(irep_node), @model) || []).compact
|
361
|
+
res = plucked_attr_to_structs(
|
362
|
+
DeepPluck::Model.new(@model.visible_for(user: @user), user: @user).add(attributes).load_all,
|
306
363
|
model_name.singularize.camelize.constantize
|
307
364
|
)&.compact
|
365
|
+
res.map do |r|
|
366
|
+
fill_nil_in_openstruct(r, attributes)
|
367
|
+
end
|
368
|
+
res
|
369
|
+
end
|
370
|
+
|
371
|
+
def fill_nil_in_openstruct(struct, fields)
|
372
|
+
fields.each do |field|
|
373
|
+
if field.is_a?(Hash)
|
374
|
+
struct[field.keys.first] ||= OpenStruct.new
|
375
|
+
data = struct[field.keys.first]
|
376
|
+
if data.is_a?(Array)
|
377
|
+
data.each do |s|
|
378
|
+
fill_nil_in_openstruct(s, field.values.first)
|
379
|
+
end
|
380
|
+
else
|
381
|
+
fill_nil_in_openstruct(data, field.values.first)
|
382
|
+
end
|
383
|
+
else
|
384
|
+
struct[field] ||= nil
|
385
|
+
end
|
386
|
+
end
|
308
387
|
end
|
309
388
|
|
310
389
|
def plucked_attr_to_structs(arr, parent_model)
|
@@ -401,5 +480,4 @@ module Graphql
|
|
401
480
|
@model.class.to_s.split("::").first.underscore.pluralize
|
402
481
|
end
|
403
482
|
end
|
404
|
-
|
405
483
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-rails-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- poilon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '0'
|
116
116
|
requirements: []
|
117
|
-
rubygems_version: 3.
|
117
|
+
rubygems_version: 3.1.2
|
118
118
|
signing_key:
|
119
119
|
specification_version: 4
|
120
120
|
summary: Graphql rails api framework to create easily graphql api with rails
|