Skip to content

Commit ce61b29

Browse files
authored
Merge pull request #7 from graphql-devise/create-sign-up-mutation
Create sign up mutation
2 parents 9c65e4f + aa9c806 commit ce61b29

15 files changed

Lines changed: 182 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+
/*.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: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
module GraphqlDevise
2+
module Mutations
3+
class SignUp < Base
4+
argument :email, String, required: true
5+
argument :password, String, required: true
6+
argument :password_confirmation, String, required: true
7+
argument :confirm_success_url, String, required: false
8+
argument :config_name, String, required: false
9+
10+
def resolve(confirm_success_url: nil, config_name: nil, **attrs)
11+
resource = resource_class.new(provider: provider, **attrs)
12+
13+
if resource.present?
14+
resource.skip_confirmation_notification! if resource.respond_to?(:skip_confirmation_notification!)
15+
16+
if resource.save
17+
yield resource if block_given?
18+
19+
if confirmable_enabled?(resource) && !resource.confirmed?
20+
# user will require email authentication
21+
resource.send_confirmation_instructions(
22+
client_config: config_name,
23+
redirect_url: confirm_success_url
24+
)
25+
end
26+
27+
set_auth_headers(resource) if active_for_authentication?(resource)
28+
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
35+
)
36+
end
37+
else
38+
raise_user_error(I18n.t('graphql_devise.resource_build_failed'))
39+
end
40+
end
41+
42+
protected
43+
44+
def confirmable_enabled?(resource)
45+
resource.respond_to?(:confirmed_at)
46+
end
47+
48+
def active_for_authentication?(resource)
49+
resource.active_for_authentication?
50+
end
51+
52+
def provider
53+
:email
54+
end
55+
56+
def clean_up_passwords(resource)
57+
controller.send(:clean_up_passwords, resource)
58+
end
59+
end
60+
end
61+
end
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module GraphqlDevise
2+
module MailerHelper
3+
def confirmation_query(token:, config:, redirect_url:)
4+
raw = <<-GRAPHQL
5+
confirmAccount($token:ID!,$clientConfig:String,redirect:String!){
6+
userConfirmAccount(token:$token,clientConfig:$clientConfig,redirect:$redirect
7+
){
8+
success,errors
9+
}
10+
}&variables={token:"#{token}",clientConfig:"#{config}",redirect:"#{redirect_url}"}
11+
GRAPHQL
12+
ERB::Util.url_encode(raw.gsub("\n", '').gsub(' ', ''))
13+
end
14+
end
15+
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>

config/locales/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
en:
22
graphql_devise:
3+
registration_failed: "User couldn't be registered"
4+
resource_build_failed: "Resource couldn't be built, execution stopped."
35
not_authenticated: "User is not logged in."
46
user_not_found: "User was not found or was not logged in."
57
passwords:

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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'rails'
2-
require 'graphql_devise/engine'
3-
require 'devise_token_auth'
42
require 'graphql'
3+
require 'devise_token_auth'
4+
require 'graphql_devise/engine'
55
require 'graphql_devise/version'
66
require 'graphql_devise/error_codes'
77
require 'graphql_devise/user_error'

lib/graphql_devise/rails/routes.rb

Lines changed: 3 additions & 2 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+
sign_up: GraphqlDevise::Mutations::SignUp,
2423
update_password: GraphqlDevise::Mutations::UpdatePassword
2524
}.freeze
2625

@@ -38,6 +37,8 @@ def mount_graphql_devise_for(resource, opts = {})
3837
GraphqlDevise::Types::MutationType.field("#{mapping_name}_#{action}", 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

0 commit comments

Comments
 (0)