graphql-rails-api 0.9.0 → 0.9.1

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: 9c789b39c99efe639f6a7d035d012d28b4d6cff882c4bcfb7c1145ec03ffa7d9
4
- data.tar.gz: 27c85cd1193f34216fe52d9dde5f05e0a5ca87bec25efb24ffc9a72c0be447c0
3
+ metadata.gz: c1751d6f6ae5edf98341bdf30a149cd8aa9ab4dbcb0a627cb25c380cfe15c676
4
+ data.tar.gz: 90c9dc17368d908efb70a8ee55837c3d6b117709762c006eaee18ddcd3a820ff
5
5
  SHA512:
6
- metadata.gz: 8c73593751c6aff011ae081788c1072fbeca7a8b86c0dd736c00c635f4956db56a178dfe3518a6c39a5a7c286cb939675fc67862cfa36b09617a396998e086a9
7
- data.tar.gz: '069beded1ed21d5c0392e4daf48ceae733a6e95f8f022eb5341fd0541e89a5849a8acd3db0f8b59355c08d9ec3479f4860ddb96071fdd95acdd66bc2b8bd110a'
6
+ metadata.gz: 98cd97012f608dea85e6a5417a4d1ab83ddf3cdae9a51473a014a3c4d45769ce928301a9e57ab32a9c65a76df5e3687cead2046e57a829da18a1309ecfc7ff06
7
+ data.tar.gz: d297e02228b4a00c81a9f29eef88c92da12a23698e9e2dc3aa9eab52c3ccf97a471c04aa134d9cb11bb516bc1d2446464ba9b69b8cc0be8d1f84d465deaa2a91
@@ -4,37 +4,110 @@ require 'rkelly'
4
4
  module Graphql
5
5
  class HydrateQuery
6
6
 
7
- def initialize(model, context, order_by: nil, filter: nil, id: nil, user: nil, page: nil, per_page: 10)
7
+ def initialize(model, context, order_by: nil, filter: nil, check_visibility: true, id: nil, user: nil, page: nil, per_page: nil)
8
8
  @context = context
9
9
  @filter = filter
10
10
  @order_by = order_by
11
11
  @model = model
12
12
  @models = [model_name.singularize.camelize]
13
+ @check_visibility = check_visibility
13
14
  @id = id
14
15
  @user = user
15
- @page = page
16
- @per_page = per_page
16
+ @page = page || 1
17
+ @per_page = per_page || 1000
17
18
  end
18
19
 
19
20
  def run
