module ZuoraConnect class AppInstance < ActiveRecord::Base after_initialize :init attr_accessor :user, :pass, :options, :mode, :logins, :valid, :task_data, :last_refresh def init @options = Hash.new @logins = Hash.new Apartment::Migrator.migrate(self.id) Apartment::Tenant.switch!(self.id) end def new_session(user, password, session = nil) @user = user @pass = password if session.nil? || (!session.nil? && self.id != session["appInstance"].to_i) || session["#{self.id}::task_data"].blank? || ( session["#{self.id}::last_refresh"].blank? || session["#{self.id}::last_refresh"].to_i < ZuoraConnect.configuration.timeout.ago.to_i ) Rails.logger.debug("REFRESHING") self.refresh(session) else Rails.logger.debug("REBUILDING") build_task(session["#{self.id}::task_data"], session) end @valid = true end def save_data(session = Hash.new) self.logins.each do |key, login| if login.tenant_type == "Zuora" session["#{self.id}::#{key}:session"] = login.client.current_session end end session["#{self.id}::task_data"] = self.task_data session["#{self.id}::last_refresh"] = self.last_refresh return session end def updateOption(optionId, value) if @user && @pass return HTTParty.get(ZuoraConnect.configuration.url + "/api/v1/tools/application_options/#{optionId}/edit?value=#{value}",:basic_auth => auth = {:username => user, :password => password}) else return false end end def refresh(session = nil) response = HTTParty.get(ZuoraConnect.configuration.url + "/api/v1/tools/tasks/#{self.id}.json",:basic_auth => auth = {:username => self.user, :password => self.pass}) if response.code == 200 @last_refresh = Time.now.to_i build_task(JSON.parse(response.body), session) else raise "Unauthorized" end end def build_task(task_data, session) @task_data = task_data @mode = @task_data["mode"] @task_data.each do |k,v| if k.match(/^(.*)_login$/) 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"] @logins[k] = tmp self.attr_builder(k, @logins[k]) elsif k == "options" v.each do |opt| @options[opt["config_name"]] = opt end end end end def send_email end def self.decrypt_response(resp) OpenSSL::PKey::RSA.new(ZuoraConnect.configuration.private_key).private_decrypt(resp) end def attr_builder(field,val) singleton_class.class_eval { attr_accessor "#{field}" } send("#{field}=", val) end end end