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 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