Skip to content

Commit 45bda76

Browse files
committed
Configure warden when gem is included in the model
1 parent 82155a8 commit 45bda76

7 files changed

Lines changed: 99 additions & 71 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# frozen_string_literal: true
2+
3+
module GraphqlDevise
4+
module Concerns
5+
module AdditionalControllerMethods
6+
extend ActiveSupport::Concern
7+
8+
included do
9+
attr_accessor :client_id, :token, :resource
10+
end
11+
12+
def gql_devise_context(models)
13+
{
14+
current_resource: authenticate_model(models),
15+
controller: self
16+
}
17+
end
18+
19+
def authenticate_model(models)
20+
Array(models).each do |model|
21+
set_resource_by_token(model)
22+
return @resource if @resource.present?
23+
end
24+
25+
nil
26+
end
27+
28+
def resource_class(resource = nil)
29+
return resource if resource.respond_to?(:find_by)
30+
31+
super
32+
end
33+
34+
def full_url_without_params
35+
request.base_url + request.path
36+
end
37+
38+
def set_resource_by_token(resource)
39+
set_user_by_token(resource)
40+
end
41+
42+
def graphql_context(resource_name)
43+
{
44+
resource_name: resource_name,
45+
controller: self
46+
}
47+
end
48+
49+
def build_redirect_headers(access_token, client, redirect_header_options = {})
50+
{
51+
DeviseTokenAuth.headers_names[:"access-token"] => access_token,
52+
DeviseTokenAuth.headers_names[:client] => client,
53+
:config => params[:config],
54+
:client_id => client,
55+
:token => access_token
56+
}.merge(redirect_header_options)
57+
end
58+
end
59+
end
60+
end

app/controllers/graphql_devise/concerns/set_user_by_token.rb

Lines changed: 5 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,12 @@
22

33
module GraphqlDevise
44
module Concerns
5-
SetUserByToken = DeviseTokenAuth::Concerns::SetUserByToken
5+
module SetUserByToken
6+
extend ActiveSupport::Concern
67

7-
SetUserByToken.module_eval do
8-
attr_accessor :client_id, :token, :resource
9-
10-
class_methods do
11-
def set_resource_by_model(models, **kwargs)
12-
Array(models).each do |model|
13-
GraphqlDevise.configure_warden_serializer_for_model(model)
14-
end
15-
16-
before_action(**kwargs) do
17-
authenticate_model(models)
18-
end
19-
end
20-
end
21-
22-
def authenticate_model(models)
23-
Array(models).each do |model|
24-
set_resource_by_token(model)
25-
return @resource if @resource.present?
26-
end
27-
28-
nil
29-
end
30-
31-
def resource_class(resource = nil)
32-
return resource if resource.respond_to?(:find_by)
33-
34-
super
35-
end
36-
37-
def full_url_without_params
38-
request.base_url + request.path
39-
end
40-
41-
def set_resource_by_token(resource)
42-
set_user_by_token(resource)
43-
end
44-
45-
def graphql_context(resource_name)
46-
context = {
47-
resource_name: resource_name,
48-
controller: self
49-
}
50-
context[:current_resource] = @resource if @resource.present?
51-
52-
context
53-
end
54-
55-
def build_redirect_headers(access_token, client, redirect_header_options = {})
56-
{
57-
DeviseTokenAuth.headers_names[:"access-token"] => access_token,
58-
DeviseTokenAuth.headers_names[:client] => client,
59-
:config => params[:config],
60-
:client_id => client,
61-
:token => access_token
62-
}.merge(redirect_header_options)
8+
included do
9+
include DeviseTokenAuth::Concerns::SetUserByToken
10+
include GraphqlDevise::Concerns::AdditionalControllerMethods
6311
end
6412
end
6513
end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
require 'graphql_devise/model/with_email_updater'
4+
5+
module GraphqlDevise
6+
module Concerns
7+
module AdditionalModelMethods
8+
extend ActiveSupport::Concern
9+
10+
class_methods do
11+
def reconfirmable
12+
devise_modules.include?(:confirmable) && column_names.include?('unconfirmed_email')
13+
end
14+
end
15+
16+
def update_with_email(attributes = {})
17+
GraphqlDevise::Model::WithEmailUpdater.new(self, attributes).call
18+
end
19+
end
20+
end
21+
end

app/models/graphql_devise/concerns/model.rb

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44

55
module GraphqlDevise
66
module Concerns
7-
Model = DeviseTokenAuth::Concerns::User
7+
module Model
8+
extend ActiveSupport::Concern
89

9-
Model.module_eval do
10-
class_methods do
11-
def reconfirmable
12-
devise_modules.include?(:confirmable) && column_names.include?('unconfirmed_email')
13-
end
14-
end
10+
included do
11+
include DeviseTokenAuth::Concerns::User
12+
include GraphqlDevise::Concerns::AdditionalModelMethods
1513

16-
def update_with_email(attributes = {})
17-
GraphqlDevise::Model::WithEmailUpdater.new(self, attributes).call
14+
GraphqlDevise.configure_warden_serializer_for_model(self)
1815
end
1916
end
2017
end

lib/graphql_devise/concerns/controller_methods.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def blacklisted_redirect_url?(redirect_url)
6060
end
6161

6262
def current_resource
63-
@current_resource ||= controller.send(:set_user_by_token, resource_class)
63+
@current_resource ||= controller.send(:set_resource_by_token, resource_class)
6464
end
6565

6666
def client

lib/graphql_devise/resource_loader.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ def call(query, mutation)
4343
query.field(action, resolver: resolver, authenticate: false)
4444
end
4545

46-
GraphqlDevise.configure_warden_serializer_for_model(model)
4746
GraphqlDevise.add_mapping(GraphqlDevise.to_mapping_name(@resource).to_sym, @resource)
4847
GraphqlDevise.mount_resource(model) if @routing
4948

spec/dummy/app/controllers/api/v1/graphql_controller.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ module V1
55
class GraphqlController < ApplicationController
66
include GraphqlDevise::Concerns::SetUserByToken
77

8-
set_resource_by_model SchemaUser, only: [:controller_auth]
9-
108
def graphql
119
result = DummySchema.execute(params[:query], **execute_params(params))
1210

@@ -22,7 +20,12 @@ def failing_resource_name
2220
end
2321

2422
def controller_auth
25-
result = DummySchema.execute(params[:query], **execute_params(params))
23+
result = DummySchema.execute(
24+
params[:query],
25+
operation_name: params[:operationName],
26+
variables: ensure_hash(params[:variables]),
27+
context: gql_devise_context(SchemaUser)
28+
)
2629

2730
render json: result unless performed?
2831
end

0 commit comments

Comments
 (0)