lib/zuora_connect/controllers/helpers.rb



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


      def authenticate_connect_app_request
        if ZuoraConnect.configuration.mode == "Production"
          instance_id = process_encrypted_response
          if session["appInstance"]
            if ZuoraConnect::AppInstance.where(:id => instance_id).size == 0
              Apartment::Tenant.switch!("public")
              Apartment::Tenant.create(instance_id)
              ZuoraConnect::AppInstance.create!(:id => instance_id )
            end
            @appinstance = ZuoraConnect::AppInstance.find(instance_id)
            begin
              @appinstance.new_session(session["#{instance_id}::user"], session["#{instance_id}::key"], session)
            rescue
              redirect_to "/500.html"
            end
          else
            redirect_to "/500.html"
          end
        else
          dev_mode
          instance_id = session["appInstance"].to_i
          if session["appInstance"]
            if ZuoraConnect::AppInstance.where(:id => instance_id).size == 0
              Apartment::Tenant.switch!("public")
              Apartment::Tenant.create(instance_id)
              ZuoraConnect::AppInstance.create!(:id => instance_id )
            end
            @appinstance = ZuoraConnect::AppInstance.find(instance_id)
          else
            redirect_to "/500.html"
          end
          @appinstance.options = ZuoraConnect.configuration.dev_mode_options
          @appinstance.logins = ZuoraConnect.configuration.dev_mode_logins

          logins = ZuoraConnect.configuration.dev_mode_logins
          logins.each do |k,v|
            tmp = ZuoraConnect::Login.new(v)
            tmp.client.current_session = session["#{self.id}::#{k}:session"] if !session.nil? && v["tenant_type"] == "Zuora" && session["#{self.id}::#{k}:session"]
            @appinstance.logins[k] = tmp
            @appinstance.attr_builder(k, tmp)
          end
          @appinstance.mode = ZuoraConnect.configuration.dev_mode_mode
        end
      end

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

      def check_connect_admin
        redirect_to "/500.html" if !session["#{@appinstance.id}::admin"]
      end

    private
      def process_encrypted_response
        session["valid"] |= false
        if request["data"]
          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"]}::user"] = values["user"]
          session["#{values["appInstance"]}::key"] = values["key"]
          session["#{values["appInstance"]}::valid"] = false
          session["appInstance"] = values["appInstance"]
          session["#{values["appInstance"]}::admin"] = values["admin"] ? values["admin"] : false
        end
        return session["appInstance"]
      end

      def dev_mode
        session["appInstance"] = "1"
        session["1::user"] = "test"
        session["1::key"] = "test"
        session["1::valid"] = true
      end

    end
  end
end