o2web/graphql-auth

View on GitHub
app/graphql/mutations/auth/sign_in.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

class Mutations::Auth::SignIn < GraphQL::Schema::Mutation
  include ::Graphql::AccountLockHelper
  include ::Graphql::TokenHelper

  argument :email, String, required: true do
    description "The user's email"
  end

  argument :password, String, required: true do
    description "The user's password"
  end

  argument :remember_me, Boolean, required: false do
    description "User's checkbox to be remembered after connection timeout"
  end

  field :errors, [::Types::Auth::Error], null: false
  field :success, Boolean, null: false
  field :user, GraphQL::Auth.configuration.user_type.constantize, null: true

  def resolve(email:, password:, remember_me:)
    response = context[:response]

    if lockable?
      user = User.where(locked_at: nil).find_by email: email
    else
      user = User.find_by email: email
    end

    valid_sign_in = user.present? && user.valid_password?(password)

    if valid_sign_in
      generate_access_token(user, response)
      set_current_user(user)
      remember_me ? set_refresh_token(user, response) : delete_refresh_token(user)

      {
        errors: [],
        success: true,
        user: user
      }
    else
      {
        errors: [
          {
            field: :_error,
            message: I18n.t('devise.failure.invalid',
                            authentication_keys: I18n.t('activerecord.attributes.user.email'))
          }
        ],
        success: false,
        user: nil
      }
    end
  end
end