graphql-rails-api 0.9.5 → 0.9.7
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/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
|