graphql_devise 0.18.1 → 1.0.1

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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +25 -2
  3. data/.gitignore +4 -0
  4. data/.rubocop.yml +9 -10
  5. data/Appraisals +72 -35
  6. data/CHANGELOG.md +63 -0
  7. data/README.md +71 -142
  8. data/app/controllers/graphql_devise/graphql_controller.rb +3 -3
  9. data/app/views/graphql_devise/mailer/confirmation_instructions.html.erb +1 -5
  10. data/config/routes.rb +0 -2
  11. data/graphql_devise.gemspec +8 -6
  12. data/lib/generators/graphql_devise/install_generator.rb +1 -1
  13. data/lib/graphql_devise/concerns/additional_controller_methods.rb +48 -0
  14. data/lib/graphql_devise/concerns/additional_model_methods.rb +17 -0
  15. data/lib/graphql_devise/concerns/authenticatable.rb +1 -1
  16. data/lib/graphql_devise/concerns/controller_methods.rb +79 -91
  17. data/lib/graphql_devise/concerns/field_authentication.rb +14 -0
  18. data/lib/graphql_devise/concerns/set_user_by_token.rb +1 -1
  19. data/lib/graphql_devise/default_operations.rb +16 -0
  20. data/lib/graphql_devise/engine.rb +0 -2
  21. data/lib/graphql_devise/model/with_email_updater.rb +5 -30
  22. data/lib/graphql_devise/mount_method/operation_preparer.rb +0 -7
  23. data/lib/graphql_devise/mount_method/operation_preparers/custom_operation_preparer.rb +1 -1
  24. data/lib/graphql_devise/mount_method/operation_preparers/default_operation_preparer.rb +1 -1
  25. data/lib/graphql_devise/mount_method/operation_sanitizer.rb +0 -12
  26. data/lib/graphql_devise/mount_method/option_sanitizer.rb +0 -2
  27. data/lib/graphql_devise/mount_method/option_sanitizers/array_checker.rb +2 -2
  28. data/lib/graphql_devise/mount_method/option_sanitizers/class_checker.rb +2 -2
  29. data/lib/graphql_devise/mount_method/option_sanitizers/hash_checker.rb +1 -1
  30. data/lib/graphql_devise/mount_method/option_sanitizers/string_checker.rb +1 -1
  31. data/lib/graphql_devise/mount_method/option_validators/provided_operations_validator.rb +0 -2
  32. data/lib/graphql_devise/mount_method/option_validators/skip_only_validator.rb +1 -1
  33. data/lib/graphql_devise/mount_method/option_validators/supported_operations_validator.rb +1 -1
  34. data/lib/graphql_devise/mount_method/options_validator.rb +0 -3
  35. data/lib/graphql_devise/mount_method/supported_options.rb +0 -5
  36. data/lib/graphql_devise/mutations/base.rb +1 -1
  37. data/lib/graphql_devise/mutations/confirm_registration_with_token.rb +2 -2
  38. data/lib/graphql_devise/mutations/login.rb +2 -2
  39. data/lib/graphql_devise/mutations/register.rb +2 -2
  40. data/lib/graphql_devise/mutations/update_password_with_token.rb +2 -2
  41. data/lib/graphql_devise/resolvers/base.rb +1 -1
  42. data/lib/graphql_devise/resource_loader.rb +71 -39
  43. data/lib/graphql_devise/route_mounter.rb +13 -0
  44. data/lib/graphql_devise/schema_plugin.rb +11 -40
  45. data/lib/graphql_devise/types/authenticatable_type.rb +1 -1
  46. data/lib/graphql_devise/types/base_field.rb +9 -0
  47. data/lib/graphql_devise/types/base_type.rb +8 -0
  48. data/lib/graphql_devise/types/credential_type.rb +1 -1
  49. data/lib/graphql_devise/types/mutation_type.rb +1 -0
  50. data/lib/graphql_devise/types/query_type.rb +1 -0
  51. data/lib/graphql_devise/version.rb +1 -1
  52. data/lib/graphql_devise.rb +21 -29
  53. data/spec/dummy/app/controllers/api/v1/graphql_controller.rb +2 -16
  54. data/spec/dummy/app/graphql/dummy_schema.rb +1 -5
  55. data/spec/dummy/app/graphql/interpreter_schema.rb +6 -2
  56. data/spec/dummy/app/graphql/mutations/base_mutation.rb +6 -0
  57. data/spec/dummy/app/graphql/mutations/update_user.rb +2 -4
  58. data/spec/dummy/app/graphql/types/admin_type.rb +1 -1
  59. data/spec/dummy/app/graphql/types/custom_admin_type.rb +1 -1
  60. data/spec/dummy/app/graphql/types/mutation_type.rb +3 -1
  61. data/spec/dummy/app/graphql/types/query_type.rb +3 -1
  62. data/spec/dummy/app/graphql/types/user_type.rb +1 -1
  63. data/spec/dummy/config/environments/test.rb +1 -1
  64. data/spec/dummy/config/routes.rb +5 -9
  65. data/spec/generators/graphql_devise/install_generator_spec.rb +2 -2
  66. data/spec/graphql_devise/model/with_email_updater_spec.rb +17 -35
  67. data/spec/rails_helper.rb +5 -5
  68. data/spec/requests/mutations/login_spec.rb +34 -0
  69. data/spec/requests/mutations/resend_confirmation_with_token_spec.rb +2 -3
  70. data/spec/requests/user_controller_spec.rb +1 -33
  71. data/spec/services/resource_loader_spec.rb +53 -3
  72. data/spec/spec_helper.rb +1 -1
  73. metadata +62 -55
  74. data/app/controllers/graphql_devise/concerns/additional_controller_methods.rb +0 -72
  75. data/app/controllers/graphql_devise/concerns/set_user_by_token.rb +0 -21
  76. data/app/helpers/graphql_devise/mailer_helper.rb +0 -37
  77. data/app/models/graphql_devise/concerns/additional_model_methods.rb +0 -21
  78. data/app/models/graphql_devise/concerns/model.rb +0 -25
  79. data/lib/graphql_devise/default_operations/mutations.rb +0 -32
  80. data/lib/graphql_devise/default_operations/resolvers.rb +0 -14
  81. data/lib/graphql_devise/mutations/resend_confirmation.rb +0 -45
  82. data/lib/graphql_devise/mutations/send_password_reset.rb +0 -38
  83. data/lib/graphql_devise/mutations/sign_up.rb +0 -61
  84. data/lib/graphql_devise/mutations/update_password.rb +0 -46
  85. data/lib/graphql_devise/rails/routes.rb +0 -15
  86. data/lib/graphql_devise/resolvers/check_password_token.rb +0 -43
  87. data/lib/graphql_devise/resolvers/confirm_account.rb +0 -42
  88. data/spec/dummy/app/graphql/mutations/sign_up.rb +0 -14
  89. data/spec/dummy/app/graphql/resolvers/confirm_admin_account.rb +0 -13
  90. data/spec/requests/mutations/resend_confirmation_spec.rb +0 -153
  91. data/spec/requests/mutations/send_password_reset_spec.rb +0 -103
  92. data/spec/requests/mutations/sign_up_spec.rb +0 -170
  93. data/spec/requests/mutations/update_password_spec.rb +0 -116
  94. data/spec/requests/queries/check_password_token_spec.rb +0 -149
  95. data/spec/requests/queries/confirm_account_spec.rb +0 -137
