tryzealot/zealot

View on GitHub
app/controllers/users/omniauth_callbacks_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  User.oauth_providers.each do |provider_name|
    define_method(provider_name) do
      omniauth_callback(provider_name)
    end
  end

  def passthru
    # User had been logged in, redirect to root page
    redirect_to root_path(signin: 'true')
  end

  private

  def omniauth_callback(name)
    auth = request.env['omniauth.auth']
    provider = UserProvider.find_by(name: auth.provider, uid: auth.uid)

    # Existed provider?
    if provider
      provider.update_omniauth(auth.credentials)

      flash[:notice] = t('devise.omniauth_callbacks.success', kind: name)
      return sign_in_and_redirect provider.user
    end

    if user_signed_in?
      connect_user_to_provider(name, auth)
    else
      store_new_user(name, auth)
    end
  end

  def connect_user_to_provider(name, auth)
    current_user.providers.from_omniauth(auth)

    bypass_sign_in(current_user)
    redirect_to goback_path, notice: t('devise.omniauth_callbacks.success', kind: name)
  end

  def store_new_user(name, auth)
    user = User.from_omniauth(auth)
    flash[:notice] = t('devise.registrations.signed_up')
    sign_in_and_redirect user
  end

  def goback_path
    omni_params = request.env['omniauth.params']
    redirect_path = omni_params['back'].presence ||
                    request.env['HTTP_REFERER'] ||
                    root_path
  end
end