Skip to content

Commit 9c65e4f

Browse files
Merge pull request #9 from graphql-devise/update-password-mutation
Update password mutation
2 parents 9e876e5 + ce8bc2e commit 9c65e4f

18 files changed

Lines changed: 213 additions & 17 deletions

File tree

Appraisals

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ end
77
appraise 'rails5.0-graphql1.8' do
88
gem 'rails', github: 'rails/rails', branch: '5-0-stable'
99
gem 'graphql', '~> 1.8.0'
10-
gem 'devise_token_auth', '0.1.37'
10+
gem 'devise_token_auth', '0.1.43'
1111
gem 'devise', '>= 4.0'
1212
end
1313

@@ -19,7 +19,7 @@ end
1919
appraise 'rails5.1-graphql1.8' do
2020
gem 'rails', github: 'rails/rails', branch: '5-1-stable'
2121
gem 'graphql', '~> 1.8.0'
22-
gem 'devise_token_auth', '0.1.42'
22+
gem 'devise_token_auth', '0.1.43'
2323
gem 'devise', '>= 4.3'
2424
end
2525

app/graphql/graphql_devise/mutations/base.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ def raise_user_error(message)
99
raise GraphqlDevise::UserError, message
1010
end
1111

12+
def raise_user_error_list(message, errors:)
13+
raise GraphqlDevise::DetailedUserError.new(message, errors: errors)
14+
end
15+
1216
def remove_resource
1317
controller.resource = nil
1418
controller.client_id = nil
@@ -31,6 +35,10 @@ def resource_class
3135
context[:resource_class]
3236
end
3337

38+
def recoverable_enabled?
39+
resource_class.devise_modules.include?(:recoverable)
40+
end
41+
3442
def current_resource
3543
context[:current_resource]
3644
end

app/graphql/graphql_devise/mutations/login.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def resolve(email:, password:)
1717

1818
yield resource if block_given?
1919

20-
{ success: true, authenticable: resource, errors: [] }
20+
{ authenticable: resource}
2121
elsif resource && !active_for_authentication?(resource)
2222
if locked?(resource)
2323
raise_user_error(I18n.t('graphql_devise.mailer.unlock_instructions.account_lock_msg'))
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
module GraphqlDevise
2+
module Mutations
3+
class UpdatePassword < Base
4+
argument :password, String, required: true
5+
argument :password_confirmation, String, required: true
6+
argument :current_password, String, required: false
7+
8+
def resolve(current_password: nil, **attrs)
9+
if current_resource.blank?
10+
raise_user_error(I18n.t('graphql_devise.not_authenticated'))
11+
elsif current_resource.provider != 'email'
12+
raise_user_error(
13+
I18n.t('graphql_devise.passwords.password_not_required', provider: current_resource.provider.humanize)
14+
)
15+
end
16+
17+
if update_resource_password(current_password, attrs)
18+
current_resource.allow_password_change = false if recoverable_enabled?
19+
current_resource.save!
20+
21+
yield current_resource if block_given?
22+
23+
{ authenticable: current_resource }
24+
else
25+
raise_user_error_list(
26+
I18n.t('graphql_devise.passwords.update_password_error'),
27+
errors: current_resource.errors.full_messages
28+
)
29+
end
30+
end
31+
32+
private
33+
34+
def update_resource_password(current_password, attrs)
35+
allow_password_change = recoverable_enabled? && current_resource.allow_password_change == true
36+
if DeviseTokenAuth.check_current_password_before_update == false || allow_password_change
37+
current_resource.public_send(:update, attrs)
38+
else
39+
current_resource.public_send(:update_with_password, attrs.merge(current_password: current_password))
40+
end
41+
end
42+
end
43+
end
44+
end

config/locales/en.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
en:
22
graphql_devise:
3+
not_authenticated: "User is not logged in."
34
user_not_found: "User was not found or was not logged in."
5+
passwords:
6+
update_password_error: "Unable to update user password"
7+
missing_passwords: "You must fill out the fields labeled 'Password' and 'Password confirmation'."
8+
password_not_required: "This account does not require a password. Sign in using your '%{provider}' account instead."
49
sessions:
510
bad_credentials: "Invalid login credentials. Please try again."
611
not_confirmed: "A confirmation email was sent to your account at '%{email}'. You must follow the instructions in the email before your account can be activated"

gemfiles/rails5.0_graphql1.8.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ source "https://rubygems.org"
44

55
gem "rails", github: "rails/rails", branch: "5-0-stable"
66
gem "graphql", "~> 1.8.0"
7-
gem "devise_token_auth", "0.1.37"
7+
gem "devise_token_auth", "0.1.43"
88
gem "devise", ">= 4.0"
99

1010
gemspec path: "../"

gemfiles/rails5.1_graphql1.8.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ source "https://rubygems.org"
44

55
gem "rails", github: "rails/rails", branch: "5-1-stable"
66
gem "graphql", "~> 1.8.0"
7-
gem "devise_token_auth", "0.1.42"
7+
gem "devise_token_auth", "0.1.43"
88
gem "devise", ">= 4.3"
99

1010
gemspec path: "../"

graphql_devise.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
2525

2626
spec.required_ruby_version = '>= 2.2.0'
2727

28-
spec.add_dependency 'devise_token_auth', '>= 0.1.37'
28+
spec.add_dependency 'devise_token_auth', '>= 0.1.43'
2929
spec.add_dependency 'graphql', '>= 1.8'
3030
spec.add_dependency 'rails', '>= 4.2'
3131

lib/graphql_devise.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
require 'devise_token_auth'
44
require 'graphql'
55
require 'graphql_devise/version'
6+
require 'graphql_devise/error_codes'
7+
require 'graphql_devise/user_error'
8+
require 'graphql_devise/detailed_user_error'
69

710
module GraphqlDevise
811
class Error < StandardError; end
912
end
10-
11-
require 'graphql_devise/user_error'
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module GraphqlDevise
2+
class DetailedUserError < GraphQL::ExecutionError
3+
def initialize(message, errors:)
4+
@message = message
5+
@errors = errors
6+
7+
super(message)
8+
end
9+
10+
def to_h
11+
super.merge(extensions: { code: ERROR_CODES.fetch(:user_error), detailed_errors: @errors })
12+
end
13+
end
14+
end

0 commit comments

Comments
 (0)