@@ -6,95 +6,127 @@ module GraphqlDevise
6
6
  @resource = resource
7
7
  @options = options
8
8
  @routing = routing
9
- @default_operations = GraphqlDevise::DefaultOperations::MUTATIONS.merge(GraphqlDevise::DefaultOperations::QUERIES)
9
+ @default_operations = DefaultOperations::MUTATIONS.merge(DefaultOperations::QUERIES)
10
10
  end
11
11
 
12
12
  def call(query, mutation)
13
13
  # clean_options responds to all keys defined in GraphqlDevise::MountMethod::SUPPORTED_OPTIONS
14
- clean_options = GraphqlDevise::MountMethod::OptionSanitizer.new(@options).call!
14
+ clean_options = MountMethod::OptionSanitizer.new(@options).call!
15
15
 
16
- model = if @resource.is_a?(String)
17
- ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc, caller)
18
- Providing a String as the model you want to mount is deprecated and will be removed in a future version of
19
- this gem. Please use the actual model constant instead.
20
-
21
- EXAMPLE
22
-
23
- GraphqlDevise::ResourceLoader.new(User) # instead of GraphqlDevise::ResourceLoader.new('User')
24
-
25
- mount_graphql_devise_for User # instead of mount_graphql_devise_for 'User'
26
- DEPRECATION
27
- @resource.constantize
28
- else
29
- @resource
16
+ unless @resource.is_a?(Class)
17
+ raise(
18
+ InvalidMountOptionsError,
19
+ 'A class must be provided when mounting a model. String values are no longer supported.'
20
+ )
30
21
  end
