Skip to content

Commit 82f3f29

Browse files
Merge pull request #26 from graphql-devise/refactor-sign-up-mutation
Refactor signUp mutation, fix confirmable disabled
2 parents fc6b0d5 + 0613e16 commit 82f3f29

6 files changed

Lines changed: 37 additions & 39 deletions

File tree

app/graphql/graphql_devise/mutations/sign_up.rb

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,45 @@ class SignUp < Base
55
argument :password, String, required: true
66
argument :password_confirmation, String, required: true
77
argument :confirm_success_url, String, required: false
8-
argument :config_name, String, required: false
98

10-
def resolve(confirm_success_url: nil, config_name: nil, **attrs)
9+
def resolve(confirm_success_url: nil, **attrs)
1110
resource = resource_class.new(provider: provider, **attrs)
11+
raise_user_error(I18n.t('graphql_devise.resource_build_failed')) if resource.blank?
1212

13-
if resource.present?
14-
resource.skip_confirmation_notification! if resource.respond_to?(:skip_confirmation_notification!)
13+
redirect_url = confirm_success_url || DeviseTokenAuth.default_confirm_success_url
14+
if confirmable_enabled? && redirect_url.blank?
15+
raise_user_error(I18n.t('graphql_devise.registrations.missing_confirm_redirect_url'))
16+
end
1517

16-
if resource.save
17-
yield resource if block_given?
18+
if blacklisted_redirect_url?(redirect_url)
19+
raise_user_error(I18n.t('graphql_devise.registrations.redirect_url_not_allowed', redirect_url: redirect_url))
20+
end
1821

19-
if requires_confirmation?(resource)
20-
resource.send_confirmation_instructions(
21-
client_config: config_name,
22-
redirect_url: confirm_success_url,
23-
template_path: ['graphql_devise/mailer']
24-
)
25-
end
22+
resource.skip_confirmation_notification! if resource.respond_to?(:skip_confirmation_notification!)
2623

27-
set_auth_headers(resource) if resource.active_for_authentication?
24+
if resource.save
25+
yield resource if block_given?
2826

29-
{ authenticable: resource }
30-
else
31-
clean_up_passwords(resource)
32-
raise_user_error_list(
33-
I18n.t('graphql_devise.registration_failed'),
34-
errors: resource.errors.full_messages
27+
unless resource.confirmed?
28+
resource.send_confirmation_instructions(
29+
redirect_url: confirm_success_url,
30+
template_path: ['graphql_devise/mailer']
3531
)
3632
end
37-
else
38-
raise_user_error(I18n.t('graphql_devise.resource_build_failed'))
39-
end
40-
end
4133

42-
protected
34+
set_auth_headers(resource) if resource.active_for_authentication?
4335

44-
def confirmable_enabled?(resource)
45-
resource.respond_to?(:confirmed_at)
36+
{ authenticable: resource }
37+
else
38+
clean_up_passwords(resource)
39+
raise_user_error_list(
40+
I18n.t('graphql_devise.registration_failed'),
41+
errors: resource.errors.full_messages
42+
)
43+
end
4644
end
4745

48-
def requires_confirmation?(resource)
49-
resource.active_for_authentication? || !resource.confirmed?
50-
end
46+
private
5147

5248
def provider
5349
:email

config/locales/en.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ en:
55
not_authenticated: "User is not logged in."
66
user_not_found: "User was not found or was not logged in."
77
invalid_resource: "Errors present in the resource."
8+
registrations:
9+
missing_confirm_redirect_url: "Missing 'confirm_success_url' parameter. Required when confirmable module is enabled."
10+
redirect_url_not_allowed: "Redirect to '%{redirect_url}' not allowed."
811
passwords:
912
update_password_error: "Unable to update user password"
1013
missing_passwords: "You must fill out the fields labeled 'Password' and 'Password confirmation'."

lib/graphql_devise/concerns/controller_methods.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ def confirmable_enabled?
4747
resource_class.devise_modules.include?(:confirmable)
4848
end
4949

50+
def blacklisted_redirect_url?(redirect_url)
51+
DeviseTokenAuth.redirect_whitelist && !DeviseTokenAuth::Url.whitelisted?(redirect_url)
52+
end
53+
5054
def current_resource
5155
@current_resource ||= controller.send(:set_user_by_token, resource_name)
5256
end

spec/dummy/app/models/guest.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ class Guest < ApplicationRecord
22
devise :database_authenticatable,
33
:registerable,
44
:recoverable,
5-
:validatable,
6-
:confirmable
5+
:validatable
76

87
include GraphqlDevise::Concerns::Model
98
end

spec/dummy/config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
mount_graphql_devise_for(
1515
'Guest',
16-
only: [:login, :logout],
16+
only: [:login, :logout, :sign_up],
1717
at: '/api/v1/guest/graphql_auth'
1818
)
1919

spec/requests/mutations/sign_up_spec.rb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,8 @@
122122
GRAPHQL
123123
end
124124

125-
before { post_request }
126-
127-
it 'skips the sign up mutation' do
128-
expect(json_response[:errors]).to contain_exactly(
129-
hash_including(message: "Field 'guestSignUp' doesn't exist on type 'Mutation'")
130-
)
125+
it 'works without the confirmable module' do
126+
expect { post_request }.to change(Guest, :count).from(0).to(1)
131127
end
132128
end
133129
end

0 commit comments

Comments
 (0)