Skip to content

Commit 82155a8

Browse files
committed
Stop depending on devise mappings to mount resources
1 parent 941cf68 commit 82155a8

16 files changed

Lines changed: 95 additions & 82 deletions

app/controllers/graphql_devise/concerns/set_user_by_token.rb

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ module Concerns
1010
class_methods do
1111
def set_resource_by_model(models, **kwargs)
1212
Array(models).each do |model|
13-
GraphqlDevise.add_mapping(GraphqlDevise.to_mapping_name(model.to_s), model.to_s)
13+
GraphqlDevise.configure_warden_serializer_for_model(model)
1414
end
15-
GraphqlDevise.reconfigure_warden!
1615

1716
before_action(**kwargs) do
1817
authenticate_model(models)
@@ -23,19 +22,14 @@ def set_resource_by_model(models, **kwargs)
2322
def authenticate_model(models)
2423
Array(models).each do |model|
2524
set_resource_by_token(model)
26-
return @resource
25+
return @resource if @resource.present?
2726
end
2827

2928
nil
3029
end
3130

3231
def resource_class(resource = nil)
33-
return super unless resource.is_a?(Class)
34-
35-
if (Object.const_defined?('ActiveRecord::Base') && resource < ActiveRecord::Base) ||
36-
(Object.const_defined?('Mongoid::Document') && resource < Mongoid::Document)
37-
return resource
38-
end
32+
return resource if resource.respond_to?(:find_by)
3933

4034
super
4135
end

lib/graphql_devise.rb

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ def self.load_schema
2020
@schema_loaded = true
2121
end
2222

23-
def self.resource_mounted?(mapping_name)
24-
@mounted_resources.include?(mapping_name)
23+
def self.resource_mounted?(model)
24+
@mounted_resources.include?(model)
2525
end
2626

27-
def self.mount_resource(mapping_name)
28-
@mounted_resources << mapping_name
27+
def self.mount_resource(model)
28+
@mounted_resources << model
2929
end
3030

3131
def self.add_mapping(mapping_name, resource)
@@ -37,14 +37,19 @@ def self.add_mapping(mapping_name, resource)
3737
)
3838
end
3939

40-
def self.reconfigure_warden!
41-
Devise.class_variable_set(:@@warden_configured, nil)
42-
Devise.configure_warden!
43-
end
44-
4540
def self.to_mapping_name(resource)
4641
resource.to_s.underscore.tr('/', '_')
4742
end
43+
44+
def self.configure_warden_serializer_for_model(model)
45+
Devise.warden_config.serialize_into_session(to_mapping_name(model)) do |record|
46+
model.serialize_into_session(record)
47+
end
48+
49+
Devise.warden_config.serialize_from_session(to_mapping_name(model)) do |args|
50+
model.serialize_from_session(*args)
51+
end
52+
end
4853
end
4954

5055
require 'graphql_devise/engine'

lib/graphql_devise/concerns/controller_methods.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ def controller
4040
end
4141

4242
def resource_name
43-
self.class.instance_variable_get(:@resource_name)
43+
GraphqlDevise.to_mapping_name(resource_class)
4444
end
4545

4646
def resource_class
47-
controller.send(:resource_class, resource_name)
47+
self.class.instance_variable_get(:@resource_klass)
4848
end
4949

5050
def recoverable_enabled?
@@ -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_name)
63+
@current_resource ||= controller.send(:set_user_by_token, resource_class)
6464
end
6565

6666
def client

lib/graphql_devise/mount_method/operation_preparer.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
require_relative 'operation_preparers/gql_name_setter'
44
require_relative 'operation_preparers/mutation_field_setter'
55
require_relative 'operation_preparers/resolver_type_setter'
6-
require_relative 'operation_preparers/resource_name_setter'
6+
require_relative 'operation_preparers/resource_klass_setter'
77
require_relative 'operation_preparers/default_operation_preparer'
88
require_relative 'operation_preparers/custom_operation_preparer'
99

