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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3613d8a2bc521ba1e8c8cdcc120b72ac56b5d6db12ac829c21d608605164aef4
4
- data.tar.gz: 8365841223a6f4390e8fdbd870d5f3a48d1982b69dba3d1eb05b385dd54eb509
3
+ metadata.gz: 2eb89c21597bdbc0a59ebe13ec5030d847fd356901600700ae3be29f33c3f54f
4
+ data.tar.gz: a276f011746654e122e7b574707fa1df57590e753ca64ea3d23e232d2fcb356a
5
5
  SHA512:
6
- metadata.gz: 3bb630bcffe4434a46f1e9eeba4ef1f601f6dc77bc0bd1df8089249141b4997e7afc5e8ea8bd018e415cf02ba1b9f1efbef9f86ffe20b4f70bfd9231767fc3f4
7
- data.tar.gz: '09c3d6d3967e433b58746f125ec9071024fe18609f42d91cee150c88017ec63d0c15abd4d0102f19ab042ca3f812298f86482d9575139248dd5ce4b5fb0e3b4a'
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
- DateTime.parse(val)
179
+ begin
180
+ DateTime.parse(val)
181
+ rescue
182
+ val
183
+ end
178
184
  elsif sym_type == :date
179
- Date.parse(val)
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
- plucked_attr_to_structs(
303
- DeepPluck::Model.new(@model.visible_for(user: @user), user: @user).add(
304
- ((hash_to_array_of_hashes(parse_fields(irep_node), @model) || []) + [@to_select_to_add]).compact
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
@@ -1,7 +1,7 @@
1
1
  module Graphql
2
2
  module Rails
3
3
  module Api
4
- VERSION = "0.9.5".freeze
4
+ VERSION = "0.9.7".freeze
5
5
  end
6
6
  end
7
7
  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.5
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-03 00:00:00.000000000 Z
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.3.7
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