graphql_devise 0.12.3 → 0.13.4

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 (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -0
  3. data/Gemfile +2 -0
  4. data/README.md +116 -65
  5. data/Rakefile +2 -0
  6. data/app/controllers/graphql_devise/application_controller.rb +2 -0
  7. data/app/controllers/graphql_devise/concerns/set_user_by_token.rb +6 -0
  8. data/app/controllers/graphql_devise/graphql_controller.rb +2 -0
  9. data/app/helpers/graphql_devise/application_helper.rb +2 -0
  10. data/app/helpers/graphql_devise/mailer_helper.rb +2 -0
  11. data/app/models/graphql_devise/concerns/model.rb +16 -0
  12. data/app/views/graphql_devise/mailer/confirmation_instructions.html.erb +1 -1
  13. data/app/views/graphql_devise/mailer/reset_password_instructions.html.erb +1 -1
  14. data/config/routes.rb +2 -0
  15. data/lib/generators/graphql_devise/install_generator.rb +3 -1
  16. data/lib/graphql_devise.rb +2 -0
  17. data/lib/graphql_devise/concerns/controller_methods.rb +2 -0
  18. data/lib/graphql_devise/default_operations/mutations.rb +2 -0
  19. data/lib/graphql_devise/default_operations/resolvers.rb +2 -0
  20. data/lib/graphql_devise/engine.rb +2 -0
  21. data/lib/graphql_devise/errors/authentication_error.rb +2 -0
  22. data/lib/graphql_devise/errors/detailed_user_error.rb +2 -0
  23. data/lib/graphql_devise/errors/error_codes.rb +2 -0
  24. data/lib/graphql_devise/errors/execution_error.rb +2 -0
  25. data/lib/graphql_devise/errors/user_error.rb +2 -0
  26. data/lib/graphql_devise/model/with_email_updater.rb +74 -0
  27. data/lib/graphql_devise/mount_method/operation_preparer.rb +2 -0
  28. data/lib/graphql_devise/mount_method/operation_preparers/custom_operation_preparer.rb +2 -0
  29. data/lib/graphql_devise/mount_method/operation_preparers/default_operation_preparer.rb +2 -0
  30. data/lib/graphql_devise/mount_method/operation_preparers/gql_name_setter.rb +2 -0
  31. data/lib/graphql_devise/mount_method/operation_preparers/mutation_field_setter.rb +2 -0
  32. data/lib/graphql_devise/mount_method/operation_preparers/resolver_type_setter.rb +2 -0
  33. data/lib/graphql_devise/mount_method/operation_preparers/resource_name_setter.rb +2 -0
  34. data/lib/graphql_devise/mount_method/operation_sanitizer.rb +2 -0
  35. data/lib/graphql_devise/mount_method/option_sanitizer.rb +2 -0
  36. data/lib/graphql_devise/mount_method/option_sanitizers/array_checker.rb +2 -0
  37. data/lib/graphql_devise/mount_method/option_sanitizers/class_checker.rb +2 -0
  38. data/lib/graphql_devise/mount_method/option_sanitizers/hash_checker.rb +2 -0
  39. data/lib/graphql_devise/mount_method/option_sanitizers/string_checker.rb +2 -0
  40. data/lib/graphql_devise/mount_method/option_validators/provided_operations_validator.rb +2 -0
  41. data/lib/graphql_devise/mount_method/option_validators/skip_only_validator.rb +2 -0
  42. data/lib/graphql_devise/mount_method/option_validators/supported_operations_validator.rb +2 -0
  43. data/lib/graphql_devise/mount_method/options_validator.rb +2 -0
  44. data/lib/graphql_devise/mount_method/supported_options.rb +2 -0
  45. data/lib/graphql_devise/mutations/base.rb +2 -0
  46. data/lib/graphql_devise/mutations/login.rb +2 -0
  47. data/lib/graphql_devise/mutations/logout.rb +2 -0
  48. data/lib/graphql_devise/mutations/resend_confirmation.rb +16 -6
  49. data/lib/graphql_devise/mutations/send_password_reset.rb +3 -1
  50. data/lib/graphql_devise/mutations/sign_up.rb +12 -3
  51. data/lib/graphql_devise/mutations/update_password.rb +2 -0
  52. data/lib/graphql_devise/rails/routes.rb +2 -0
  53. data/lib/graphql_devise/resolvers/base.rb +2 -0
  54. data/lib/graphql_devise/resolvers/check_password_token.rb +2 -0
  55. data/lib/graphql_devise/resolvers/confirm_account.rb +7 -2
  56. data/lib/graphql_devise/resolvers/dummy.rb +2 -0
  57. data/lib/graphql_devise/resource_loader.rb +2 -0
  58. data/lib/graphql_devise/schema.rb +2 -0
  59. data/lib/graphql_devise/schema_plugin.rb +8 -0
  60. data/lib/graphql_devise/types/authenticatable_type.rb +2 -0
  61. data/lib/graphql_devise/types/credential_type.rb +2 -0
  62. data/lib/graphql_devise/types/mutation_type.rb +2 -0
  63. data/lib/graphql_devise/types/query_type.rb +2 -0
  64. data/lib/graphql_devise/version.rb +3 -1
  65. data/spec/dummy/Rakefile +2 -0
  66. data/spec/dummy/app/controllers/api/v1/graphql_controller.rb +3 -1
  67. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  68. data/spec/dummy/app/graphql/dummy_schema.rb +4 -1
  69. data/spec/dummy/app/graphql/interpreter_schema.rb +2 -0
  70. data/spec/dummy/app/graphql/mutations/login.rb +2 -0
  71. data/spec/dummy/app/graphql/mutations/register_confirmed_user.rb +2 -0
  72. data/spec/dummy/app/graphql/mutations/sign_up.rb +2 -0
  73. data/spec/dummy/app/graphql/mutations/update_user.rb +22 -0
  74. data/spec/dummy/app/graphql/resolvers/confirm_admin_account.rb +13 -0
  75. data/spec/dummy/app/graphql/resolvers/public_user.rb +2 -0
  76. data/spec/dummy/app/graphql/resolvers/user_show.rb +2 -0
  77. data/spec/dummy/app/graphql/types/admin_type.rb +8 -0
  78. data/spec/dummy/app/graphql/types/base_object.rb +2 -0
  79. data/spec/dummy/app/graphql/types/custom_admin_type.rb +2 -0
  80. data/spec/dummy/app/graphql/types/mutation_type.rb +3 -0
  81. data/spec/dummy/app/graphql/types/query_type.rb +2 -0
  82. data/spec/dummy/app/graphql/types/user_type.rb +2 -0
  83. data/spec/dummy/app/jobs/application_job.rb +2 -0
  84. data/spec/dummy/app/mailers/application_mailer.rb +2 -0
  85. data/spec/dummy/app/models/admin.rb +2 -0
  86. data/spec/dummy/app/models/application_record.rb +2 -0
  87. data/spec/dummy/app/models/guest.rb +2 -0
  88. data/spec/dummy/app/models/schema_user.rb +13 -0
  89. data/spec/dummy/app/models/user.rb +2 -0
  90. data/spec/dummy/app/models/users.rb +2 -0
  91. data/spec/dummy/app/models/users/customer.rb +2 -0
  92. data/spec/dummy/config.ru +2 -0
  93. data/spec/dummy/config/application.rb +2 -0
  94. data/spec/dummy/config/environment.rb +2 -0
  95. data/spec/dummy/config/environments/development.rb +2 -0
  96. data/spec/dummy/config/environments/production.rb +2 -0
  97. data/spec/dummy/config/environments/test.rb +2 -0
  98. data/spec/dummy/config/initializers/application_controller_renderer.rb +2 -0
  99. data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
  100. data/spec/dummy/config/initializers/cors.rb +2 -0
  101. data/spec/dummy/config/initializers/devise.rb +1 -1
  102. data/spec/dummy/config/initializers/devise_token_auth.rb +2 -0
  103. data/spec/dummy/config/initializers/filter_parameter_logging.rb +2 -0
  104. data/spec/dummy/config/initializers/i18n.rb +2 -0
  105. data/spec/dummy/config/initializers/inflections.rb +2 -0
  106. data/spec/dummy/config/initializers/mime_types.rb +2 -0
  107. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
  108. data/spec/dummy/config/puma.rb +2 -0
  109. data/spec/dummy/config/routes.rb +5 -0
  110. data/spec/dummy/config/spring.rb +2 -0
  111. data/spec/dummy/db/migrate/20190815114303_create_users.rb +2 -0
  112. data/spec/dummy/db/migrate/20190824215150_add_auth_available_to_users.rb +2 -0
  113. data/spec/dummy/db/migrate/20190916012505_create_admins.rb +2 -0
  114. data/spec/dummy/db/migrate/20191013213045_create_guests.rb +2 -0
  115. data/spec/dummy/db/migrate/20200321121807_create_users_customers.rb +2 -0
  116. data/spec/dummy/db/migrate/20200621182414_remove_uncofirmed_email_from_admins.rb +7 -0
  117. data/spec/dummy/db/migrate/20200623003142_create_schema_users.rb +46 -0
  118. data/spec/dummy/db/schema.rb +28 -2
  119. data/spec/dummy/db/seeds.rb +2 -0
  120. data/spec/factories/admins.rb +2 -0
  121. data/spec/factories/guests.rb +2 -0
  122. data/spec/factories/schema_users.rb +13 -0
  123. data/spec/factories/users.rb +2 -0
  124. data/spec/factories/users_customers.rb +2 -0
  125. data/spec/generators/graphql_devise/install_generator_spec.rb +3 -1
  126. data/spec/graphql_devise/model/with_email_updater_spec.rb +131 -0
  127. data/spec/graphql_devise_spec.rb +2 -0
  128. data/spec/models/user_spec.rb +2 -0
  129. data/spec/rails_helper.rb +3 -0
  130. data/spec/requests/graphql_controller_spec.rb +2 -0
  131. data/spec/requests/mutations/additional_mutations_spec.rb +2 -0
  132. data/spec/requests/mutations/additional_queries_spec.rb +2 -0
  133. data/spec/requests/mutations/login_spec.rb +2 -0
  134. data/spec/requests/mutations/logout_spec.rb +2 -0
  135. data/spec/requests/mutations/resend_confirmation_spec.rb +29 -4
  136. data/spec/requests/mutations/send_password_reset_spec.rb +2 -0
  137. data/spec/requests/mutations/sign_up_spec.rb +15 -2
  138. data/spec/requests/mutations/update_password_spec.rb +2 -0
  139. data/spec/requests/queries/check_password_token_spec.rb +2 -0
  140. data/spec/requests/queries/confirm_account_spec.rb +102 -42
  141. data/spec/requests/user_controller_spec.rb +57 -8
  142. data/spec/services/mount_method/operation_preparer_spec.rb +2 -0
  143. data/spec/services/mount_method/operation_preparers/custom_operation_preparer_spec.rb +2 -0
  144. data/spec/services/mount_method/operation_preparers/default_operation_preparer_spec.rb +2 -0
  145. data/spec/services/mount_method/operation_preparers/gql_name_setter_spec.rb +2 -0
  146. data/spec/services/mount_method/operation_preparers/mutation_field_setter_spec.rb +2 -0
  147. data/spec/services/mount_method/operation_preparers/resolver_type_setter_spec.rb +2 -0
  148. data/spec/services/mount_method/operation_preparers/resource_name_setter_spec.rb +2 -0
  149. data/spec/services/mount_method/operation_sanitizer_spec.rb +2 -0
  150. data/spec/services/mount_method/option_sanitizer_spec.rb +2 -0
  151. data/spec/services/mount_method/option_sanitizers/array_checker_spec.rb +2 -0
  152. data/spec/services/mount_method/option_sanitizers/class_checker_spec.rb +2 -0
  153. data/spec/services/mount_method/option_sanitizers/hash_checker_spec.rb +2 -0
  154. data/spec/services/mount_method/option_sanitizers/string_checker_spec.rb +2 -0
  155. data/spec/services/mount_method/option_validators/provided_operations_validator_spec.rb +2 -0
  156. data/spec/services/mount_method/option_validators/skip_only_validator_spec.rb +2 -0
  157. data/spec/services/mount_method/option_validators/supported_operations_validator_spec.rb +2 -0
  158. data/spec/services/mount_method/options_validator_spec.rb +2 -0
  159. data/spec/services/resource_loader_spec.rb +2 -0
  160. data/spec/services/schema_plugin_spec.rb +2 -0
  161. data/spec/spec_helper.rb +2 -0
  162. data/spec/support/contexts/graphql_request.rb +2 -0
  163. data/spec/support/factory_bot.rb +2 -0
  164. data/spec/support/matchers/auth_headers_matcher.rb +2 -0
  165. data/spec/support/matchers/not_change_matcher.rb +2 -0
  166. data/spec/support/requests/auth_helpers.rb +2 -0
  167. data/spec/support/requests/json_helpers.rb +2 -0
  168. metadata +19 -2
@@ -2,7 +2,7 @@
2
2
 
3
3
  <p><%= t('.request_reset_link_msg') %></p>
4
4
 
5
- <p><%= link_to t('.password_change_link'), url_for(controller: message['controller'], action: message['action'], **password_reset_query(token: @token, redirect_url: message['redirect-url'], resource_name: @resource.class.to_s)) %></p>
5
+ <p><%= link_to t('.password_change_link'), "#{message['schema_url']}?#{password_reset_query(token: @token, redirect_url: message['redirect-url'], resource_name: @resource.class.to_s).to_query}" %></p>
6
6
 
7
7
  <p><%= t('.ignore_mail_msg') %></p>
8
8
  <p><%= t('.no_changes_msg') %></p>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  GraphqlDevise::Engine.routes.draw do
2
4
  # Required as Devise forces routes to reload on eager_load
3
5
  unless GraphqlDevise.schema_loaded?
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  class InstallGenerator < ::Rails::Generators::Base
3
5
  source_root File.expand_path('templates', __dir__)
4
6
 
5
7
  argument :user_class, type: :string, default: 'User'
6
- argument :mount_path, type: :string, default: 'auth'
8
+ argument :mount_path, type: :string, default: 'graphql_auth'
7
9
 
8
10
  class_option :mount, type: :string, default: 'separate_route'
9
11
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails'
2
4
  require 'graphql'
3
5
  require 'devise_token_auth'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Concerns
3
5
  module ControllerMethods
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'graphql_devise/mutations/base'
2
4
  require 'graphql_devise/mutations/login'
3
5
  require 'graphql_devise/mutations/logout'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'graphql_devise/resolvers/base'
2
4
  require 'graphql_devise/resolvers/check_password_token'
3
5
  require 'graphql_devise/resolvers/confirm_account'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'graphql_devise/rails/routes'
2
4
 
3
5
  module GraphqlDevise
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  class AuthenticationError < ExecutionError
3
5
  def to_h
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  class DetailedUserError < ExecutionError
3
5
  def initialize(message, errors:)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  ERROR_CODES = {
3
5
  user_error: 'USER_ERROR',
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  class ExecutionError < GraphQL::ExecutionError
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  class UserError < ExecutionError
3
5
  def to_h
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphqlDevise
4
+ module Model
5
+ class WithEmailUpdater
6
+ def initialize(resource, attributes)
7
+ @attributes = attributes
8
+ @resource = resource
9
+ end
10
+
11
+ def call
12
+ resource_attributes = @attributes.except(:schema_url, :confirmation_success_url)
13
+ return @resource.update(resource_attributes) unless requires_reconfirmation?(resource_attributes)
14
+
15
+ @resource.assign_attributes(resource_attributes)
16
+
17
+ if @resource.email == email_in_database
18
+ return @resource.save
19
+ elsif required_reconfirm_attributes?
20
+ return false unless @resource.valid?
21
+
22
+ store_unconfirmed_email
23
+ saved = @resource.save
24
+ send_confirmation_instructions(saved)
25
+
26
+ saved
27
+ else
28
+ raise(
29
+ GraphqlDevise::Error,
30
+ 'Method `update_with_email` requires attributes `confirmation_success_url` and `schema_url` for email reconfirmation to work'
31
+ )
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def required_reconfirm_attributes?
38
+ @attributes[:schema_url].present? &&
39
+ (@attributes[:confirmation_success_url].present? || DeviseTokenAuth.default_confirm_success_url.present?)
40
+ end
41
+
42
+ def requires_reconfirmation?(resource_attributes)
43
+ resource_attributes.key?(:email) &&
44
+ @resource.devise_modules.include?(:confirmable) &&
45
+ @resource.respond_to?(:unconfirmed_email=)
46
+ end
47
+
48
+ def store_unconfirmed_email
49
+ @resource.unconfirmed_email = @resource.email
50
+ @resource.confirmation_token = nil
51
+ @resource.email = email_in_database
52
+ @resource.send(:generate_confirmation_token)
53
+ end
54
+
55
+ def email_in_database
56
+ if Devise.activerecord51?
57
+ @resource.email_in_database
58
+ else
59
+ @resource.email_was
60
+ end
61
+ end
62
+
63
+ def send_confirmation_instructions(saved)
64
+ return unless saved
65
+
66
+ @resource.send_confirmation_instructions(
67
+ redirect_url: @attributes[:confirmation_success_url] || DeviseTokenAuth.default_confirm_success_url,
68
+ template_path: ['graphql_devise/mailer'],
69
+ schema_url: @attributes[:schema_url]
70
+ )
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'operation_preparers/gql_name_setter'
2
4
  require_relative 'operation_preparers/mutation_field_setter'
3
5
  require_relative 'operation_preparers/resolver_type_setter'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OperationPreparers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OperationPreparers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OperationPreparers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OperationPreparers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OperationPreparers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OperationPreparers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  class OperationSanitizer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'supported_options'
2
4
 
3
5
  module GraphqlDevise
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OptionSanitizers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OptionSanitizers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OptionSanitizers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OptionSanitizers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'supported_operations_validator'
2
4
 
3
5
  module GraphqlDevise
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OptionValidators
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module MountMethod
3
5
  module OptionValidators
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'option_validators/skip_only_validator'
2
4
  require_relative 'option_validators/provided_operations_validator'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'option_sanitizers/array_checker'
2
4
  require_relative 'option_sanitizers/hash_checker'
3
5
  require_relative 'option_sanitizers/string_checker'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise_token_auth/version'
2
4
 
3
5
  module GraphqlDevise
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Mutations
3
5
  class Login < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Mutations
3
5
  class Logout < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Mutations
3
5
  class ResendConfirmation < Base
@@ -7,20 +9,19 @@ module GraphqlDevise
7
9
  field :message, String, null: false
8
10
 
9
11
  def resolve(email:, redirect_url:)
10
- resource = find_resource(
11
- :email,
12
- get_case_insensitive_field(:email, email)
13
- )
12
+ resource = find_confirmable_resource(email)
14
13
 
15
14
  if resource
16
15
  yield resource if block_given?
17
16
 
18
- raise_user_error(I18n.t('graphql_devise.confirmations.already_confirmed')) if resource.confirmed?
17
+ if resource.confirmed? && !resource.pending_reconfirmation?
18
+ raise_user_error(I18n.t('graphql_devise.confirmations.already_confirmed'))
19
+ end
19
20
 
20
21
  resource.send_confirmation_instructions(
21
22
  redirect_url: redirect_url,
22
23
  template_path: ['graphql_devise/mailer'],
23
- **controller.params.permit('controller', 'action').to_h.symbolize_keys
24
+ schema_url: controller.full_url_without_params
24
25
  )
25
26
 
26
27
  { message: I18n.t('graphql_devise.confirmations.send_instructions', email: email) }
@@ -28,6 +29,15 @@ module GraphqlDevise
28
29
  raise_user_error(I18n.t('graphql_devise.confirmations.user_not_found', email: email))
29
30
  end
30
31
  end
32
+
33
+ private
34
+
35
+ def find_confirmable_resource(email)
36
+ email_insensitive = get_case_insensitive_field(:email, email)
37
+ resource = find_resource(:unconfirmed_email, email_insensitive) if resource_class.reconfirmable
38
+ resource ||= find_resource(:email, email_insensitive)
39
+ resource
40
+ end
31
41
  end
32
42
  end
33
43
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Mutations
3
5
  class SendPasswordReset < Base
@@ -17,7 +19,7 @@ module GraphqlDevise
17
19
  provider: 'email',
18
20
  redirect_url: redirect_url,
19
21
  template_path: ['graphql_devise/mailer'],
20
- **controller.params.permit('controller', 'action').to_h.symbolize_keys
22
+ schema_url: controller.full_url_without_params
21
23
  )
22
24
 
23
25
  if resource.errors.empty?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Mutations
3
5
  class SignUp < Base
@@ -6,6 +8,11 @@ module GraphqlDevise
6
8
  argument :password_confirmation, String, required: true
7
9
  argument :confirm_success_url, String, required: false
8
10
 
11
+ field :credentials,
12
+ GraphqlDevise::Types::CredentialType,
13
+ null: true,
14
+ description: 'Authentication credentials. Null if after signUp resource is not active for authentication (e.g. Email confirmation required).'
15
+
9
16
  def resolve(confirm_success_url: nil, **attrs)
10
17
  resource = build_resource(attrs.merge(provider: provider))
11
18
  raise_user_error(I18n.t('graphql_devise.resource_build_failed')) if resource.blank?
@@ -28,13 +35,15 @@ module GraphqlDevise
28
35
  resource.send_confirmation_instructions(
29
36
  redirect_url: confirm_success_url,
30
37
  template_path: ['graphql_devise/mailer'],
31
- **controller.params.permit('controller', 'action').to_h.symbolize_keys
38
+ schema_url: controller.full_url_without_params
32
39
  )
33
40
  end
34
41
 
35
- set_auth_headers(resource) if resource.active_for_authentication?
42
+ response_payload = { authenticatable: resource }
43
+
44
+ response_payload[:credentials] = set_auth_headers(resource) if resource.active_for_authentication?
36
45
 
37
- { authenticatable: resource }
46
+ response_payload
38
47
  else
39
48
  resource.try(:clean_up_passwords)
40
49
  raise_user_error_list(
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Mutations
3
5
  class UpdatePassword < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionDispatch::Routing
2
4
  class Mapper
3
5
  def mount_graphql_devise_for(resource, options = {})
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise_token_auth/version'
2
4
 
3
5
  module GraphqlDevise
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Resolvers
3
5
  class CheckPasswordToken < Base