From f143d1ffcdbbaa75fe8ac6eb44f4a88c93c999c6 Mon Sep 17 00:00:00 2001 From: Mario Celi Date: Sun, 22 Sep 2019 21:22:43 -0500 Subject: [PATCH 1/2] Set resource_name when mounting resource --- .gitignore | 2 ++ .../graphql_devise/graphql_controller.rb | 8 +------ .../resolvers/confirm_account.rb | 6 ----- .../concerns/controller_methods.rb | 8 +++++-- lib/graphql_devise/rails/routes.rb | 6 +++-- spec/requests/mutations/logout_spec.rb | 23 +++++++++++++++++++ 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 58259473..4ad1459a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ # rvm config files .ruby-version .ruby-gemset + +.env diff --git a/app/controllers/graphql_devise/graphql_controller.rb b/app/controllers/graphql_devise/graphql_controller.rb index 0656d740..6239b77c 100644 --- a/app/controllers/graphql_devise/graphql_controller.rb +++ b/app/controllers/graphql_devise/graphql_controller.rb @@ -2,8 +2,6 @@ module GraphqlDevise class GraphqlController < ApplicationController - before_action :set_user_by_token - def auth result = if params[:_json] GraphqlDevise::Schema.multiplex( @@ -26,11 +24,7 @@ def execute_params(item) { operation_name: item[:operationName], variables: ensure_hash(item[:variables]), - context: { - current_resource: @resource, - controller: self, - resource_class: resource_class - } + context: { controller: self } } end diff --git a/app/graphql/graphql_devise/resolvers/confirm_account.rb b/app/graphql/graphql_devise/resolvers/confirm_account.rb index bae60f42..1fcc00ec 100644 --- a/app/graphql/graphql_devise/resolvers/confirm_account.rb +++ b/app/graphql/graphql_devise/resolvers/confirm_account.rb @@ -30,12 +30,6 @@ def resolve(confirmation_token:, redirect_url:) raise_user_error(I18n.t('graphql_devise.confirmations.invalid_token')) end end - - private - - def resource_name - resource_class.to_s.underscore.tr('/', '_') - end end end end diff --git a/lib/graphql_devise/concerns/controller_methods.rb b/lib/graphql_devise/concerns/controller_methods.rb index ef6bdd58..5610cf49 100644 --- a/lib/graphql_devise/concerns/controller_methods.rb +++ b/lib/graphql_devise/concerns/controller_methods.rb @@ -31,8 +31,12 @@ def controller context[:controller] end + def resource_name + self.class.instance_variable_get(:@resource_name) + end + def resource_class - context[:resource_class] + controller.send(:resource_class, resource_name) end def recoverable_enabled? @@ -44,7 +48,7 @@ def confirmable_enabled? end def current_resource - context[:current_resource] + @current_resource ||= controller.send(:set_user_by_token, resource_name) end def client diff --git a/lib/graphql_devise/rails/routes.rb b/lib/graphql_devise/rails/routes.rb index 36e8fb36..8783061e 100644 --- a/lib/graphql_devise/rails/routes.rb +++ b/lib/graphql_devise/rails/routes.rb @@ -4,7 +4,7 @@ def mount_graphql_devise_for(resource, opts = {}) custom_operations = opts[:operations] || {} path = opts.fetch(:at, '/') - mapping_name = resource.underscore.tr('/', '_') + mapping_name = resource.underscore.tr('/', '_').to_sym devise_for( resource.pluralize.underscore.tr('/', '_').to_sym, @@ -34,6 +34,7 @@ def mount_graphql_devise_for(resource, opts = {}) new_mutation end + used_mutation.instance_variable_set(:@resource_name, mapping_name) GraphqlDevise::Types::MutationType.field("#{mapping_name}_#{action}", mutation: used_mutation) end @@ -53,13 +54,14 @@ def mount_graphql_devise_for(resource, opts = {}) new_query end + used_query.instance_variable_set(:@resource_name, mapping_name) GraphqlDevise::Types::QueryType.field("#{mapping_name}_#{action}", resolver: used_query) end Devise.mailer.helper(GraphqlDevise::MailerHelper) - devise_scope mapping_name.to_sym do + devise_scope mapping_name do post "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth' get "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth' end diff --git a/spec/requests/mutations/logout_spec.rb b/spec/requests/mutations/logout_spec.rb index a35fd395..f5a6045b 100644 --- a/spec/requests/mutations/logout_spec.rb +++ b/spec/requests/mutations/logout_spec.rb @@ -39,4 +39,27 @@ ) end end + + context 'when using the admin model' do + let(:query) do + <<-GRAPHQL + mutation { + adminLogout { + authenticable { email } + } + } + GRAPHQL + end + let(:admin) { create(:admin, :confirmed) } + let(:headers) { admin.create_new_auth_token } + + it 'logs out the admin' do + expect(response).not_to include_auth_headers + expect(admin.reload.tokens.keys).to be_empty + expect(json_response[:data][:adminLogout]).to match( + authenticable: { email: admin.email } + ) + expect(json_response[:errors]).to be_nil + end + end end From 8334eb25015fee5ae3906b59423107e746849d34 Mon Sep 17 00:00:00 2001 From: Mario Celi Date: Sun, 22 Sep 2019 22:04:54 -0500 Subject: [PATCH 2/2] Use full path to mount resource route --- lib/graphql_devise/rails/routes.rb | 6 +++--- spec/dummy/config/routes.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/graphql_devise/rails/routes.rb b/lib/graphql_devise/rails/routes.rb index 8783061e..928e576b 100644 --- a/lib/graphql_devise/rails/routes.rb +++ b/lib/graphql_devise/rails/routes.rb @@ -3,7 +3,7 @@ class Mapper def mount_graphql_devise_for(resource, opts = {}) custom_operations = opts[:operations] || {} - path = opts.fetch(:at, '/') + path = opts.fetch(:at, '/graphql_auth') mapping_name = resource.underscore.tr('/', '_').to_sym devise_for( @@ -62,8 +62,8 @@ def mount_graphql_devise_for(resource, opts = {}) Devise.mailer.helper(GraphqlDevise::MailerHelper) devise_scope mapping_name do - post "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth' - get "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth' + post path, to: 'graphql_devise/graphql#auth' + get path, to: 'graphql_devise/graphql#auth' end end end diff --git a/spec/dummy/config/routes.rb b/spec/dummy/config/routes.rb index db3cae0a..785043bc 100644 --- a/spec/dummy/config/routes.rb +++ b/spec/dummy/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - mount_graphql_devise_for 'User', at: 'api/v1', operations: { + mount_graphql_devise_for 'User', at: '/api/v1/graphql_auth', operations: { login: Mutations::Login, sign_up: Mutations::SignUp } @@ -7,7 +7,7 @@ mount_graphql_devise_for( 'Admin', authenticable_type: Types::CustomAdminType, - at: 'api/v1/admin' + at: '/api/v1/admin/graphql_auth' ) post '/api/v1/graphql', to: 'api/v1/graphql#graphql'