1010
module GraphqlDevise
1111
module MountMethod
1212
class OperationPreparer
13-
def initialize(mapping_name:, selected_operations:, preparer:, custom:, additional_operations:)
13+
def initialize(model:, selected_operations:, preparer:, custom:, additional_operations:)
1414
@selected_operations = selected_operations
1515
@preparer = preparer
16-
@mapping_name = mapping_name
16+
@model = model
1717
@custom = custom
1818
@additional_operations = additional_operations
1919
end
@@ -22,18 +22,18 @@ def call
2222
default_operations = OperationPreparers::DefaultOperationPreparer.new(
2323
selected_operations: @selected_operations,
2424
custom_keys: @custom.keys,
25-
mapping_name: @mapping_name,
25+
model: @model,
2626
preparer: @preparer
2727
).call
2828

2929
custom_operations = OperationPreparers::CustomOperationPreparer.new(
3030
selected_keys: @selected_operations.keys,
3131
custom_operations: @custom,
32-
mapping_name: @mapping_name
32+
model: @model
3333
).call
3434

3535
additional_operations = @additional_operations.each_with_object({}) do |(action, operation), result|
36-
result[action] = OperationPreparers::ResourceNameSetter.new(@mapping_name).call(operation)
36+
result[action] = OperationPreparers::ResourceKlassSetter.new(@model).call(operation)
3737
end
3838

3939
default_operations.merge(custom_operations).merge(additional_operations)

lib/graphql_devise/mount_method/operation_preparers/custom_operation_preparer.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ module GraphqlDevise
44
module MountMethod
55
module OperationPreparers
66
class CustomOperationPreparer
7-
def initialize(selected_keys:, custom_operations:, mapping_name:)
7+
def initialize(selected_keys:, custom_operations:, model:)
88
@selected_keys = selected_keys
99
@custom_operations = custom_operations
10-
@mapping_name = mapping_name
10+
@model = model
1111
end
1212

1313
def call
14+
mapping_name = GraphqlDevise.to_mapping_name(@model)
15+
1416
@custom_operations.slice(*@selected_keys).each_with_object({}) do |(action, operation), result|
15-
mapped_action = "#{@mapping_name}_#{action}"
17+
mapped_action = "#{mapping_name}_#{action}"
1618

1719
result[mapped_action.to_sym] = [
1820
OperationPreparers::GqlNameSetter.new(mapped_action),
19-
OperationPreparers::ResourceNameSetter.new(@mapping_name)
21+
OperationPreparers::ResourceKlassSetter.new(@model)
2022
].reduce(operation) { |prepared_operation, preparer| preparer.call(prepared_operation) }
2123
end
2224
end

lib/graphql_devise/mount_method/operation_preparers/default_operation_preparer.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,25 @@ module GraphqlDevise
44
module MountMethod
55
module OperationPreparers
66
class DefaultOperationPreparer
7-
def initialize(selected_operations:, custom_keys:, mapping_name:, preparer:)
7+
def initialize(selected_operations:, custom_keys:, model:, preparer:)
88
@selected_operations = selected_operations
99
@custom_keys = custom_keys
10-
@mapping_name = mapping_name
10+
@model = model
1111
@preparer = preparer
1212
end
1313

1414
def call
15+
mapping_name = GraphqlDevise.to_mapping_name(@model)
16+
1517
@selected_operations.except(*@custom_keys).each_with_object({}) do |(action, operation_info), result|
16-
mapped_action = "#{@mapping_name}_#{action}"
18+
mapped_action = "#{mapping_name}_#{action}"
1719
operation = operation_info[:klass]
1820
options = operation_info.except(:klass)
1921

2022
result[mapped_action.to_sym] = [
2123
OperationPreparers::GqlNameSetter.new(mapped_action),
2224
@preparer,
23-
OperationPreparers::ResourceNameSetter.new(@mapping_name)
25+
OperationPreparers::ResourceKlassSetter.new(@model)
2426
].reduce(child_class(operation)) do |prepared_operation, preparer|
2527
preparer.call(prepared_operation, **options)
2628
end

lib/graphql_devise/mount_method/operation_preparers/resource_name_setter.rb renamed to lib/graphql_devise/mount_method/operation_preparers/resource_klass_setter.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
module GraphqlDevise
44
module MountMethod
55
module OperationPreparers
6-
class ResourceNameSetter
7-
def initialize(name)
8-
@name = name
6+
class ResourceKlassSetter
7+
def initialize(klass)
8+
@klass = klass
99
end
1010

1111
def call(operation, **)
12-
operation.instance_variable_set(:@resource_name, @name)
12+
operation.instance_variable_set(:@resource_klass, @klass)
1313

