3scale/porta

View on GitHub
app/lib/authentication/strategy/provider_oauth2.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Authentication
  module Strategy
    class ProviderOAuth2 < Authentication::Strategy::OAuth2Base

      class FindOrCreateUser < Procedure

        def call
          (active_user(find_user) || create_user(session)).tap do |user|
            strategy.user_used_sso_authorization(user, ThreeScale::OAuth2::UserData.new(uid: uid)) if user
          end
        end

        private

        def find_user
          result = Users::FindOAuth2UserService.run(user_data, authentication_provider, users)
          strategy.error_message = result.error_message
          result.user
        end

        def active_user(user)
          return unless user
          return user if user.active?

          user if user.activate_email(user_data.verified_email)
        end

        def create_user(session)
          user = users.build(user_data.to_hash)
          user.signup_type = :created_by_provider

          strategy.on_new_user(user, session)

          if strategy.instance_variable_set(:@new_user_created, user.save)
            # FIXME: this should be handled by some of the on_* callbacks
            unless user.activate_email(user_data.verified_email)
              ProviderUserMailer.activation(user).deliver_later
              ActivationReminderWorker.enqueue(user)
            end
          end

          user
        end

        def session
          @session ||= params.fetch(:request).session
        end

        def site_account
          @site_account ||= users.proxy_association.owner
        end
      end

      self.authenticate_procedure = FindOrCreateUser


      protected

      def authentication_providers
        site_account.self_authentication_providers
      end
    end
  end
end