Skip to content

Commit 3002a6f

Browse files
author
David Revelo
committed
Add sign up mutation
Add confirmation query as url params in email
1 parent 9c65e4f commit 3002a6f

13 files changed

Lines changed: 171 additions & 10 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@
1616
/*.sqlite3
1717
/spec/dummy/db/development.sqlite3
1818
/spec/dummy/db/test.sqlite3
19+
/graphql_devise-0.1.0.gem

app/graphql/graphql_devise/mutations/base.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ def client
5050
controller.token.client if controller.token.present?
5151
end
5252
end
53+
54+
def set_auth_headers(resource)
55+
auth_headers = resource.create_new_auth_token
56+
response.headers.merge!(auth_headers)
57+
end
5358
end
5459
end
5560
end

app/graphql/graphql_devise/mutations/login.rb

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ def resolve(email:, password:)
3131

3232
private
3333

34-
def set_auth_headers(resource)
35-
auth_headers = resource.create_new_auth_token
36-
response.headers.merge!(auth_headers)
37-
end
38-
3934
def invalid_for_authentication?(resource, password)
4035
valid_password = resource.valid_password?(password)
4136

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
module GraphqlDevise
2+
module Mutations
3+
class SignUp < Base
4+
argument :email, String, required: true
5+
argument :name, String, required: false
6+
argument :password, String, required: true
7+
argument :password_confirmation, String, required: true
8+
argument :confirm_success_url, String, required: false
9+
argument :config_name, String, required: false
10+
11+
field :authenticable, GraphqlDevise::Types::AuthenticableType, null: true
12+
field :success, Boolean, null: false
13+
field :errors, [String], null: false
14+
15+
def resolve(email:, **attrs)
16+
redirect_url = attrs.delete(:confirm_success_url)
17+
resource = resource_class.new(email: email, provider: :email, **attrs)
18+
19+
if resource.present?
20+
resource.skip_confirmation_notification! if resource.respond_to?(:skip_confirmation_notification!)
21+
22+
if resource.save
23+
yield resource if block_given?
24+
25+
if confirmable_enabled?(resource) && !resource.confirmed?
26+
# user will require email authentication
27+
resource.send_confirmation_instructions(
28+
client_config: attrs[:config_name],
29+
redirect_url: redirect_url
30+
)
31+
end
32+
33+
set_auth_headers(resource) if active_for_authentication?(resource)
34+
35+
{ success: true, authenticable: resource, errors: [] }
36+
else
37+
clean_up_passwords(resource)
38+
resource_errors(resource)
39+
end
40+
else
41+
single_error_object("Resource couldn't be built, execution stopped.")
42+
end
43+
end
44+
45+
protected
46+
47+
def confirmable_enabled?(resource)
48+
resource.respond_to?(:confirmed_at)
49+
end
50+
51+
def active_for_authentication?(resource)
52+
resource.active_for_authentication?
53+
end
54+
55+
def provider
56+
:email
57+
end
58+
59+
# NOTE: Devise controller method, find a way to re use it
60+
def clean_up_passwords(resource)
61+
resource.clean_up_passwords if object.respond_to?(:clean_up_passwords)
62+
end
63+
end
64+
end
65+
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module GraphqlDevise
2+
module MailerHelper
3+
extend ActiveSupport::Concern
4+
5+
protected
6+
7+
def confirmation_query(token:, config:, redirect_url:)
8+
raw = <<-GRAPHQL
9+
confirmAccount($token:ID!,$clientConfig:String,redirect:String!){
10+
userConfirmAccount(token:$token,clientConfig:$clientConfig,redirect:$redirect
11+
){
12+
success,errors
13+
}
14+
}&variables={token:"#{token}",clientConfig:"#{config}",redirect:"#{redirect_url}"}
15+
GRAPHQL
16+
ERB::Util.url_encode(raw.gsub("\n", '').gsub(' ', ''))
17+
end
18+
end
19+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<p><%= t(:welcome).capitalize + ' ' + @email %>!</p>
2+
3+
<p><%= t '.confirm_link_msg' %> </p>
4+
5+
<p><%= link_to t('.confirm_account_link'), api_v1_graphql_auth_url, query: confirmation_query(token: @token, config: message['client-config'].to_s, redirect_url: message['redirect-url']).html_safe %></p>

graphql_devise.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
3333
spec.add_development_dependency 'factory_bot'
3434
spec.add_development_dependency 'faker'
3535
spec.add_development_dependency 'pry'
36+
spec.add_development_dependency 'pry-byebug'
3637
spec.add_development_dependency 'rake', '~> 10.0'
3738
spec.add_development_dependency 'rspec-rails'
3839
spec.add_development_dependency 'rubocop', '0.68.1'

lib/graphql_devise.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require 'rails'
2-
require 'graphql_devise/engine'
32
require 'devise_token_auth'
3+
require 'graphql_devise/engine'
44
require 'graphql'
55
require 'graphql_devise/version'
66
require 'graphql_devise/error_codes'

lib/graphql_devise/rails/routes.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# frozen_string_literal: true
2-
31
module ActionDispatch::Routing
42
class Mapper
53
def mount_graphql_devise_for(resource, opts = {})
@@ -21,6 +19,7 @@ def mount_graphql_devise_for(resource, opts = {})
2119
default_mutations = {
2220
login: GraphqlDevise::Mutations::Login,
2321
logout: GraphqlDevise::Mutations::Logout,
22+
signUp: GraphqlDevise::Mutations::SignUp,
2423
update_password: GraphqlDevise::Mutations::UpdatePassword
2524
}.freeze
2625

@@ -35,9 +34,11 @@ def mount_graphql_devise_for(resource, opts = {})
3534
new_mutation
3635
end
3736

38-
GraphqlDevise::Types::MutationType.field("#{mapping_name}_#{action}", mutation: used_mutation)
37+
GraphqlDevise::Types::MutationType.field("#{mapping_name}_#{action.to_s.underscore}", mutation: used_mutation)
3938
end
4039

40+
Devise.mailer.send(:add_template_helper, GraphqlDevise::MailerHelper)
41+
4142
devise_scope mapping_name.to_sym do
4243
post "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth'
4344
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module Mutations
2+
class SignUp < GraphqlDevise::Mutations::SignUp
3+
field :user, Types::UserType, null: true
4+
5+
def resolve(email:, **attrs)
6+
original_payload = super
7+
original_payload.merge(user: original_payload[:authenticable])
8+
end
9+
end
10+
end

0 commit comments

Comments
 (0)