souls 0.17.8 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of souls might be problematic. Click here for more details.

@@ -0,0 +1,18 @@
1
+ module Souls
2
+ module Generate
3
+ class << self
4
+ ## Generate Model
5
+ def model class_name: "souls"
6
+ file_path = "./app/models/#{class_name.singularize}.rb"
7
+ return "Model already exist! #{file_path}" if File.exist? file_path
8
+ File.open(file_path, "w") do |f|
9
+ f.write <<~EOS
10
+ class #{class_name.camelize} < ActiveRecord::Base
11
+ end
12
+ EOS
13
+ end
14
+ file_path
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,274 @@
1
+ module Souls
2
+ module Generate
3
+ class << self
4
+ ## Generate 4 Mutations - ["create", "update", "delete", "destroy_delete"]
5
+ ## 1.Mutation - Create
6
+ def create_mutation_head class_name: "souls"
7
+ dir_name = "./app/graphql/mutations/#{class_name}"
8
+ FileUtils.mkdir_p dir_name unless Dir.exist? dir_name
9
+ file_path = "./app/graphql/mutations/#{class_name}/create_#{class_name}.rb"
10
+ File.open(file_path, "w") do |new_line|
11
+ new_line.write <<~EOS
12
+ module Mutations
13
+ module #{class_name.camelize}
14
+ class Create#{class_name.camelize} < BaseMutation
15
+ field :#{class_name}_edge, Types::#{class_name.camelize}NodeType, null: false
16
+ field :error, String, null: true
17
+
18
+ EOS
19
+ end
20
+ end
21
+
22
+ def create_mutation_params class_name: "souls"
23
+ file_path = "./app/graphql/mutations/#{class_name}/create_#{class_name}.rb"
24
+ path = "./db/schema.rb"
25
+ @on = false
26
+ @user_exist = false
27
+ @relation_params = []
28
+ File.open(file_path, "a") do |new_line|
29
+ File.open(path, "r") do |f|
30
+ f.each_line.with_index do |line, i|
31
+ if @on
32
+ if line.include?("end") || line.include?("t.index")
33
+ if @user_exist
34
+ new_line.write <<-EOS
35
+
36
+ def resolve **args
37
+ args[:user_id] = context[:user].id
38
+ EOS
39
+ else
40
+ new_line.write <<-EOS
41
+
42
+ def resolve **args
43
+ EOS
44
+ end
45
+ break
46
+ end
47
+ field = "[String]" if line.include?("array: true")
48
+ type, name = line.split(",")[0].gsub("\"", "").scan(/((?<=t\.).+(?=\s)) (.+)/)[0]
49
+ field ||= type_check type
50
+ case name
51
+ when "user_id"
52
+ @user_exist = true
53
+ when /$*_id\z/
54
+ @relation_params << name
55
+ new_line.write " argument :#{name}, String, required: false\n"
56
+ when "created_at", "updated_at"
57
+ next
58
+ else
59
+ new_line.write " argument :#{name}, #{field}, required: false\n"
60
+ end
61
+ end
62
+ @on = true if table_check(line: line, class_name: class_name)
63
+ end
64
+ end
65
+ end
66
+ @relation_params
67
+ end
68
+
69
+ def create_mutation_after_params class_name: "article", relation_params: []
70
+ return false if relation_params.empty?
71
+ file_path = "./app/graphql/mutations/#{class_name}/create_#{class_name}.rb"
72
+ relation_params.each do |params_name|
73
+ File.open(file_path, "a") do |new_line|
74
+ new_line.write " _, args[:#{params_name}] = SoulsApiSchema.from_global_id(args[:#{params_name}])\n"
75
+ end
76
+ end
77
+ true
78
+ end
79
+
80
+ def create_mutation_end class_name: "souls"
81
+ file_path = "./app/graphql/mutations/#{class_name}/create_#{class_name}.rb"
82
+ File.open(file_path, "a") do |new_line|
83
+ new_line.write <<~EOS
84
+ #{class_name} = ::#{class_name.camelize}.new args
85
+ if #{class_name}.save
86
+ { #{class_name}_edge: { node: #{class_name} } }
87
+ else
88
+ { error: #{class_name}.errors.full_messages }
89
+ end
90
+ rescue StandardError => error
91
+ GraphQL::ExecutionError.new error
92
+ end
93
+ end
94
+ end
95
+ end
96
+ EOS
97
+ end
98
+ file_path
99
+ end
100
+
101
+ ## 2.Mutation - Update
102
+ def update_mutation_head class_name: "souls"
103
+ file_path = "./app/graphql/mutations/#{class_name}/update_#{class_name}.rb"
104
+ File.open(file_path, "w") do |new_line|
105
+ new_line.write <<~EOS
106
+ module Mutations
107
+ module #{class_name.camelize}
108
+ class Update#{class_name.camelize} < BaseMutation
109
+ field :#{class_name}_edge, Types::#{class_name.camelize}NodeType, null: false
110
+
111
+ argument :id, String, required: true
112
+ EOS
113
+ end
114
+ end
115
+
116
+ def update_mutation_params class_name: "souls"
117
+ file_path = "./app/graphql/mutations/#{class_name}/update_#{class_name}.rb"
118
+ path = "./db/schema.rb"
119
+ @on = false
120
+ @user_exist = false
121
+ @relation_params = []
122
+ File.open(file_path, "a") do |new_line|
123
+ File.open(path, "r") do |f|
124
+ f.each_line.with_index do |line, i|
125
+ if @on
126
+ if line.include?("end") || line.include?("t.index")
127
+ if @user_exist
128
+ new_line.write <<-EOS
129
+
130
+ def resolve **args
131
+ args[:user_id] = context[:user].id
132
+ _, args[:id] = SoulsApiSchema.from_global_id(args[:id])
133
+ EOS
134
+ else
135
+ new_line.write <<-EOS
136
+
137
+ def resolve **args
138
+ _, args[:id] = SoulsApiSchema.from_global_id(args[:id])
139
+ EOS
140
+ end
141
+ break
142
+ end
143
+ field = "[String]" if line.include?("array: true")
144
+ type, name = line.split(",")[0].gsub("\"", "").scan(/((?<=t\.).+(?=\s)) (.+)/)[0]
145
+ field ||= type_check type
146
+ case name
147
+ when "user_id"
148
+ @user_exist = true
149
+ when /$*_id\z/
150
+ @relation_params << name
151
+ new_line.write " argument :#{name}, String, required: false\n"
152
+ when "created_at", "updated_at"
153
+ next
154
+ else
155
+ new_line.write " argument :#{name}, #{field}, required: false\n"
156
+ end
157
+ end
158
+ @on = true if table_check(line: line, class_name: class_name)
159
+ end
160
+ end
161
+ end
162
+ @relation_params
163
+ end
164
+
165
+ def update_mutation_after_params class_name: "article", relation_params: []
166
+ return false if relation_params.empty?
167
+ file_path = "./app/graphql/mutations/#{class_name}/update_#{class_name}.rb"
168
+ relation_params.each do |params_name|
169
+ File.open(file_path, "a") do |new_line|
170
+ new_line.write " _, args[:#{params_name}] = SoulsApiSchema.from_global_id(args[:#{params_name}])\n"
171
+ end
172
+ end
173
+ true
174
+ end
175
+
176
+ def update_mutation_end class_name: "souls"
177
+ file_path = "./app/graphql/mutations/#{class_name}/update_#{class_name}.rb"
178
+ File.open(file_path, "a") do |new_line|
179
+ new_line.write <<~EOS
180
+ #{class_name} = ::#{class_name.camelize}.find args[:id]
181
+ #{class_name}.update args
182
+ { #{class_name}_edge: { node: ::#{class_name.camelize}.find(args[:id]) } }
183
+ rescue StandardError => error
184
+ GraphQL::ExecutionError.new error
185
+ end
186
+ end
187
+ end
188
+ end
189
+ EOS
190
+ end
191
+ file_path
192
+ end
193
+
194
+ def update_mutation class_name: "souls"
195
+ update_mutation_head class_name: class_name
196
+ relation_params = update_mutation_params class_name: class_name
197
+ update_mutation_after_params class_name: class_name, relation_params: relation_params
198
+ update_mutation_end class_name: class_name
199
+ end
200
+
201
+ # 3. Mutation - Delete
202
+ def delete_mutation class_name: "souls"
203
+ file_path = "./app/graphql/mutations/#{class_name}/delete_#{class_name}.rb"
204
+ File.open(file_path, "w") do |f|
205
+ f.write <<~EOS
206
+ module Mutations
207
+ module #{class_name.camelize}
208
+ class Delete#{class_name.camelize} < BaseMutation
209
+ field :#{class_name}, Types::#{class_name.camelize}Type, null: false
210
+ argument :id, String, required: true
211
+
212
+ def resolve **args
213
+ _, data_id = SoulsApiSchema.from_global_id args[:id]
214
+ #{class_name} = ::#{class_name.camelize}.find data_id
215
+ #{class_name}.update(is_deleted: true)
216
+ { #{class_name}: ::#{class_name.camelize}.find(data_id) }
217
+ rescue StandardError => error
218
+ GraphQL::ExecutionError.new error
219
+ end
220
+ end
221
+ end
222
+ end
223
+ EOS
224
+ end
225
+ file_path
226
+ end
227
+
228
+ # 4. Mutation - Destroy Delete
229
+ def destroy_delete_mutation class_name: "souls"
230
+ file_path = "./app/graphql/mutations/#{class_name}/destroy_delete_#{class_name}.rb"
231
+ File.open(file_path, "w") do |f|
232
+ f.write <<~EOS
233
+ module Mutations
234
+ module #{class_name.camelize}
235
+ class DestroyDelete#{class_name.camelize} < BaseMutation
236
+ field :#{class_name}, Types::#{class_name.camelize}Type, null: false
237
+ argument :id, String, required: true
238
+
239
+ def resolve **args
240
+ _, data_id = SoulsApiSchema.from_global_id args[:id]
241
+ #{class_name} = ::#{class_name.camelize}.find data_id
242
+ #{class_name}.destroy
243
+ { #{class_name}: #{class_name} }
244
+ rescue StandardError => error
245
+ GraphQL::ExecutionError.new error
246
+ end
247
+ end
248
+ end
249
+ end
250
+ EOS
251
+ end
252
+ file_path
253
+ rescue StandardError => error
254
+ puts error
255
+ end
256
+
257
+ def mutation class_name: "souls"
258
+ singularized_class_name = class_name.singularize
259
+
260
+ create_mutation_head class_name: singularized_class_name
261
+ relation_params = create_mutation_params class_name: singularized_class_name
262
+ create_mutation_after_params class_name: singularized_class_name, relation_params: relation_params
263
+ [
264
+ create_mutation_end(class_name: singularized_class_name),
265
+ update_mutation(class_name: singularized_class_name),
266
+ delete_mutation(class_name: singularized_class_name),
267
+ destroy_delete_mutation(class_name: singularized_class_name)
268
+ ]
269
+ rescue StandardError => error
270
+ puts error
271
+ end
272
+ end
273
+ end
274
+ end
@@ -0,0 +1,50 @@
1
+ module Souls
2
+ module Generate
3
+ class << self
4
+ ## Generate Policy
5
+ def policy class_name: "souls"
6
+ dir_name = "./app/policies"
7
+ FileUtils.mkdir_p dir_name unless Dir.exist? dir_name
8
+ file_path = "./app/policies/#{class_name.singularize}_policy.rb"
9
+ File.open(file_path, "w") do |f|
10
+ f.write <<~EOS
11
+ class #{class_name.camelize}Policy < ApplicationPolicy
12
+ def show?
13
+ admin_permissions?
14
+ end
15
+
16
+ def index?
17
+ admin_permissions?
18
+ end
19
+
20
+ def create?
21
+ admin_permissions?
22
+ end
23
+
24
+ def update?
25
+ admin_permissions?
26
+ end
27
+
28
+ def delete?
29
+ admin_permissions?
30
+ end
31
+
32
+ private
33
+
34
+ def staff_permissions?
35
+ @user.master? or @user.admin? or @user.staff?
36
+ end
37
+
38
+ def admin_permissions?
39
+ @user.master? or @user.admin?
40
+ end
41
+ end
42
+ EOS
43
+ end
44
+ file_path
45
+ rescue StandardError => error
46
+ puts error
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,56 @@
1
+ module Souls
2
+ module Generate
3
+ class << self
4
+ ## Generate Query / Queries
5
+ def create_queries class_name: "souls"
6
+ file_path = "./app/graphql/queries/#{class_name.pluralize}.rb"
7
+ File.open(file_path, "w") do |f|
8
+ f.write <<~EOS
9
+ module Queries
10
+ class #{class_name.camelize.pluralize} < Queries::BaseQuery
11
+ type [Types::#{class_name.camelize}Type], null: false
12
+
13
+ def resolve
14
+ ::#{class_name.camelize}.all
15
+ rescue StandardError => error
16
+ GraphQL::ExecutionError.new error
17
+ end
18
+ end
19
+ end
20
+ EOS
21
+ end
22
+ file_path
23
+ end
24
+
25
+ def create_query class_name: "souls"
26
+ file_path = "./app/graphql/queries/#{class_name}.rb"
27
+ File.open(file_path, "w") do |f|
28
+ f.write <<~EOS
29
+ module Queries
30
+ class #{class_name.camelize} < Queries::BaseQuery
31
+ type Types::#{class_name.camelize}Type, null: false
32
+ argument :id, String, required: true
33
+
34
+ def resolve **args
35
+ _, data_id = SoulsApiSchema.from_global_id args[:id]
36
+ ::#{class_name.camelize}.find(data_id)
37
+ rescue StandardError => error
38
+ GraphQL::ExecutionError.new error
39
+ end
40
+ end
41
+ end
42
+ EOS
43
+ file_path
44
+ end
45
+ end
46
+
47
+ def query class_name: "souls"
48
+ singularized_class_name = class_name.singularize
49
+ [
50
+ create_query(class_name: singularized_class_name),
51
+ create_queries(class_name: singularized_class_name)
52
+ ]
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,153 @@
1
+ module Souls
2
+ module Generate
3
+ class << self
4
+ ## Generate Resolver
5
+ def resolver_head class_name: "souls"
6
+ FileUtils.mkdir_p "./app/graphql/resolvers" unless Dir.exist? "./app/graphql/resolvers"
7
+ file_path = "./app/graphql/resolvers/#{class_name.singularize}_search.rb"
8
+ @relation_params = []
9
+ return ["Resolver already exist! #{file_path}"] if File.exist? file_path
10
+ File.open(file_path, "w") do |f|
11
+ f.write <<~EOS
12
+ module Resolvers
13
+ class #{class_name.camelize}Search < Base
14
+ include SearchObject.module(:graphql)
15
+ scope { ::#{class_name.camelize}.all }
16
+ type Types::#{class_name.camelize}Type.connection_type, null: false
17
+ description "Search #{class_name.camelize}"
18
+
19
+ class #{class_name.camelize}Filter < ::Types::BaseInputObject
20
+ argument :OR, [self], required: false
21
+ EOS
22
+ end
23
+ end
24
+
25
+ def resolver_params class_name: "souls"
26
+ file_path = "./app/graphql/resolvers/#{class_name.singularize}_search.rb"
27
+ path = "./db/schema.rb"
28
+ @on = false
29
+ @user_exist = false
30
+ @relation_params = []
31
+ File.open(file_path, "a") do |new_line|
32
+ File.open(path, "r") do |f|
33
+ f.each_line.with_index do |line, i|
34
+ if @on
35
+ if line.include?("end") || line.include?("t.index")
36
+ break
37
+ end
38
+ field = "[String]" if line.include?("array: true")
39
+ type, name = get_type_and_name(line)
40
+ field ||= type_check type
41
+ case name
42
+ when "user_id"
43
+ @user_exist = true
44
+ when /$*_id\z/
45
+ @relation_params << name
46
+ new_line.write " argument :#{name}, String, required: false\n"
47
+ when "created_at", "updated_at"
48
+ next
49
+ else
50
+ new_line.write " argument :#{name}, #{field}, required: false\n"
51
+ end
52
+ end
53
+ @on = true if table_check(line: line, class_name: class_name)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ def resolver_after_params class_name: "souls"
60
+ file_path = "./app/graphql/resolvers/#{class_name.singularize}_search.rb"
61
+ File.open(file_path, "a") do |f|
62
+ f.write <<-EOS
63
+ argument :start_date, String, required: false
64
+ argument :end_date, String, required: false
65
+ end
66
+
67
+ option :filter, type: #{class_name.camelize}Filter, with: :apply_filter
68
+ option :first, type: types.Int, with: :apply_first
69
+ option :skip, type: types.Int, with: :apply_skip
70
+
71
+ def apply_filter(scope, value)
72
+ branches = normalize_filters(value).inject { |a, b| a.or(b) }
73
+ scope.merge branches
74
+ end
75
+
76
+ def normalize_filters(value, branches = [])
77
+ scope = ::#{class_name.camelize}.all
78
+ EOS
79
+ end
80
+ end
81
+
82
+ def resolver_before_end class_name: "souls"
83
+ file_path = "./app/graphql/resolvers/#{class_name.singularize}_search.rb"
84
+ path = "./db/schema.rb"
85
+ @on = false
86
+ @user_exist = false
87
+ @relation_params = []
88
+ File.open(file_path, "a") do |new_line|
89
+ File.open(path, "r") do |f|
90
+ f.each_line.with_index do |line, i|
91
+ if @on
92
+ if line.include?("end") || line.include?("t.index")
93
+ break
94
+ end
95
+ type, name = get_type_and_name(line)
96
+ if line.include?("array: true")
97
+ new_line.write " scope = scope.where(\"#{name} @> ARRAY[?]::text[]\", value[:#{name}]) if value[:#{name}]\n"
98
+ next
99
+ end
100
+ case name
101
+ when "user_id"
102
+ @user_exist = true
103
+ when /$*_id\z/
104
+ @relation_params << name
105
+ new_line.write " scope = scope.where(#{name}: decode_global_key(value[:#{name}])) if value[:#{name}]\n"
106
+ when "created_at", "updated_at"
107
+ next
108
+ else
109
+ case type
110
+ when "boolean"
111
+ new_line.write " scope = scope.where(#{name}: value[:#{name}]) unless value[:#{name}].nil?\n"
112
+ else
113
+ new_line.write " scope = scope.where(#{name}: value[:#{name}]) if value[:#{name}]\n"
114
+ end
115
+ end
116
+ end
117
+ @on = true if table_check(line: line, class_name: class_name)
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ def resolver_end class_name: "souls"
124
+ file_path = "./app/graphql/resolvers/#{class_name.singularize}_search.rb"
125
+ File.open(file_path, "a") do |f|
126
+ f.write <<~EOS
127
+ scope = scope.where("created_at >= ?", value[:start_date]) if value[:start_date]
128
+ scope = scope.where("created_at <= ?", value[:end_date]) if value[:end_date]
129
+ #{' '}
130
+ branches << scope
131
+ #{' '}
132
+ value[:OR].inject(branches) { |s, v| normalize_filters(v, s) } if value[:OR].present?
133
+ #{' '}
134
+ branches
135
+ end
136
+ end
137
+ end
138
+ EOS
139
+ end
140
+ file_path
141
+ end
142
+
143
+ def resolver class_name: "souls"
144
+ singularized_class_name = class_name.singularize.underscore
145
+ resolver_head class_name: singularized_class_name
146
+ resolver_params class_name: singularized_class_name
147
+ resolver_after_params class_name: singularized_class_name
148
+ resolver_before_end class_name: singularized_class_name
149
+ resolver_end class_name: singularized_class_name
150
+ end
151
+ end
152
+ end
153
+ end