lib/zuora_connect/controllers/helpers.rb



require 'apartment/migrator'
module ZuoraConnect
  module Controllers
    module Helpers
      extend ActiveSupport::Concern

      def instance_data_lookup(id = nil, user = nil)
        return session.blank? ? {} : session
      end

      def authenticate_app_api_request
        authenticate_or_request_with_http_basic do |username, password|
          @appinstance = ZuoraConnect::AppInstance.find(params[:instance_id])
          @appinstance.new_session(:session => {}, :username => username, :password => password)
          return @appinstance.valid
        end
      end

      def authenticate_connect_app_request
        if ZuoraConnect.configuration.mode == "Production"
          if request["data"]
            setup_instance_via_data
          else
            setup_instance_via_session
          end
          @appinstance.new_session(:session =>instance_data_lookup(@appinstance.id, @appinstance.access_token))
          I18n.locale = session["#{@appinstance.id}::user::locale"] ?  session["#{@appinstance.id}::user::locale"] : ZuoraConnect.configuration.default_locale
          Time.zone = session["#{@appinstance.id}::user::timezone"] ? session["#{@appinstance.id}::user::timezone"] : ZuoraConnect.configuration.default_time_zone
        else
          setup_instance_via_dev_mode
          I18n.locale = session["#{@appinstance.id}::user::locale"] ?  session["#{@appinstance.id}::user::locale"] : ZuoraConnect.configuration.default_locale
          Time.zone = session["#{@appinstance.id}::user::timezone"] ? session["#{@appinstance.id}::user::timezone"] : ZuoraConnect.configuration.default_time_zone
        end
        Thread.current[:appinstance] = @appinstance
      end

      def persist_connect_app_session
        session.merge!(@appinstance.save_data)
      end

      def check_connect_admin!
        raise ZuoraConnect::Exceptions::AccessDenied.new("User is not an authorized admin for this application") if !session["#{@appinstance.id}::admin"]
      end

      def check_connect_admin
        return session["#{@appinstance.id}::admin"]
      end

    private
      def setup_instance_via_data
        session["valid"] |= false
        reset_session
        values = JSON.parse(ZuoraConnect::AppInstance.decrypt_response(Base64.urlsafe_decode64(request["data"])))
        if values["param_data"]
          values["param_data"].each do |k ,v|
            params[k] = v
          end
        end
        session["#{values["appInstance"]}::destroy"] = values["destroy"]
        session["#{values["appInstance"]}::valid"] = false
        session["appInstance"] = values["appInstance"]
        if values["current_user"]
          session["#{values["appInstance"]}::admin"] = values["current_user"]["admin"] ? values["current_user"]["admin"] : false
          session["#{values["appInstance"]}::user::timezone"] = values["current_user"]["timezone"]
          session["#{values["appInstance"]}::user::locale"] = values["current_user"]["locale"]
          session["#{values["appInstance"]}::user::email"] = values["current_user"]["email"]
        end

        @appinstance = ZuoraConnect::AppInstance.where(:id => values["appInstance"].to_i).first
        if @appinstance.blank?
          Apartment::Tenant.switch!("public")
          Apartment::Tenant.create(values["appInstance"].to_i)
          @appinstance = ZuoraConnect::AppInstance.create!(:id => values["appInstance"].to_i, :access_token => values["user"], :refresh_token => values["key"])
        end
        if @appinstance.access_token.blank? || @appinstance.refresh_token.blank?
          @appinstance.update_attributes(:access_token =>  values["user"], :refresh_token =>  values["key"])
        end
      end

      def setup_instance_via_session
        if !session["appInstance"].blank?
          @appinstance = ZuoraConnect::AppInstance.where(:id => session["appInstance"]).first
        else
          raise ZuoraConnect::Exceptions::SessionInvalid.new("Session Blank -- Relaunch Application")
        end
      end

      def setup_instance_via_dev_mode
        session["appInstance"] = "1"
        session["valid"] = true
        values = {:user => "test" , :key => "test"}
        @appinstance = ZuoraConnect::AppInstance.where(:id => values["appInstance"].to_i).first
        if @appinstance.blank?
          Apartment::Tenant.switch!("public")
          Apartment::Tenant.create(values["appInstance"].to_i)
          @appinstance = ZuoraConnect::AppInstance.create!(:id => values["appInstance"].to_i, :access_token => "test", :refresh_token => "test")
        end
        if @appinstance.access_token.blank? || @appinstance.refresh_token.blank?
          @appinstance.update_attributes(:access_token =>  values["user"], :refresh_token =>  values["key"])
        end
      end

    end
  end
end