graphql-rails-api 0.9.7 → 0.9.8

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: 2eb89c21597bdbc0a59ebe13ec5030d847fd356901600700ae3be29f33c3f54f
4
- data.tar.gz: a276f011746654e122e7b574707fa1df57590e753ca64ea3d23e232d2fcb356a
3
+ metadata.gz: acf07a5b93e2cd63fd09cd0cd8081a5ee75f89e085f48405dfa197e5684f4b72
4
+ data.tar.gz: 7bb866a32483d31ba22a7283915484154b91f0720dab5fbb6b4477e298b8c670
5
5
  SHA512:
6
- metadata.gz: bf96a1ce8f8f0d18a7d5ca9844fa3802c84664e05e1a790a257007cfd71444fff823a2b916b0e1e436694e9402edb38a484a1fe58c26b33e9b86ecbd551eee13
7
- data.tar.gz: 438629cf1b5213e919639f60b52b2f8f64b02d086578570fc8924bedf770d5826af51506b6191d458dc4ba851839cd11f1abbb44775b3579b993aa336da87056
6
+ metadata.gz: 2d413ded07452606a26e58d23e7b6e000cf48dfcf990e7b6d68329587ac5e19a0aa7ad6d336fb193ac90a67cf4a2d63573b5dbc9add3a804f05cb26df5ad26a4
7
+ data.tar.gz: 030c84889982ffc7dc9bbe498079aa418851c314b299f1bec681b56cd6cfc7f12660ddcb24c99d42bbf4fc956a3ecb8f843c57fd039391d3d4f419f52bae8304
data/README.md CHANGED
@@ -227,24 +227,6 @@ mutation($id: String!) {
227
227
  }
