graphql-rails-api 0.9.7 → 0.9.8

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