31
22
 
32
23
  # Necesary when mounting a resource via route file as Devise forces the reloading of routes
33
- return clean_options if GraphqlDevise.resource_mounted?(model) && @routing
24
+ return clean_options if ::GraphqlDevise.resource_mounted?(@resource) && @routing
34
25
 
35
26
  validate_options!(clean_options)
36
27
 
37
28
  authenticatable_type = clean_options.authenticatable_type.presence ||
38
29
  "Types::#{@resource}Type".safe_constantize ||
39
- GraphqlDevise::Types::AuthenticatableType
30
+ Types::AuthenticatableType
40
31
 
41
- prepared_mutations = prepare_mutations(model, clean_options, authenticatable_type)
32
+ prepared_mutations = prepare_mutations(@resource, clean_options, authenticatable_type)
42
33
 
43
34
  if prepared_mutations.any? && mutation.blank?
44
- raise GraphqlDevise::Error, 'You need to provide a mutation type unless all mutations are skipped'
35
+ raise ::GraphqlDevise::Error, 'You need to provide a mutation type unless all mutations are skipped'
45
36
  end
46
37
 
47
- prepared_mutations.each do |action, prepared_mutation|
48
- mutation.field(action, mutation: prepared_mutation, authenticate: false)
38
+ begin
39
+ prepared_mutations.each do |action, prepared_mutation|
40
+ mutation.field(action, mutation: prepared_mutation, authenticate: false)
41
+ end
42
+ rescue ArgumentError
43
+ raise unless Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
44
+
45
+ raise_undefined_field_class_error('MutationType')
49
46
  end
50
47
 
51
- prepared_resolvers = prepare_resolvers(model, clean_options, authenticatable_type)
48
+ prepared_resolvers = prepare_resolvers(@resource, clean_options, authenticatable_type)
52
49
 
53
50
  if prepared_resolvers.any? && query.blank?
54
- raise GraphqlDevise::Error, 'You need to provide a query type unless all queries are skipped'
51
+ raise ::GraphqlDevise::Error, 'You need to provide a query type unless all queries are skipped'
55
52
  end
56
53
 
57
- prepared_resolvers.each do |action, resolver|
58
- query.field(action, resolver: resolver, authenticate: false)
54
+ begin
55
+ prepared_resolvers.each do |action, resolver|
56
+ query.field(action, resolver: resolver, authenticate: false)
57
+ end
58
+ rescue ArgumentError
59
+ raise unless Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
60
+
61
+ raise_undefined_field_class_error('QueryType')
59
62
  end
60
63
 
61
- GraphqlDevise.add_mapping(GraphqlDevise.to_mapping_name(@resource).to_sym, @resource)
62
- GraphqlDevise.mount_resource(model) if @routing
64
+ ::GraphqlDevise.add_mapping(::GraphqlDevise.to_mapping_name(@resource).to_sym, @resource)
65
+ ::GraphqlDevise.mount_resource(@resource) if @routing
63
66
 
64
67
  clean_options
65
68
  end
66
69
 
67
70
  private
68
71
 