228
228
  ```
229
229
 
230
- bulk_create mutation:
231
- ```gql
232
- mutation($cities: [CityInputType]!) {
233
- bulk_create_city(cities: $cities) {
234
- id
235
- }
236
- }
237
- ```
238
-
239
- bulk_update:
240
- ```gql
241
- mutation($cities: [CityInputType]!) {
242
- bulk_update_city(cities: $cities) {
243
- id
244
- }
245
- }
246
- ```
247
-
248
230
  You can override the default application service for all mutation by defining your own method into the corresponding graphql service:
249
231
 
250
232
  Example:
@@ -0,0 +1,4 @@
1
+ class Auth0AuthenticationGenerator < Rails::Generators::NamedBase
2
+ def create_authentication_files
3
+ end
4
+ end
@@ -1,20 +1,19 @@
1
1
  class GraphqlAddFieldsGenerator < Rails::Generators::NamedBase
2
-
3
2
  %i[
4
3
  migration model mutations service graphql_input_type
5
- graphql_type propagation connection migrate
4
+ graphql_type propagation migrate
6
5
  ].each do |opt|
7
6
  class_option(opt, type: :boolean, default: true)
8
7
  end
9
8
 
10
9
  TYPES_MAPPING = {
11
- 'id' => 'String',
12
- 'uuid' => 'String',
13
- 'boolean' => 'Boolean',
14
- 'float' => 'Float',
15
- 'decimal' => 'Float',
16
- 'integer' => 'Integer',
17
- 'bigint' => 'Integer'
10
+ "id" => "String",
11
+ "uuid" => "String",
12
+ "boolean" => "Boolean",
13
+ "float" => "Float",
14
+ "decimal" => "Float",
15
+ "integer" => "Integer",
16
+ "bigint" => "Integer"
18
17
  }.freeze
19
18
 
20
19
  def create_graphql_files
@@ -41,7 +40,7 @@ class GraphqlAddFieldsGenerator < Rails::Generators::NamedBase
41
40
  private
42
41
 
43
42
  def types_mapping(type)
44
- TYPES_MAPPING[type] || 'String'
43
+ TYPES_MAPPING[type] || "String"
45
44
  end
46
45
 
47
46
  def complete_graphql_input_type
@@ -57,8 +56,8 @@ class GraphqlAddFieldsGenerator < Rails::Generators::NamedBase
57
56
  end
58
57
 
59
58
  def parse_args
60
- @id_db_type = 'uuid'
61
- @id_type = 'String'
59
+ @id_db_type = "uuid"
60
+ @id_type = "String"
62
61
 
63
62
  @resource = file_name.singularize
64
63
  @has_many = []
@@ -67,23 +66,23 @@ class GraphqlAddFieldsGenerator < Rails::Generators::NamedBase
67
66
  @belongs_to_fields = {}
68
67
 
69
68
  @args = args.each_with_object({}) do |f, hash|
70
- next if f.split(':').count != 2
71
-
72
- case f.split(':').first
73
- when 'belongs_to' then
74
- hash["#{f.split(':').last.singularize}_id"] = @id_db_type
75
- @belongs_to_fields["#{f.split(':').last.singularize}_id"] = @id_db_type
76
- when 'has_many' then @has_many << f.split(':').last.pluralize
77
- when 'many_to_many' then @many_to_many << f.split(':').last.pluralize
69
+ next if f.split(":").count != 2
70
+
71
+ case f.split(":").first
72
+ when "belongs_to"
73
+ hash["#{f.split(":").last.singularize}_id"] = @id_db_type
74
+ @belongs_to_fields["#{f.split(":").last.singularize}_id"] = @id_db_type
75
+ when "has_many" then @has_many << f.split(":").last.pluralize
76
+ when "many_to_many" then @many_to_many << f.split(":").last.pluralize
78
77
  else
79
- hash[f.split(':').first] = f.split(':').last
78
+ hash[f.split(":").first] = f.split(":").last
80
79
  end
81
80
  end
82
81
 
83
82
  @fields_to_migration = @args.map do |f|
84
- "add_column :#{@resource.pluralize}, :#{f.join(', :')}"
83
+ "add_column :#{@resource.pluralize}, :#{f.join(", :")}"
85
84
  end.join("\n ")
86
- @named_fields = @args.keys.join('_')
85
+ @named_fields = @args.keys.join("_")
87
86
  end
88
87
 
89
88
  def generate_migration(resource, fields)
@@ -159,8 +158,8 @@ class GraphqlAddFieldsGenerator < Rails::Generators::NamedBase
159
158
  add_belongs_to_field_to_type(resource, f)
160
159
  end
161
160
  @belongs_to_fields.each do |f, _|
162
- add_has_many_fields_to_type(f.gsub('_id', ''), resource)
163
- add_belongs_to_field_to_type(f.gsub('_id', ''), resource)
161
+ add_has_many_fields_to_type(f.gsub("_id", ""), resource)
162
+ add_belongs_to_field_to_type(f.gsub("_id", ""), resource)
164
163
  end
165
164
  end
166
165
 
@@ -179,9 +178,9 @@ class GraphqlAddFieldsGenerator < Rails::Generators::NamedBase
179
178
  @many_to_many.each do |field|
180
179
  generate_create_migration(
181
180
  "#{resource}_#{field}",
182
- <<-STRING
183
- t.#{@id_db_type} :#{resource.underscore.singularize}_id
184
- t.#{@id_db_type} :#{field.underscore.singularize}_id
181
+ <<~STRING
182
+ t.#{@id_db_type} :#{resource.underscore.singularize}_id
183
+ t.#{@id_db_type} :#{field.underscore.singularize}_id
185
184
  STRING
186
185
  )
187
186
  generate_empty_model("#{resource}_#{field.singularize}")
@@ -203,7 +202,7 @@ t.#{@id_db_type} :#{resource.underscore.singularize}_id
203
202
  add_to_model(field, "belongs_to :#{resource.singularize}")
204
203
  end
205
204
  @belongs_to_fields.each do |k, _|
206
- field = k.gsub('_id', '')
205
+ field = k.gsub("_id", "")
207
206
  add_to_model(field, "has_many :#{resource.pluralize}")
208
207
  add_to_model(resource, "belongs_to :#{field.singularize}")
209
208
  end
@@ -213,14 +212,14 @@ t.#{@id_db_type} :#{resource.underscore.singularize}_id
213
212
  result = args&.map do |k, v|
214
213
  field_name = k
215
214
  field_type = types_mapping(v)
216
- res = "#{input_type ? 'argument' : 'field'} :#{field_name}, #{field_type}, #{input_type ? "required: false" : "null: true"}"
217
- if !input_type && field_name.ends_with?('_id') && @belongs_to_fields.key?(field_name)
218
- res += "\n field :#{field_name.gsub('_id', '')}, " \
219
- "#{field_name.gsub('_id', '').pluralize.camelize}::Type"
215
+ res = "#{input_type ? "argument" : "field"} :#{field_name}, #{field_type}, #{input_type ? "required: false" : "null: true"}"
216
+ if !input_type && field_name.ends_with?("_id") && @belongs_to_fields.key?(field_name)
217
+ res += "\n field :#{field_name.gsub("_id", "")}, " \
218
+ "#{field_name.gsub("_id", "").pluralize.camelize}::Type"
220
219
  end
221
220
  res
222
221
  end&.join("\n " + (" " if input_type).to_s)
223
- input_type ? result.gsub("field :id, #{@id_type}, null: false\n", '') : result
222
+ input_type ? result.gsub("field :id, #{@id_type}, null: false\n", "") : result
224
223
  end
225
224
 
226
225
  # Helpers methods
@@ -238,9 +237,9 @@ t.#{@id_db_type} :#{resource.underscore.singularize}_id
238
237
  line_nb = 0
239
238
  IO.readlines(file).each do |l|
240
239
  line_nb += 1
241
- break if l.include?('ApplicationRecord')
240
+ break if l.include?("ApplicationRecord")
242
241
  end
243
- raise 'Your model must inherit from ApplicationRecord to make it work' if line_nb >= line_count
242
+ raise "Your model must inherit from ApplicationRecord to make it work" if line_nb >= line_count
244
243
 
245
244
  write_at(file_name, line_nb + 1, " #{line}\n")
246
245
  end
@@ -285,7 +284,7 @@ t.#{@id_db_type} :#{resource.underscore.singularize}_id
285
284
  end
286
285
 
287
286
  def write_at(file_name, line, data)
288
- open(file_name, 'r+') do |f|
287
+ open(file_name, "r+") do |f|
289
288
  while (line -= 1).positive?
290
289
  f.readline
291
290
  end
@@ -296,5 +295,4 @@ t.#{@id_db_type} :#{resource.underscore.singularize}_id
296
295
  f.write(rest)
297
296
  end
298
297
  end
299
-
300
298
  end
@@ -1,14 +1,13 @@
1
- require 'graphql/rails/api/config'
1
+ require "graphql/rails/api/config"
2
2
 
3
3
  module GraphqlRailsApi
4
4
  class InstallGenerator < Rails::Generators::Base
5
-
6
- class_option('generate_graphql_route', type: :boolean, default: true)
5
+ class_option("generate_graphql_route", type: :boolean, default: true)
7
6
 
8
7
  def generate_files
9
8
  @app_name = File.basename(Rails.root.to_s).underscore
10
9
 
11
- folder = 'app/graphql/'
10
+ folder = "app/graphql/"
12
11
  FileUtils.mkdir_p(folder) unless File.directory?(folder)
13
12
 
14
13
  write_uuid_extensions_migration
@@ -21,22 +20,23 @@ module GraphqlRailsApi
21
20
 
22
21
  write_controller
23
22
 
24
- system 'rails g graphql_resource user first_name:string last_name:string email:string'
23
+ system "rails g graphql_resource user first_name:string last_name:string email:string"
25
24
 
26
25
  write_application_record_methods
27
26
  write_initializer
28
27
  write_require_application_rb
28
+
29
29
  write_route if options.generate_graphql_route?
30
30
  end
31
31
 
32
32
  private
33
33
 
34
34
  def write_route
35
- route_file = File.read('config/routes.rb')
36
- return if route_file.include?('graphql')
35
+ route_file = File.read("config/routes.rb")
36
+ return if route_file.include?("graphql")
37
37
 
38
38
  File.write(
39
- 'config/routes.rb',
39
+ "config/routes.rb",
40
40
  route_file.gsub(
41
41
  "Rails.application.routes.draw do\n",
42
42
  "Rails.application.routes.draw do\n" \
@@ -47,7 +47,7 @@ module GraphqlRailsApi
47
47
 
48
48
  def write_collection_ids_resolver
49
49
  File.write(
50
- 'app/graphql/collection_ids_resolver.rb',
50
+ "app/graphql/collection_ids_resolver.rb",
51
51
  <<~STRING
52
52
  class CollectionIdsResolver
53
53
 
@@ -65,14 +65,13 @@ module GraphqlRailsApi
65
65
  end
66
66
 
67
67
  def write_application_record_methods
68
- lines_count = File.read('app/models/application_record.rb').lines.count
68
+ lines_count = File.read("app/models/application_record.rb").lines.count
69
69
 
70
- return if File.read('app/models/application_record.rb').include?('def self.visible_for')
70
+ return if File.read("app/models/application_record.rb").include?("def self.visible_for")
71
71
  write_at(
72
- 'app/models/application_record.rb',
72
+ "app/models/application_record.rb",
73
73
  lines_count,
74
74
  <<-STRING
75
-
76
75
  def self.visible_for(*)
77
76
  all
78
77
  end
@@ -82,17 +81,17 @@ module GraphqlRailsApi
82
81
  end
83
82
 
84
83
 
85
- STRING
86
- )
87
- end
84
+ STRING
85
+ )
86
+ end
88
87
 
89
88
  def write_require_application_rb
90
- write_at('config/application.rb', 5, "require 'graphql/hydrate_query'\nrequire 'rkelly'\nrequire 'graphql'\n")
89
+ write_at("config/application.rb", 5, "require 'graphql/hydrate_query'\nrequire 'rkelly'\nrequire 'graphql'\n")
91
90
  end
92
91
 
93
92
  def write_uuid_extensions_migration
94
- system('bundle exec rails generate migration uuid_pg_extensions --skip')
95
- migration_file = Dir.glob('db/migrate/*uuid_pg_extensions*').last
93
+ system("bundle exec rails generate migration uuid_pg_extensions --skip")
94
+ migration_file = Dir.glob("db/migrate/*uuid_pg_extensions*").last
96
95
  File.write(
97
96
  migration_file,
98
97
  <<~STRING
@@ -109,7 +108,7 @@ end
109
108
 
110
109
  def write_initializer
111
110
  File.write(
112
- 'config/initializers/graphql_rails_api_config.rb',
111
+ "config/initializers/graphql_rails_api_config.rb",
113
112
  <<~STRING
114
113
  require 'graphql/rails/api/config'
115
114
 
@@ -120,7 +119,7 @@ end
120
119
 
121
120
  def write_controller
122
121
  File.write(
123
- 'app/controllers/graphql_controller.rb',
122
+ "app/controllers/graphql_controller.rb",
124
123
  <<~STRING
125
124
  class GraphqlController < ApplicationController
126
125
 
@@ -162,7 +161,7 @@ end
162
161
 
163
162
  def write_mutation_type
164
163
  File.write(
165
- 'app/graphql/mutation_type.rb',
164
+ "app/graphql/mutation_type.rb",
166
165
  <<~'STRING'
167
166
  class MutationType < GraphQL::Schema::Object
168
167
  graphql_name "Mutation"
@@ -183,7 +182,7 @@ end
183
182
 
184
183
  def write_query_type
185
184
  File.write(
186
- 'app/graphql/query_type.rb',
185
+ "app/graphql/query_type.rb",
187
186
  <<~'STRING'
188
187
  class QueryType < GraphQL::Schema::Object
189
188
  description "The query root of this schema"
@@ -263,152 +262,152 @@ end
263
262
  File.write(
264
263
  "app/graphql/#{@app_name}_schema.rb",
265
264
  <<~STRING
266
- class #{@app_name.camelize}Schema < GraphQL::Schema
267
- query QueryType
268
- mutation MutationType
269
- max_depth 15
270
-
271
- def self.type_error(err, query_ctx)
272
- type_error_logger = Logger.new("#{Rails.root}/log/graphql_type_errors.log")
273
-
274
- type_error_logger.error(
275
- "#{err} for #{query_ctx.query.query_string} with #{query_ctx.query.provided_variables}"
276
- )
277
- end
265
+ class #{@app_name.camelize}Schema < GraphQL::Schema
266
+ query QueryType
267
+ mutation MutationType
268
+ max_depth 15
269
+
270
+ def self.type_error(err, query_ctx)
271
+ type_error_logger = Logger.new("#{Rails.root}/log/graphql_type_errors.log")
272
+
273
+ type_error_logger.error(
274
+ "#{err} for #{query_ctx.query.query_string} with #{query_ctx.query.provided_variables}"
275
+ )
276
+ end
277
+ end
278
+ <<~STRING
279
+ )
278
280
  end
279
- <<~STRING
280
- )
281
- end
282
-
283
- def write_service
284
- File.write(
285
- 'app/graphql/application_service.rb',
286
- <<~'STRING'
287
- class ApplicationService
288
281
 
289
- attr_accessor :params, :object, :fields, :user
290
-
291
- def initialize(params: {}, object: nil, object_id: nil, user: nil, context: nil)
292
- @params = params.is_a?(Array) ? params.map { |p| p.to_h.symbolize_keys } : params.to_h.symbolize_keys
293
- @context = context
294
- @object = object || (object_id && model.visible_for(user: user).find_by(id: object_id))
295
- @object_id = object_id
296
- @user = user
297
- end
298
-
299
- def self.call(resource, meth)
300
- lambda { |_obj, args, context|
301
- params = args && args[resource] ? args[resource] : args
302
- "#{resource.to_s.pluralize.camelize.constantize}::Service".constantize.new(
303
- params: params, user: context[:current_user],
304
- object_id: args[:id], context: context
305
- ).send(meth)
306
- }
307
- end
308
-
309
- def index
310
- Graphql::HydrateQuery.new(
311
- model.all,
312
- @context,
313
- order_by: params[:order_by],
314
- filter: params[:filter],
315
- per_page: params[:per_page],
316
- page: params[:page],
317
- user: user
318
- ).run.compact
319
- end
320
-
321
- def show
322
- object = Graphql::HydrateQuery.new(model.all, @context, user: user, id: params[:id]).run
323
- return not_allowed if object.blank?
324
-
325
- object
326
- end
327
-
328
- def create
329
- object = model.new(params.select { |p| model.new.respond_to?(p) })
330
- return not_allowed if not_allowed_to_create_resource(object)
331
-
332
- if object.save
333
- { singular_resource => Graphql::HydrateQuery.new(model.all, @context, user: user, id: object.id).run }
334
- else
335
- graphql_error(object.errors.full_messages.join(', '))
336
- end
337
- end
338
-
339
- def update
340
- return not_allowed if write_not_allowed
341
-
342
- if object.update_attributes(params)
343
- { singular_resource => Graphql::HydrateQuery.new(model.all, @context, user: user, id: object.id).run }
344
- else
345
- graphql_error(object.errors.full_messages.join(', '))
346
- end
347
- end
348
-
349
- def destroy
350
- object = model.find_by(id: params[:id])
351
- return not_allowed if write_not_allowed
352
-
353
- if object.destroy
354
- { singular_resource => object.attributes }
355
- else
356
- graphql_error(object.errors.full_messages.join(', '))
357
- end
358
- end
359
-
360
- private
361
-
362
- def write_not_allowed
363
- !model.visible_for(user: user).include?(object) if object
364
- end
365
-
366
- def access_not_allowed
367
- !model.visible_for(user: user).include?(object) if object
368
- end
369
-
370
- def not_allowed
371
- graphql_error('403 - Not allowed')
372
- end
373
-
374
- def graphql_error(message)
375
- GraphQL::ExecutionError.new(message)
376
- end
377
-
378
- def singular_resource
379
- resource_name.singularize
380
- end
381
-
382
- def model
383
- singular_resource.camelize.constantize
384
- end
385
-
386
- def resource_name
387
- self.class.to_s.split(':').first.underscore
388
- end
389
-
390
- def not_allowed_to_create_resource(created_resource)
391
- params.select { |k, _| k.to_s.end_with?('_id') }.each do |belongs_relation, rel_id|
392
- klass = created_resource.class.reflect_on_association(belongs_relation.to_s.gsub('_id', '')).klass
393
- return true if rel_id.present? && !klass.visible_for(user: user).pluck(:id).include?(rel_id)
394
- end
395
-
396
- params.select { |k, _| k.to_s.end_with?('_ids') }.each do |many_relation, rel_ids|
397
- klass = created_resource.class.reflect_on_association(many_relation.to_s.gsub('_ids', '').pluralize).klass
398
- ids = klass.visible_for(user: user).pluck(:id)
399
- rel_ids.each { |id| return true if id.present? && !ids.include?(id) }
400
- end
401
- false
402
- end
403
-
404
- end
282
+ def write_service
283
+ File.write(
284
+ 'app/graphql/application_service.rb',
285
+ <<~'STRING'
286
+ class ApplicationService
287
+
288
+ attr_accessor :params, :object, :fields, :user
289
+
290
+ def initialize(params: {}, object: nil, object_id: nil, user: nil, context: nil)
291
+ @params = params.is_a?(Array) ? params.map { |p| p.to_h.symbolize_keys } : params.to_h.symbolize_keys
292
+ @context = context
293
+ @object = object || (object_id && model.visible_for(user: user).find_by(id: object_id))
294
+ @object_id = object_id
295
+ @user = user
296
+ end
297
+
298
+ def self.call(resource, meth)
299
+ lambda { |_obj, args, context|
300
+ params = args && args[resource] ? args[resource] : args
301
+ "#{resource.to_s.pluralize.camelize.constantize}::Service".constantize.new(
302
+ params: params, user: context[:current_user],
303
+ object_id: args[:id], context: context
304
+ ).send(meth)
305
+ }
306
+ end
307
+
308
+ def index
309
+ Graphql::HydrateQuery.new(
310
+ model.all,
311
+ @context,
312
+ order_by: params[:order_by],
313
+ filter: params[:filter],
314
+ per_page: params[:per_page],
315
+ page: params[:page],
316
+ user: user
317
+ ).run.compact
318
+ end
319
+
320
+ def show
321
+ object = Graphql::HydrateQuery.new(model.all, @context, user: user, id: params[:id]).run
322
+ return not_allowed if object.blank?
323
+
324
+ object
325
+ end
326
+
327
+ def create
328
+ object = model.new(params.select { |p| model.new.respond_to?(p) })
329
+ return not_allowed if not_allowed_to_create_resource(object)
330
+
331
+ if object.save
332
+ { singular_resource => Graphql::HydrateQuery.new(model.all, @context, user: user, id: object.id).run }
333
+ else
334
+ graphql_error(object.errors.full_messages.join(', '))
335
+ end
336
+ end
337
+
338
+ def update
339
+ return not_allowed if write_not_allowed
340
+
341
+ if object.update_attributes(params)
342
+ { singular_resource => Graphql::HydrateQuery.new(model.all, @context, user: user, id: object.id).run }
343
+ else
344
+ graphql_error(object.errors.full_messages.join(', '))
345
+ end
346
+ end
347
+
348
+ def destroy
349
+ object = model.find_by(id: params[:id])
350
+ return not_allowed if write_not_allowed
351
+
352
+ if object.destroy
353
+ { singular_resource => object.attributes }
354
+ else
355
+ graphql_error(object.errors.full_messages.join(', '))
356
+ end
357
+ end
358
+
359
+ private
360
+
361
+ def write_not_allowed
362
+ !model.visible_for(user: user).include?(object) if object
363
+ end
364
+
365
+ def access_not_allowed
366
+ !model.visible_for(user: user).include?(object) if object
367
+ end
368
+
369
+ def not_allowed
370
+ graphql_error('403 - Not allowed')
371
+ end
372
+
373
+ def graphql_error(message)
374
+ GraphQL::ExecutionError.new(message)
375
+ end
376
+
377
+ def singular_resource
378
+ resource_name.singularize
379
+ end
380
+
381
+ def model
382
+ singular_resource.camelize.constantize
383
+ end
384
+
385
+ def resource_name
386
+ self.class.to_s.split(':').first.underscore
387
+ end
388
+
389
+ def not_allowed_to_create_resource(created_resource)
390
+ params.select { |k, _| k.to_s.end_with?('_id') }.each do |belongs_relation, rel_id|
391
+ klass = created_resource.class.reflect_on_association(belongs_relation.to_s.gsub('_id', '')).klass
392
+ return true if rel_id.present? && !klass.visible_for(user: user).pluck(:id).include?(rel_id)
393
+ end
394
+
395
+ params.select { |k, _| k.to_s.end_with?('_ids') }.each do |many_relation, rel_ids|
396
+ klass = created_resource.class.reflect_on_association(many_relation.to_s.gsub('_ids', '').pluralize).klass
397
+ ids = klass.visible_for(user: user).pluck(:id)
398
+ rel_ids.each { |id| return true if id.present? && !ids.include?(id) }
399
+ end
400
+ false
401
+ end
402
+
403
+ end
405
404
 
406
405
  STRING
407
406
  )
408
407
  end
409
408
 
410
409
  def write_at(file_name, line, data)
411
- open(file_name, 'r+') do |f|
410
+ open(file_name, "r+") do |f|
412
411
  while (line -= 1).positive?
413
412
  f.readline
414
413
  end
@@ -419,6 +418,5 @@ end
419
418
  f.write rest
420
419
  end
421
420
  end
422
-
423
421
  end
424
422
  end
@@ -451,11 +451,12 @@ module Graphql
451
451
  end
452
452
 
453
453
  def irep_node(name, paginated: false)
454
- child = @context.query.lookahead.ast_nodes.first.children[@context[:query_index]]
454
+ children = @context.query.lookahead.ast_nodes.first.children[@context[:query_index]].children
455
455
  result = if paginated
456
- child.children.find { |n| n.name == "data" }.children
456
+ children.find { |n| n.name == "data" }.children
457
457
  else
458
- child.children
458
+ prepend = children.find { |n| n.name == model_name.singularize }
459
+ prepend.present? ? prepend.children : children
459
460
  end
460
461
  @context[:query_index] += 1
461
462
  result
@@ -471,7 +472,7 @@ module Graphql
471
472
 
472
473
  return if fields.blank?
473
474
 
474
- fields.each_with_object({}) do |node, h|
475
+ res = fields.each_with_object({}) do |node, h|
475
476
  h[node.name.underscore] = node.children.blank? ? nil : parse_fields(node.children)
476
477
  end
477
478
  end
@@ -1,7 +1,7 @@
1
1
  module Graphql
2
2
  module Rails
3
3
  module Api
4
- VERSION = "0.9.7".freeze
4
+ VERSION = "0.9.8".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.7
4
+ version: 0.9.8
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-09 00:00:00.000000000 Z
11
+ date: 2022-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -83,11 +83,8 @@ files:
83
83
  - MIT-LICENSE
84
84
  - README.md
85
85
  - Rakefile
86
+ - lib/generators/auth0_authentication/auth0_authentication_generator.rb
86
87
  - lib/generators/graphql_add_fields/graphql_add_fields_generator.rb
87
- - lib/generators/graphql_all_connections/graphql_all_connections_generator.rb
88
- - lib/generators/graphql_mutations/graphql_bulk_create_mutations_generator.rb
89
- - lib/generators/graphql_mutations/graphql_bulk_update_mutations_generator.rb
90
- - lib/generators/graphql_mutations/graphql_mutations_generator.rb
91
88
  - lib/generators/graphql_rails_api/install_generator.rb
92
89
  - lib/generators/graphql_resource/USAGE
93
90
  - lib/generators/graphql_resource/graphql_resource_generator.rb
@@ -1,26 +0,0 @@
1
- class GraphqlAllConnectionsGenerator < Rails::Generators::NamedBase
2
-
3
- def generate
4
- Graphql::Rails::Api::Config.query_resources.each do |resource|
5
- dir = "app/graphql/#{resource.pluralize}"
6
- generate_connection(dir, resource) if Dir.exist?(dir)
7
- end
8
- end
9
-
10
- def generate_connection(dir, resource)
11
- FileUtils.mkdir_p(dir) unless File.directory?(dir)
12
- File.write(
13
- "#{dir}/connection.rb",
14
- <<~STRING
15
- #{resource.pluralize.camelize}::Connection = #{resource.pluralize.camelize}::Type.define_connection do
16
- name '#{resource.camelize}Connection'
17
-
18
- field :total_count, types.Int do
19
- resolve ->(obj, _, _) { obj.nodes.count }
20
- end
21
- end
22
- STRING
23
- )
24
- end
25
-
26
- end
@@ -1,30 +0,0 @@
1
- class GraphqlBulkCreateMutationsGenerator < Rails::Generators::NamedBase
2
-
3
- def generate
4
- Graphql::Rails::Api::Config.query_resources.each do |resource|
5
- dir = "#{Rails.root}/app/graphql/#{resource.pluralize}/mutations"
6
- generate_bulk_create_mutation(dir, resource) if Dir.exist?(dir)
7
- end
8
- end
9
-
10
- def generate_bulk_create_mutation(dir, resource)
11
- File.write(
12
- "#{dir}/bulk_create.rb",
13
- <<~STRING
14
- #{resource_class(resource)}::Mutations::BulkCreate = GraphQL::Field.define do
15
- description 'creates some #{resource_class(resource).pluralize}'
16
- type types[#{resource_class(resource)}::Type]
17
-
18
- argument :#{resource}, types[#{resource_class(resource)}::Mutations::InputType]
19
-
20
- resolve ApplicationService.call(:#{resource}, :bulk_create)
21
- end
22
- STRING
23
- )
24
- end
25
-
26
- def resource_class(resource)
27
- resource.pluralize.camelize
28
- end
29
-
30
- end
@@ -1,30 +0,0 @@
1
- class GraphqlBulkUpdateMutationsGenerator < Rails::Generators::NamedBase
2
-
3
- def generate
4
- Graphql::Rails::Api::Config.query_resources.each do |resource|
5
- dir = "#{Rails.root}/app/graphql/#{resource.pluralize}/mutations"
6
- generate_bulk_update_mutation(dir, resource) if Dir.exist?(dir)
7
- end
8
- end
9
-
10
- def generate_bulk_update_mutation(dir, resource)
11
- File.write(
12
- "#{dir}/bulk_update.rb",
13
- <<~STRING
14
- #{resource_class(resource)}::Mutations::BulkUpdate = GraphQL::Field.define do
15
- description 'Updates some #{resource_class(resource).pluralize}'
16
- type types[#{resource_class(resource)}::Type]
17
-
18
- argument :#{resource}, types[#{resource_class(resource)}::Mutations::InputType]
19
-
20
- resolve ApplicationService.call(:#{resource}, :bulk_update)
21
- end
22
- STRING
23
- )
24
- end
25
-
26
- def resource_class(resource)
27
- resource.pluralize.camelize
28
- end
29
-
30
- end
@@ -1,92 +0,0 @@
1
- class GraphqlMutationsGenerator < Rails::Generators::NamedBase
2
- def generate
3
- resource = file_name.underscore.singularize
4
- dir = "app/graphql/#{resource.pluralize}/mutations"
5
- FileUtils.mkdir_p(dir) unless File.directory?(dir)
6
- generate_create_mutation(dir, resource)
7
- generate_update_mutation(dir, resource)
8
- generate_destroy_mutation(dir, resource)
9
- end
10
-
11
- private
12
-
13
- def generate_create_mutation(dir, resource)
14
- File.write(
15
- "#{dir}/create.rb",
16
- <<~STRING
17
- module #{resource_class(resource)}
18
- module Mutations
19
- class Create < GraphQL::Schema::Mutation
20
- graphql_name "Create#{resource_class(resource)}"
21
- description "Create a #{resource_class(resource).singularize}"
22
-
23
- field :errors, [String], null: true
24
- field :#{resource}, #{resource_class(resource)}::Type, null: true
25
-
26
- argument :attributes, #{resource_class(resource)}::Mutations::InputType, required: false
27
-
28
- def resolve(attributes:)
29
- ApplicationService.call(:#{resource}, :create, context, attributes)
30
- end
31
- end
32
- end
33
- end
34
- STRING
35
- )
36
- end
37
-
38
- def generate_update_mutation(dir, resource)
39
- File.write(
40
- "#{dir}/update.rb",
41
- <<~STRING
42
- module #{resource_class(resource)}
43
- module Mutations
44
- class Update < GraphQL::Schema::Mutation
45
- graphql_name "Update#{resource_class(resource)}"
46
- description "Update a #{resource_class(resource).singularize}"
47
-
48
- field :errors, [String], null: true
49
- field :#{resource}, #{resource_class(resource)}::Type, null: true
50
-
51
- argument :id, String, required: true
52
- argument :attributes, #{resource_class(resource)}::Mutations::InputType, required: false
53
-
54
- def resolve(id:, attributes:)
55
- ApplicationService.call(:#{resource}, :update, context, id, attributes)
56
- end
57
- end
58
- end
59
- end
60
- STRING
61
- )
62
- end
63
-
64
- def generate_destroy_mutation(dir, resource)
65
- File.write(
66
- "#{dir}/destroy.rb",
67
- <<~STRING
68
- module #{resource_class(resource)}
69
- module Mutations
70
- class Destroy < GraphQL::Schema::Mutation
71
- graphql_name "Destroy#{resource_class(resource)}"
72
- description "Destroy a #{resource_class(resource).singularize}"
73
-
74
- field :errors, [String], null: true
75
- field :#{resource}, #{resource_class(resource)}::Type, null: true
76
-
77
- argument :id, String, required: true
78
-
79
- def resolve(id:)
80
- ApplicationService.call(:#{resource}, :destroy, context, id)
81
- end
82
- end
83
- end
84
- end
85
- STRING
86
- )
87
- end
88
-
89
- def resource_class(resource)
90
- @resource_class ||= resource.pluralize.camelize
91
- end
92
- end