Skip to content

Commit f794f86

Browse files
committed
Postpone set_resource_by_token until tracer
1 parent 55ec2a1 commit f794f86

5 files changed

Lines changed: 44 additions & 11 deletions

File tree

app/controllers/graphql_devise/concerns/set_user_by_token.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ module Concerns
55
SetUserByToken.module_eval do
66
attr_accessor :client_id, :token, :resource
77

8-
alias_method :set_resource_by_token, :set_user_by_token
8+
def set_resource_by_token(resource)
9+
set_user_by_token(resource)
10+
end
911

10-
def graphql_context
12+
def graphql_context(resource_name)
1113
{
12-
current_resource: @resource,
13-
controller: self
14+
resource_name: resource_name,
15+
controller: self
1416
}
1517
end
1618

lib/graphql_devise/schema_plugin.rb

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,42 @@ def trace(event, trace_data)
2323

2424
field = traced_field(trace_data)
2525
provided_value = authenticate_option(field, trace_data)
26+
context = set_current_resource(context_from_data(trace_data))
2627

2728
if !provided_value.nil?
28-
raise_on_missing_resource(context(trace_data), field) if provided_value
29+
raise_on_missing_resource(context, field) if provided_value
2930
elsif @authenticate_default
30-
raise_on_missing_resource(context(trace_data), field)
31+
raise_on_missing_resource(context, field)
3132
end
3233

3334
yield
3435
end
3536

3637
private
3738

39+
def set_current_resource(context)
40+
controller = context[:controller]
41+
resource_names = Array(context[:resource_name])
42+
context[:current_resource] = resource_names.find do |resource_name|
43+
unless Devise.mappings.key?(resource_name)
44+
raise(
45+
GraphqlDevise::Error,
46+
"Invalid resource_name `#{resource_name}` provided to `graphql_context`. Possible values are: #{Devise.mappings.keys}."
47+
)
48+
end
49+
50+
found = controller.set_resource_by_token(resource_name)
51+
break found if found
52+
end
53+
54+
context
55+
end
56+
3857
def raise_on_missing_resource(context, field)
3958
@unauthenticated_proc.call(field.name) if context[:current_resource].blank?
4059
end
4160

42-
def context(trace_data)
61+
def context_from_data(trace_data)
4362
query = if trace_data[:context]
4463
trace_data[:context].query
4564
else

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ module V1
33
class GraphqlController < ApplicationController
44
include GraphqlDevise::Concerns::SetUserByToken
55

6-
before_action -> { set_resource_by_token(:user) }
7-
86
def graphql
9-
render json: DummySchema.execute(params[:query], context: graphql_context)
7+
render json: DummySchema.execute(params[:query], context: graphql_context(:user))
108
end
119

1210
def interpreter
13-
render json: InterpreterSchema.execute(params[:query], context: graphql_context)
11+
render json: InterpreterSchema.execute(params[:query], context: graphql_context(:user))
12+
end
13+
14+
def failing_resource_name
15+
render json: DummySchema.execute(params[:query], context: graphql_context([:user, :fail]))
1416
end
1517

1618
private

spec/dummy/config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@
2929

3030
post '/api/v1/graphql', to: 'api/v1/graphql#graphql'
3131
post '/api/v1/interpreter', to: 'api/v1/graphql#interpreter'
32+
post '/api/v1/failing', to: 'api/v1/graphql#failing_resource_name'
3233
end

spec/requests/user_controller_spec.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@
2929
expect(json_response[:data][:publicField]).to eq('Field does not require authentication')
3030
end
3131
end
32+
33+
context 'when using the failing route' do
34+
it 'raises an invalid resource_name error' do
35+
expect { post_request('/api/v1/failing') }.to raise_error(
36+
GraphqlDevise::Error,
37+
'Invalid resource_name `fail` provided to `graphql_context`. Possible values are: [:user, :admin, :guest, :users_customer].'
38+
)
39+
end
40+
end
3241
end
3342

3443
describe 'privateField' do

0 commit comments

Comments
 (0)