Skip to content

Commit 83f83af

Browse files
committed
wip
1 parent 5f91785 commit 83f83af

7 files changed

Lines changed: 86 additions & 2 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module GraphqlDevise
2+
module Mutations
3+
class SendPasswordReset < Base
4+
argument :email, String, required: true, prepare: ->(email, _) { email.downcase }
5+
argument :redirect_url, String, required: true
6+
7+
def resolve(email:, redirect_url:)
8+
resource = controller.find_resource(:uid, email)
9+
10+
if resource
11+
yield resource if block_given?
12+
resource.send_reset_password_instructions(
13+
email: email,
14+
provider: 'email',
15+
redirect_url: redirect_url
16+
)
17+
18+
if resource.errors.empty?
19+
{ authenticable: resource }
20+
else
21+
raise_user_error_list(I18n.t('graphql_devise.invalid_resource'), errors: resource.errors.full_messages)
22+
end
23+
else
24+
raise_user_error(I18n.t('graphql_devise.user_not_found'))
25+
end
26+
end
27+
end
28+
end
29+
end

app/helpers/graphql_devise/mailer_helper.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@ def confirmation_query(resource_name)
99
}
1010
}
1111
GRAPHQL
12+
ERB::Util.url_encode(raw.delete("\n").delete(' '))
13+
end
14+
15+
def password_reset_query(token:, redirect_url:, resource_name:)
16+
raw = <<-GRAPHQL
17+
mutation($token:ID!,redirectUrl:String!){
18+
#{resource_name.camelize(:lower)}CheckPasswordToken(token:$token,redirectUrl:$redirectUrl
19+
){
20+
authenticable{ email }
21+
}
22+
}&variables={token:"#{token}",redirectUrl:"#{redirect_url}"}
23+
GRAPHQL
24+
1225
raw.delete("\n").delete(' ')
1326
end
1427
end
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<p><%= t(:hello).capitalize %> <%= @resource.email %>!</p>
2+
3+
<p><%= t '.request_reset_link_msg' %></p>
4+
5+
<p><%= link_to t('.password_change_link'), url_for(controller: 'graphql_devise/graphql', action: :auth, query: password_reset_query(token: @token, redirect_url: message['redirect-url'], resource_name: @resource.class.to_s).html_safe) %></p>
6+
7+
<p><%= t '.ignore_mail_msg' %></p>
8+
<p><%= t '.no_changes_msg' %></p>

config/locales/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ en:
44
resource_build_failed: "Resource couldn't be built, execution stopped."
55
not_authenticated: "User is not logged in."
66
user_not_found: "User was not found or was not logged in."
7+
invalid_resource: "Errors present in the resource."
78
passwords:
89
update_password_error: "Unable to update user password"
910
missing_passwords: "You must fill out the fields labeled 'Password' and 'Password confirmation'."

lib/graphql_devise/rails/routes.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def mount_graphql_devise_for(resource, opts = {})
2222
logout: GraphqlDevise::Mutations::Logout,
2323
sign_up: GraphqlDevise::Mutations::SignUp,
2424
update_password: GraphqlDevise::Mutations::UpdatePassword,
25+
send_reset_password: GraphqlDevise::Mutations::SendPasswordReset,
2526
check_password_token: GraphqlDevise::Mutations::CheckPasswordToken
2627
}.freeze
2728

@@ -57,7 +58,7 @@ def mount_graphql_devise_for(resource, opts = {})
5758
GraphqlDevise::Types::QueryType.field("#{mapping_name}_#{action}", resolver: used_query)
5859
end
5960

60-
Devise.mailer.send(:add_template_helper, GraphqlDevise::MailerHelper)
61+
Devise.mailer.helper(GraphqlDevise::MailerHelper)
6162

6263
devise_scope mapping_name.to_sym do
6364
post "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth'

spec/dummy/config/locales/en.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
# available at http://guides.rubyonrails.org/i18n.html.
3131

3232
en:
33-
hello: "Hello world"
33+
hello_world: "Hello world"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require 'rails_helper'
2+
3+
RSpec.describe 'Send Password Reset Requests' do
4+
include_context 'with graphql query request'
5+
6+
let(:user) { create(:user, :confirmed) }
7+
let(:redirect_url) { Faker::Internet.url }
8+
let(:query) do
9+
<<-GRAPHQL
10+
mutation {
11+
userSendResetPassword(
12+
email: "#{user.email}",
13+
redirectUrl: "#{redirect_url}"
14+
) {
15+
authenticable {
16+
email
17+
}
18+
}
19+
}
20+
GRAPHQL
21+
end
22+
23+
context 'when params are correct' do
24+
it 'sends password reset email' do
25+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
26+
27+
email = ActionMailer::Base.deliveries.last
28+
query = ERB::Util.url_encode("mutation($token:ID!,redirectUrl:String!){userCheckPasswordToken(token:$token,redirectUrl:$redirectUrl){authenticable{email}}}&variables={token:").html_safe
29+
expect(email.body.decoded).to match(/query=#{query}/)
30+
end
31+
end
32+
end

0 commit comments

Comments
 (0)