72
+ def raise_undefined_field_class_error(type_class)
73
+ raise(
74
+ GraphqlDevise::Error,
75
+ <<~MESSAGE
76
+ To use this gem with graphql >= 2.0 you need to use a custom `field_class`
77
+ on your #{type_class}. You can use the `field_class` defined in this gem like this:
78
+
79
+ module Types
80
+ class #{type_class} < GraphQL::Schema::Object
81
+ field_class GraphqlDevise::Types::BaseField
82
+ end
83
+ end
84
+
85
+ If you already have a `field_class` set on your #{type_class}, you can include our concern
86
+ to make this work
87
+
88
+ module Types
89
+ class BaseField < GraphQL::Schema::Field
90
+ include GraphqlDevise::FieldAuthentication
91
+ end
92
+ end
93
+
94
+ The concern will define an initializer, if your custom field logic is not standard, you can look
95
+ at the `GraphqlDevise::FieldAuthentication` implementation to add what is required to your own
96
+ field class
97
+ MESSAGE
98
+ )
99
+ end
100
+
69
101
  def prepare_resolvers(model, clean_options, authenticatable_type)
70
- GraphqlDevise::MountMethod::OperationPreparer.new(
102
+ MountMethod::OperationPreparer.new(
71
103
  model: model,
72
104
  custom: clean_options.operations,
73
105
  additional_operations: clean_options.additional_queries,
74
- preparer: GraphqlDevise::MountMethod::OperationPreparers::ResolverTypeSetter.new(authenticatable_type),
75
- selected_operations: GraphqlDevise::MountMethod::OperationSanitizer.call(
76
- default: GraphqlDevise::DefaultOperations::QUERIES, only: clean_options.only, skipped: clean_options.skip
106
+ preparer: MountMethod::OperationPreparers::ResolverTypeSetter.new(authenticatable_type),
107
+ selected_operations: MountMethod::OperationSanitizer.call(
108
+ default: DefaultOperations::QUERIES, only: clean_options.only, skipped: clean_options.skip
77
109
  )
78
110
  ).call
79
111
  end
80
112
 
81
113
  def prepare_mutations(model, clean_options, authenticatable_type)
82
- GraphqlDevise::MountMethod::OperationPreparer.new(
114
+ MountMethod::OperationPreparer.new(
83
115
  model: model,
84
116
  custom: clean_options.operations,
85
117
  additional_operations: clean_options.additional_mutations,
86
- preparer: GraphqlDevise::MountMethod::OperationPreparers::MutationFieldSetter.new(authenticatable_type),
87
- selected_operations: GraphqlDevise::MountMethod::OperationSanitizer.call(
88
- default: GraphqlDevise::DefaultOperations::MUTATIONS, only: clean_options.only, skipped: clean_options.skip
118
+ preparer: MountMethod::OperationPreparers::MutationFieldSetter.new(authenticatable_type),
119
+ selected_operations: MountMethod::OperationSanitizer.call(
120
+ default: DefaultOperations::MUTATIONS, only: clean_options.only, skipped: clean_options.skip
89
121
  )
90
122
  ).call
91
123
  end
92
124
 
93
125
  def validate_options!(clean_options)
94
- GraphqlDevise::MountMethod::OptionsValidator.new(
126
+ MountMethod::OptionsValidator.new(
95
127
  [
96
- GraphqlDevise::MountMethod::OptionValidators::SkipOnlyValidator.new(options: clean_options),
97
- GraphqlDevise::MountMethod::OptionValidators::ProvidedOperationsValidator.new(
128
+ MountMethod::OptionValidators::SkipOnlyValidator.new(options: clean_options),
129
+ MountMethod::OptionValidators::ProvidedOperationsValidator.new(
98
130
  options: clean_options, supported_operations: @default_operations
99
131
  )
100
132
  ]
@@ -0,0 +1,13 @@
1
+ module GraphqlDevise
2
+ module RouteMounter
3
+ def mount_graphql_devise_for(resource, options = {})
4
+ clean_options = ResourceLoader.new(resource, options, true).call(
5
+ Types::QueryType,
6
+ Types::MutationType
7
+ )
8
+
9
+ post clean_options.at, to: 'graphql_devise/graphql#auth'
10
+ get clean_options.at, to: 'graphql_devise/graphql#auth'
11
+ end
12
+ end
13
+ end
@@ -4,7 +4,7 @@ module GraphqlDevise
4
4
  class SchemaPlugin
5
5
  # NOTE: Based on GQL-Ruby docs https://graphql-ruby.org/schema/introspection.html
6
6
  INTROSPECTION_FIELDS = ['__schema', '__type', '__typename']
7
- DEFAULT_NOT_AUTHENTICATED = ->(field) { raise GraphqlDevise::AuthenticationError, "#{field} field requires authentication" }
7
+ DEFAULT_NOT_AUTHENTICATED = ->(field) { raise AuthenticationError, "#{field} field requires authentication" }
8
8
 
9
9
  def initialize(query: nil, mutation: nil, authenticate_default: true, public_introspection: !Rails.env.production?, resource_loaders: [], unauthenticated_proc: DEFAULT_NOT_AUTHENTICATED)
10
10
  @query = query
@@ -30,22 +30,7 @@ module GraphqlDevise
30
30
  auth_required = authenticate_option(field, trace_data)
31
31
  context = context_from_data(trace_data)
32
32
 
33
- if context.key?(:resource_name)
34
- ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc, caller)
35
- Providing `resource_name` as part of the GQL context, or doing so by using the `graphql_context(resource_name)`
36
- method on your controller is deprecated and will be removed in a future version of this gem.
37
- Please use `gql_devise_context` in you controller instead.
38
-
39
- EXAMPLE
40
- include GraphqlDevise::SetUserByToken
41
-
42
- DummySchema.execute(params[:query], context: gql_devise_context(User))
43
- DummySchema.execute(params[:query], context: gql_devise_context(User, Admin))
44
- DEPRECATION
45
- end
46
-
47
33
  if auth_required && !(public_introspection && introspection_field?(field))
48
- context = set_current_resource(context)
49
34
  raise_on_missing_resource(context, field, auth_required)
50
35
  end
51
36
 
@@ -56,25 +41,6 @@ module GraphqlDevise
56
41
 
57
42
  attr_reader :public_introspection
58
43
 
59
- def set_current_resource(context)
60
- controller = context[:controller]
61
- resource_names = Array(context[:resource_name])
62
-
63
- context[:current_resource] ||= resource_names.find do |resource_name|
64
- unless Devise.mappings.key?(resource_name)
65
- raise(
66
- GraphqlDevise::Error,
67
- "Invalid resource_name `#{resource_name}` provided to `graphql_context`. Possible values are: #{Devise.mappings.keys}."
68
- )
69
- end
70
-
71
- found = controller.set_resource_by_token(resource_name)
72
- break found if found
73
- end
74
-
75
- context
76
- end
77
-
78
44
  def raise_on_missing_resource(context, field, auth_required)
79
45
  @unauthenticated_proc.call(field.name) if context[:current_resource].blank?
80
46
 
@@ -113,7 +79,15 @@ module GraphqlDevise
113
79
  auth_required = if trace_data[:context]
114
80
  field.metadata[:authenticate]
115
81
  else
116
- field.graphql_definition.metadata[:authenticate]
82
+ if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
83
+ # authenticate will only be defined if "field_class GraphqlDevise::Types::BaseField" is added to the type
84
+ # returning nil here will use the default value used when mounting the plugin
85
+ field.try(:authenticate)
86
+ elsif Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.13.1')
87
+ field.graphql_definition(silence_deprecation_warning: true).metadata[:authenticate]
88
+ else
89
+ field.graphql_definition.metadata[:authenticate]
90
+ end
117
91
  end
118
92
 
119
93
  auth_required.nil? ? @authenticate_default : auth_required
@@ -121,7 +95,7 @@ module GraphqlDevise
121
95
 
122
96
  def load_fields
123
97
  @resource_loaders.each do |resource_loader|
124
- raise Error, 'Invalid resource loader instance' unless resource_loader.instance_of?(GraphqlDevise::ResourceLoader)
98
+ raise ::GraphqlDevise::Error, 'Invalid resource loader instance' unless resource_loader.instance_of?(ResourceLoader)
125
99
 
126
100
  resource_loader.call(@query, @mutation)
127
101
  end
@@ -132,6 +106,3 @@ module GraphqlDevise
132
106
  end
133
107
  end
134
108
  end
135
-
136
- GraphQL::Field.accepts_definitions(authenticate: GraphQL::Define.assign_metadata_key(:authenticate))
137
- GraphQL::Schema::Field.accepts_definition(:authenticate)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GraphqlDevise
4
4
  module Types
5
- class AuthenticatableType < GraphQL::Schema::Object
5
+ class AuthenticatableType < BaseType
6
6
  field :email, String, null: false
7
7
  end
8
8
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphqlDevise
4
+ module Types
5
+ class BaseField < GraphQL::Schema::Field
6
+ include FieldAuthentication
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphqlDevise
4
+ module Types
5
+ class BaseType < GraphQL::Schema::Object
6
+ end
7
+ end
8
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GraphqlDevise
4
4
  module Types
5
- class CredentialType < GraphQL::Schema::Object
5
+ class CredentialType < BaseType
6
6
  field :access_token, String, null: false
7
7
  field :uid, String, null: false
8
8
  field :token_type, String, null: false
@@ -3,6 +3,7 @@
3
3
  module GraphqlDevise
4
4
  module Types
5
5
  class MutationType < GraphQL::Schema::Object
6
+ field_class GraphqlDevise::Types::BaseField if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
6
7
  end
7
8
  end
8
9
  end
@@ -3,6 +3,7 @@
3
3
  module GraphqlDevise
4
4
  module Types
5
5
  class QueryType < GraphQL::Schema::Object
6
+ field_class GraphqlDevise::Types::BaseField if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
6
7
  end
7
8
  end
8
9
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GraphqlDevise
4
- VERSION = '0.18.1'.freeze
4
+ VERSION = '1.0.1'
5
5
  end
@@ -1,13 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails'
4
+ require 'rails/generators'
4
5
  require 'graphql'
5
6
  require 'devise_token_auth'
7
+ require 'zeitwerk'
8
+
9
+ if Gem::Version.new(GraphQL::VERSION) < Gem::Version.new('2.0')
10
+ GraphQL::Field.accepts_definitions(authenticate: GraphQL::Define.assign_metadata_key(:authenticate))
11
+ GraphQL::Schema::Field.accepts_definition(:authenticate)
12
+ end
13
+
14
+ loader = Zeitwerk::Loader.for_gem
15
+
16
+ loader.collapse("#{__dir__}/graphql_devise/concerns")
17
+ loader.collapse("#{__dir__}/graphql_devise/errors")
18
+ loader.ignore("#{__dir__}/generators")
19
+
20
+ loader.inflector.inflect('error_codes' => 'ERROR_CODES')
21
+ loader.inflector.inflect('supported_options' => 'SUPPORTED_OPTIONS')
22
+
23
+ loader.setup
6
24
 
7
25
  module GraphqlDevise
8
26
  class Error < StandardError; end
9
27
 
10
- class InvalidMountOptionsError < GraphqlDevise::Error; end
28
+ class InvalidMountOptionsError < ::GraphqlDevise::Error; end
11
29
 
12
30
  @schema_loaded = false
13
31
  @mounted_resources = []
@@ -52,32 +70,6 @@ module GraphqlDevise
52
70
  end
53
71
  end
54
72
 
73
+ ActionDispatch::Routing::Mapper.include(GraphqlDevise::RouteMounter)
74
+
55
75
  require 'graphql_devise/engine'
56
- require 'graphql_devise/version'
57
- require 'graphql_devise/errors/error_codes'
58
- require 'graphql_devise/errors/execution_error'
59
- require 'graphql_devise/errors/user_error'
60
- require 'graphql_devise/errors/authentication_error'
61
- require 'graphql_devise/errors/detailed_user_error'
62
-
63
- # TODO: Remove when merged into master
64
- require 'graphql_devise/concerns/authenticatable'
65
- require 'graphql_devise/concerns/set_user_by_token.rb'
66
-
67
- require 'graphql_devise/concerns/controller_methods'
68
- require 'graphql_devise/schema'
69
- require 'graphql_devise/types/authenticatable_type'
70
- require 'graphql_devise/types/credential_type'
71
- require 'graphql_devise/types/mutation_type'
72
- require 'graphql_devise/types/query_type'
73
- require 'graphql_devise/default_operations/mutations'
74
- require 'graphql_devise/default_operations/resolvers'
75
- require 'graphql_devise/resolvers/dummy'
76
-
77
- require 'graphql_devise/mount_method/option_sanitizer'
78
- require 'graphql_devise/mount_method/options_validator'
79
- require 'graphql_devise/mount_method/operation_preparer'
80
- require 'graphql_devise/mount_method/operation_sanitizer'
81
-
82
- require 'graphql_devise/resource_loader'
83
- require 'graphql_devise/schema_plugin'
@@ -4,6 +4,7 @@ module Api
4
4
  module V1
5
5
  class GraphqlController < ApplicationController
6
6
  include GraphqlDevise::SetUserByToken
7
+ include ActionController::Cookies
7
8
 
8
9
  def graphql
9
10
  result = DummySchema.execute(params[:query], **execute_params(params))
@@ -15,28 +16,13 @@ module Api
15
16
  render json: InterpreterSchema.execute(params[:query], **execute_params(params))
16
17
  end
17
18
 
18
- def failing_resource_name
19
- render json: DummySchema.execute(params[:query], context: graphql_context([:user, :fail]))
20
- end
21
-
22
- def controller_auth
23
- result = DummySchema.execute(
24
- params[:query],
25
- operation_name: params[:operationName],
26
- variables: ensure_hash(params[:variables]),
27
- context: gql_devise_context(SchemaUser, User)
28
- )
29
-
30
- render json: result unless performed?
31
- end
32
-
33
19
  private
34
20
 
35
21
  def execute_params(item)
36
22
  {
37
23
  operation_name: item[:operationName],
38
24
  variables: ensure_hash(item[:variables]),
39
- context: graphql_context([:user, :schema_user])
25
+ context: gql_devise_context(SchemaUser, User)
40
26
  }
41
27
  end
42
28
 
@@ -10,11 +10,7 @@ class DummySchema < GraphQL::Schema
10
10
  User,
11
11
  only: [
12
12
  :login,
13
- :confirm_account,
14
- :send_password_reset,
15
- :resend_confirmation,
16
- :resend_confirmation_with_token,
17
- :check_password_token
13
+ :resend_confirmation_with_token
18
14
  ]
19
15
  ),
20
16
  GraphqlDevise::ResourceLoader.new(Guest, only: [:logout]),
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class InterpreterSchema < GraphQL::Schema
4
- use GraphQL::Execution::Interpreter if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.9.0')
5
- use GraphQL::Analysis::AST if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.10.0')
4
+ if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.9.0') && Gem::Version.new(GraphQL::VERSION) < Gem::Version.new('2.0')
5
+ use GraphQL::Execution::Interpreter
6
+ end
7
+ if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.10.0') && Gem::Version.new(GraphQL::VERSION) < Gem::Version.new('2.0')
8
+ use GraphQL::Analysis::AST
9
+ end
6
10
 
7
11
  use GraphqlDevise::SchemaPlugin.new(query: Types::QueryType, authenticate_default: false)
8
12
 
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mutations
4
+ class BaseMutation < GraphQL::Schema::Mutation
5
+ end
6
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mutations
4
- class UpdateUser < GraphQL::Schema::Mutation
4
+ class UpdateUser < BaseMutation
5
5
  field :user, Types::UserType, null: false
6
6
 
7
7
  argument :email, String, required: false
@@ -10,10 +10,8 @@ module Mutations
10
10
  def resolve(**attrs)
11
11
  user = context[:current_resource]
12
12
 
13
- schema_url = context[:controller].full_url_without_params
14
-
15
13
  user.update_with_email(
16
- attrs.merge(schema_url: schema_url, confirmation_success_url: 'https://google.com')
14
+ attrs.merge(confirmation_url: 'https://google.com')
17
15
  )
18
16
 
19
17
  { user: user }
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class AdminType < GraphQL::Schema::Object
4
+ class AdminType < BaseObject
5
5
  field :id, Int, null: false
6
6
  field :email, String, null: false
7
7
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class CustomAdminType < GraphQL::Schema::Object
4
+ class CustomAdminType < BaseObject
5
5
  field :email, String, null: false
6
6
  field :custom_field, String, null: false
7
7
 
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class MutationType < Types::BaseObject
4
+ class MutationType < BaseObject
5
+ field_class GraphqlDevise::Types::BaseField if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
6
+
5
7
  field :dummy_mutation, String, null: false, authenticate: true
6
8
  field :update_user, mutation: Mutations::UpdateUser
7
9
 
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class QueryType < Types::BaseObject
4
+ class QueryType < BaseObject
5
+ field_class GraphqlDevise::Types::BaseField if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
6
+
5
7
  field :user, resolver: Resolvers::UserShow
6
8
  field :public_field, String, null: false, authenticate: false
7
9
  field :private_field, String, null: false, authenticate: true
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class UserType < GraphQL::Schema::Object
4
+ class UserType < BaseObject
5
5
  field :id, Int, null: false
6
6
  field :email, String, null: false
7
7
  field :name, String, null: false
@@ -43,5 +43,5 @@ Rails.application.configure do
43
43
  config.active_support.deprecation = :stderr
44
44
 
45
45
  # Raises error for missing translations
46
- config.action_view.raise_on_missing_translations = true
46
+ config.action_view.raise_on_missing_translations = true if Rails::VERSION::MAJOR < 7
47
47
  end
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Rails.application.routes.draw do
4
- mount_graphql_devise_for 'User', at: '/api/v1/graphql_auth', operations: {
4
+ mount_graphql_devise_for User, at: '/api/v1/graphql_auth', operations: {
5
5
  login: Mutations::Login,
6
- sign_up: Mutations::SignUp,
7
6
  register: Mutations::Register
8
7
  }, additional_mutations: {
9
8
  register_confirmed_user: Mutations::RegisterConfirmedUser
@@ -14,22 +13,21 @@ Rails.application.routes.draw do
14
13
  mount_graphql_devise_for(
15
14
  Admin,
16
15
  authenticatable_type: Types::CustomAdminType,
17
- skip: [:sign_up, :register, :check_password_token],
16
+ skip: [:register],
18
17
  operations: {
19
- confirm_account: Resolvers::ConfirmAdminAccount,
20
18
  update_password_with_token: Mutations::ResetAdminPasswordWithToken
21
19
  },
22
20
  at: '/api/v1/admin/graphql_auth'
23
21
  )
24
22
 
25
23
  mount_graphql_devise_for(
26
- 'Guest',
27
- only: [:login, :logout, :sign_up, :register],
24
+ Guest,
25
+ only: [:login, :logout, :register],
28
26
  at: '/api/v1/guest/graphql_auth'
29
27
  )
30
28
 
31
29
  mount_graphql_devise_for(
32
- 'Users::Customer',
30
+ Users::Customer,
33
31
  only: [:login],
34
32
  at: '/api/v1/user_customer/graphql_auth'
35
33
  )
@@ -37,6 +35,4 @@ Rails.application.routes.draw do
37
35
  get '/api/v1/graphql', to: 'api/v1/graphql#graphql'
38
36
  post '/api/v1/graphql', to: 'api/v1/graphql#graphql'
39
37
  post '/api/v1/interpreter', to: 'api/v1/graphql#interpreter'
40
- post '/api/v1/failing', to: 'api/v1/graphql#failing_resource_name'
41
- post '/api/v1/controller_auth', to: 'api/v1/graphql#controller_auth'
42
38
  end
@@ -41,7 +41,7 @@ RSpec.describe GraphqlDevise::InstallGenerator, type: :generator do
41
41
  let(:args) { [] }
42
42
 
43
43
  it 'creates and updated required files' do
44
- assert_file 'config/routes.rb', /^\s{2}mount_graphql_devise_for 'User', at: 'graphql_auth'/
44
+ assert_file 'config/routes.rb', /^\s{2}mount_graphql_devise_for User, at: 'graphql_auth'/
45
45
  expect(routes_content).not_to match(dta_route)
46
46
 
47
47
  assert_file 'config/initializers/devise.rb'
@@ -60,7 +60,7 @@ RSpec.describe GraphqlDevise::InstallGenerator, type: :generator do
60
60
  let(:args) { %w[Admin api] }
61
61
 
62
62
  it 'creates and updated required files' do
63
- assert_file 'config/routes.rb', /^\s{2}mount_graphql_devise_for 'Admin', at: 'api'/
63
+ assert_file 'config/routes.rb', /^\s{2}mount_graphql_devise_for Admin, at: 'api'/
64
64
  expect(routes_content).not_to match(dta_route)
65
65
 
66
66
  assert_file 'config/initializers/devise.rb'