1414
operation
1515
end

lib/graphql_devise/resource_loader.rb

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@ def initialize(resource, options = {}, routing = false)
1010
end
1111

1212
def call(query, mutation)
13-
mapping_name = GraphqlDevise.to_mapping_name(@resource).to_sym
14-
1513
# clean_options responds to all keys defined in GraphqlDevise::MountMethod::SUPPORTED_OPTIONS
1614
clean_options = GraphqlDevise::MountMethod::OptionSanitizer.new(@options).call!
1715

18-
return clean_options if GraphqlDevise.resource_mounted?(mapping_name) && @routing
16+
model = @resource.is_a?(String) ? @resource.constantize : @resource
17+
18+
return clean_options if GraphqlDevise.resource_mounted?(model) && @routing
1919

2020
validate_options!(clean_options)
2121

2222
authenticatable_type = clean_options.authenticatable_type.presence ||
2323
"Types::#{@resource}Type".safe_constantize ||
2424
GraphqlDevise::Types::AuthenticatableType
2525

26-
prepared_mutations = prepare_mutations(mapping_name, clean_options, authenticatable_type)
26+
prepared_mutations = prepare_mutations(model, clean_options, authenticatable_type)
2727

2828
if prepared_mutations.any? && mutation.blank?
2929
raise GraphqlDevise::Error, 'You need to provide a mutation type unless all mutations are skipped'
@@ -33,7 +33,7 @@ def call(query, mutation)
3333
mutation.field(action, mutation: prepared_mutation, authenticate: false)
3434
end
3535

36-
prepared_resolvers = prepare_resolvers(mapping_name, clean_options, authenticatable_type)
36+
prepared_resolvers = prepare_resolvers(model, clean_options, authenticatable_type)
3737

3838
if prepared_resolvers.any? && query.blank?
3939
raise GraphqlDevise::Error, 'You need to provide a query type unless all queries are skipped'
@@ -43,17 +43,18 @@ def call(query, mutation)
4343
query.field(action, resolver: resolver, authenticate: false)
4444
end
4545

46-
GraphqlDevise.add_mapping(mapping_name, @resource)
47-
GraphqlDevise.mount_resource(mapping_name) if @routing
46+
GraphqlDevise.configure_warden_serializer_for_model(model)
47+
GraphqlDevise.add_mapping(GraphqlDevise.to_mapping_name(@resource).to_sym, @resource)
48+
GraphqlDevise.mount_resource(model) if @routing
4849

4950
clean_options
5051
end
5152

5253
private
5354

54-
def prepare_resolvers(mapping_name, clean_options, authenticatable_type)
55+
def prepare_resolvers(model, clean_options, authenticatable_type)
5556
GraphqlDevise::MountMethod::OperationPreparer.new(
56-
mapping_name: mapping_name,
57+
model: model,
5758
custom: clean_options.operations,
5859
additional_operations: clean_options.additional_queries,
5960
preparer: GraphqlDevise::MountMethod::OperationPreparers::ResolverTypeSetter.new(authenticatable_type),
@@ -63,9 +64,9 @@ def prepare_resolvers(mapping_name, clean_options, authenticatable_type)
6364
).call
6465
end
6566

66-
def prepare_mutations(mapping_name, clean_options, authenticatable_type)
67+
def prepare_mutations(model, clean_options, authenticatable_type)
6768
GraphqlDevise::MountMethod::OperationPreparer.new(
68-
mapping_name: mapping_name,
69+
model: model,
6970
custom: clean_options.operations,
7071
additional_operations: clean_options.additional_mutations,
7172
preparer: GraphqlDevise::MountMethod::OperationPreparers::MutationFieldSetter.new(authenticatable_type),

lib/graphql_devise/schema_plugin.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ def initialize(query: nil, mutation: nil, authenticate_default: true, public_int
1616

1717
# Must happen on initialize so operations are loaded before the types are added to the schema on GQL < 1.10
1818
load_fields
19-
GraphqlDevise.reconfigure_warden!
2019
end
2120

2221
def use(schema_definition)

spec/dummy/config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
}
1212

1313
mount_graphql_devise_for(
14-
'Admin',
14+
Admin,
1515
authenticatable_type: Types::CustomAdminType,
1616
skip: [:sign_up, :check_password_token],
1717
operations: {

0 commit comments

Comments
 (0)