20
- @model = @model.where(transform_filter(@filter)) if @filter
21
- @model = @model.order(@order_by) if @order_by
22
-
23
- @model = @model.limit(@per_page) if @per_page
24
- @model = @model.offset(@per_page * (@page - 1)) if @page
25
-
26
- @model = @model.where(id: @id) if @id
27
- plucked = DeepPluck::Model.new(@model.visible_for(user: @user), user: @user).add(
28
- hash_to_array_of_hashes(parse_fields(@context&.irep_node), @model)
29
- ).load_all
30
- result = plucked_attr_to_structs(plucked, model_name.singularize.camelize.constantize)&.compact
31
- @id ? result.first : result
21
+ if @id
22
+ @model = @model.where(id: @id)
23
+ deep_pluck_to_structs(@context&.irep_node).first
24
+ else
25
+ @model = @model.limit(@per_page)
26
+ @model = @model.offset(@per_page * (@page - 1))
27
+ filter_and_order
28
+ deep_pluck_to_structs(@context&.irep_node)
29
+ end
30
+ end
31
+
32
+ def paginated_run
33
+ filter_and_order
34
+
35
+ @total = @model.length
36
+ @model = @model.limit(@per_page)
37
+ @model = @model.offset(@per_page * (@page - 1))
38
+
39
+ ::Rails.logger.info(@model.to_sql)
40
+ OpenStruct.new(
41
+ data: deep_pluck_to_structs(@context&.irep_node&.typed_children&.values&.first.try(:[], 'data')),
42
+ total_count: @total,
43
+ per_page: @per_page,
44
+ page: @page
45
+ )
46
+ end
47
+
48
+ private
49
+
50
+ def filter_and_order
51
+ if @filter
52
+ transformed_filter = transform_filter(@filter)
53
+ to_join = transformed_filter.split(/AND|OR|like|ilike/).map do |expression|
54
+ expression.strip.split(/!=|=|IS/).first.strip
55
+ end.select { |e| e.include?('.') }.map { |e| e.split('.').first }.map(&:to_sym)
56
+ to_join.reject { |j| j.to_s.pluralize.to_sym == @model.klass.to_s.pluralize.underscore.to_sym }.each do |j|
57
+ @model = @model.left_joins(j).distinct
58
+ end
59
+ transformed_filter = transformed_filter.split(/(AND|OR|like|ilike)/).map do |e|
60
+ arr = e.split(/(!=|=|IS)/)
61
+ if arr.first.include?('.')
62
+ arr.first.split('.').first.pluralize + '.' + arr.first.split('.').last + arr[1].to_s + arr[2].to_s
63
+ else
64
+ arr.join
65
+ end
66
+ end.join
67
+ @model = @model.where(transformed_filter)
68
+ end
69
+
70
+ return unless @order_by
71
+
72
+ sign = @order_by.split(' ').last.downcase == 'desc' ? 'desc' : 'asc'
73
+ column = @order_by.split(' ').first
74
+ if column.include?('.')
75
+ @model = @model.left_joins(column.split('.').first.to_sym)
76
+ string_type = %i[string text].include?(
77
+ evaluate_model(@model, column.split('.').first).columns_hash[column.split('.').last]&.type
78
+ )
79
+
80
+ @to_select_to_add = if string_type
81
+ "upper(#{column.split('.').first.pluralize}.#{column.split('.').last})"
82
+ else
83
+ column.split('.').first.pluralize + '.' + column.split('.').last
84
+ end
85
+ @model = @model.select(@to_select_to_add)
86
+ column = "#{column.split('.').first.pluralize}.#{column.split('.').last}"
87
+ @model = @model.order(Arel.sql("#{string_type ? "upper(#{column})" : column} #{sign}"))
88
+ elsif @order_by
89
+ column = "upper(#{model_name}.#{column})" if %i[string text].include?(@model.columns_hash[column]&.type)
90
+ @model = @model.order("#{column} #{sign}")
91
+ end
32
92
  end
33
93
 
34
94
  def transform_filter(filter)
35
- parsed_filter = RKelly::Parser.new.parse(filter.gsub('like', ' | ')).to_ecma
36
- parsed_filter.gsub(' | ', ' like ').
37
- gsub('||', 'OR').gsub('&&', 'AND').gsub('===', '=').gsub('==', '=').delete(';')
95
+ parsed_filter = RKelly::Parser.new.parse(filter.gsub('like', ' | '))&.to_ecma
96
+ return '' unless parsed_filter
97
+
98
+ @model.klass.defined_enums.values.reduce(:merge)&.each { |k, v| parsed_filter.gsub!("= #{k}", "= #{v}") }
99
+ parsed_filter.gsub(' | ', ' ilike ').gsub('||', 'OR').gsub('&&', 'AND').gsub('===', '=').gsub('==', '=').gsub(
100
+ '!= null', 'IS NOT NULL'
101
+ ).gsub('= null', 'IS NULL').delete(';')
102
+ end
103
+
104
+ def deep_pluck_to_structs(irep_node)
105
+ plucked_attr_to_structs(
106
+ DeepPluck::Model.new(@model.visible_for(user: @user), user: @user).add(
107
+ ((hash_to_array_of_hashes(parse_fields(irep_node), @model) || []) + [@to_select_to_add]).compact
108
+ ).load_all,
109
+ model_name.singularize.camelize.constantize
110
+ )&.compact
38
111
  end
39
112
 
40
113
  def plucked_attr_to_structs(arr, parent_model)
@@ -104,9 +177,7 @@ module Graphql
104
177
 
105
178
  def parse_fields(irep_node)
106
179
  fields = irep_node&.scoped_children&.values&.first
107
- if fields.key?('edges')
108
- fields = fields['edges'].scoped_children.values.first['node']&.scoped_children&.values&.first
109
- end
180
+ fields = fields['edges'].scoped_children.values.first['node']&.scoped_children&.values&.first if fields&.key?('edges')
110
181
  return if fields.blank?
111
182
 
112
183
  fields.each_with_object({}) do |(k, v), h|
@@ -1,7 +1,7 @@
1
1
  module Graphql
2
2
  module Rails
3
3
  module Api
4
- VERSION = '0.9.0'.freeze
4
+ VERSION = '0.9.1'.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.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - poilon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-12 00:00:00.000000000 Z
11
+ date: 2022-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -42,22 +42,22 @@ dependencies:
42
42
  name: rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: 7.0.0
48
45
  - - ">="
49
46
  - !ruby/object:Gem::Version
50
47
  version: 6.1.4
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: 7.0.0
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - "~>"
56
- - !ruby/object:Gem::Version
57
- version: 7.0.0
58
55
  - - ">="
59
56
  - !ruby/object:Gem::Version
60
57
  version: 6.1.4
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 7.0.0
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rkelly-remix
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -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.1.2
117
+ rubygems_version: 3.0.8
118
118
  signing_key:
119
119
  specification_version: 4
120
120
  summary: Graphql rails api framework to create easily graphql api with rails