Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
source "https://rubygems.org"
source 'https://rubygems.org'

gemspec

Expand Down
4 changes: 4 additions & 0 deletions app/controllers/graphql_devise/application_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module GraphqlDevise
class ApplicationController < DeviseTokenAuth::ApplicationController
end
end
51 changes: 51 additions & 0 deletions app/controllers/graphql_devise/graphql_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
require_dependency 'graphql_devise/application_controller'

module GraphqlDevise
class GraphqlController < ApplicationController
def auth
result = if params[:_json]
GraphqlDevise::Schema.multiplex(
params[:_json].map do |param|
{ query: param[:query] }.merge(execute_params(param))
end
)
else
GraphqlDevise::Schema.execute(params[:query], execute_params(params))
end

render json: result
end

private

def execute_params(item, user = current_user)
{
operation_name: item[:operationName],
variables: ensure_hash(item[:variables]),
context: {
current_user: user,
request: request,
response: response,
resource_class: resource_class
}
}
end

def ensure_hash(ambiguous_param)
case ambiguous_param
when String
if ambiguous_param.present?
ensure_hash(JSON.parse(ambiguous_param))
else
{}
end
when Hash, ActionController::Parameters
ambiguous_param
when nil
{}
else
raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
end
end
end
end
34 changes: 34 additions & 0 deletions app/graphql/graphql_devise/mutations/login.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module GraphqlDevise
module Mutations
class Login < GraphQL::Schema::Mutation
argument :email, String, required: true
argument :password, String, required: true

field :authenticable, GraphqlDevise::Types::AuthenticableType, null: true

def resolve(email:, password:)
resource = context[:resource_class].find_by(email: email)

if resource && (!resource.respond_to?(:active_for_authentication?) || resource.active_for_authentication?)
valid_password = resource.valid_password?(password)
if (resource.respond_to?(:valid_for_authentication?) && !resource.valid_for_authentication? { valid_password }) || !valid_password
return {}
end

auth_headers = resource.create_new_auth_token
context[:response].headers.merge!(auth_headers)

{ authenticable: resource }
elsif resource && !(!resource.respond_to?(:active_for_authentication?) || resource.active_for_authentication?)
if resource.respond_to?(:locked_at) && resource.locked_at
return {}
else
return {}
end
else
return {}
end
end
end
end
end
6 changes: 6 additions & 0 deletions app/graphql/graphql_devise/schema.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module GraphqlDevise
class Schema < GraphQL::Schema
mutation(GraphqlDevise::Types::MutationType)
query(GraphqlDevise::Types::QueryType)
end
end
7 changes: 7 additions & 0 deletions app/graphql/graphql_devise/types/authenticable_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module GraphqlDevise
module Types
class AuthenticableType < GraphQL::Schema::Object
field :email, String, null: false
end
end
end
7 changes: 7 additions & 0 deletions app/graphql/graphql_devise/types/mutation_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module GraphqlDevise
module Types
class MutationType < GraphQL::Schema::Object
field :login, mutation: GraphqlDevise::Mutations::Login
end
end
end
6 changes: 6 additions & 0 deletions app/graphql/graphql_devise/types/query_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module GraphqlDevise
module Types
class QueryType < GraphQL::Schema::Object
end
end
end
4 changes: 4 additions & 0 deletions app/helpers/graphql_devise/application_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module GraphqlDevise
module ApplicationHelper
end
end
4 changes: 4 additions & 0 deletions app/jobs/graphql_devise/application_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module GraphqlDevise
class ApplicationJob < ActiveJob::Base
end
end
6 changes: 6 additions & 0 deletions app/mailers/graphql_devise/application_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module GraphqlDevise
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end
end
Empty file added app/views/.keep
Empty file.
14 changes: 14 additions & 0 deletions bin/rails
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails gems
# installed from the root of your application.

ENGINE_ROOT = File.expand_path('..', __dir__)
ENGINE_PATH = File.expand_path('../lib/graphql_devise/engine', __dir__)
APP_PATH = File.expand_path('../test/dummy/config/application', __dir__)

# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])

require 'rails/all'
require 'rails/engine/commands'
4 changes: 3 additions & 1 deletion graphql_devise.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ Gem::Specification.new do |spec|
spec.bindir = 'exe'
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ['lib']
spec.test_files = Dir["spec/**/*"]
spec.test_files = Dir['spec/**/*']

spec.add_dependency 'devise_token_auth'
spec.add_dependency 'graphql'
spec.add_dependency 'rails', '~> 5.0'

spec.add_development_dependency 'bundler', '~> 2.0'
spec.add_development_dependency 'rake', '~> 10.0'
Expand Down
4 changes: 3 additions & 1 deletion lib/graphql_devise.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
require 'rails'
require 'graphql_devise/engine'
require 'devise_token_auth'
require 'graphql'
require 'graphql_devise/version'
require 'graphql_devise/concerns/models/testable'

module GraphqlDevise
class Error < StandardError; end
Expand Down
12 changes: 0 additions & 12 deletions lib/graphql_devise/concerns/models/testable.rb

This file was deleted.

7 changes: 7 additions & 0 deletions lib/graphql_devise/engine.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require 'graphql_devise/rails/routes'

module GraphqlDevise
class Engine < ::Rails::Engine
isolate_namespace GraphqlDevise
end
end
29 changes: 29 additions & 0 deletions lib/graphql_devise/rails/routes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal: true

module ActionDispatch::Routing
class Mapper
def mount_graphql_devise_for(resource, opts = {})
mount_devise_token_auth_for(
resource,
{
skip: [
:sessions,
:registrations,
:passwords,
:confirmations,
:token_validations,
:omniauth_callbacks,
:unlocks
]
}.merge(opts)
)

path = opts.fetch(:at, '/')
mapping_name = resource.underscore.gsub('/', '_')

devise_scope mapping_name.to_sym do
post "#{path}/graphql_auth", to: 'graphql_devise/graphql#auth'
end
end
end
end
10 changes: 9 additions & 1 deletion spec/dummy/app/models/user.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
class User < ApplicationRecord
include GraphqlDevise::Concerns::Models::Testable
devise :database_authenticatable,
:registerable,
:recoverable,
:rememberable,
:trackable,
:validatable,
:confirmable

include DeviseTokenAuth::Concerns::User
end
16 changes: 8 additions & 8 deletions spec/dummy/config/application.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
require_relative 'boot'

require "rails"
require 'rails'
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require 'active_model/railtie'
require 'active_job/railtie'
require 'active_record/railtie'
# require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require 'action_controller/railtie'
require 'action_mailer/railtie'
require 'action_view/railtie'
# require "action_cable/engine"
# require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
require "graphql_devise"
require 'graphql_devise'

module Dummy
class Application < Rails::Application
Expand Down
Loading