class ZuoraConnect::AppInstanceBase
def self.decrypt_response(resp)
def self.decrypt_response(resp) OpenSSL::PKey::RSA.new(ZuoraConnect.configuration.private_key).private_decrypt(resp) end
def attr_builder(field,val)
def attr_builder(field,val) singleton_class.class_eval { attr_accessor "#{field}" } send("#{field}=", val) end
def build_task(task_data, session)
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) if !session.nil? && v["tenant_type"] == "Zuora" if tmp.entities.size > 0 tmp.entities.each do |value| entity_id = value["id"] tmp.client(entity_id).current_session = session["#{self.id}::#{k}::#{entity_id}:session"] if !session.nil? && v["tenant_type"] == "Zuora" && session["#{self.id}::#{k}::#{entity_id}:session"] end else tmp.client.current_session = session["#{self.id}::#{k}:session"] if !session.nil? && v["tenant_type"] == "Zuora" && session["#{self.id}::#{k}:session"] end end @logins[k] = tmp self.attr_builder(k, @logins[k]) elsif k == "options" v.each do |opt| @options[opt["config_name"]] = opt end elsif k == "user_settings" self.timezone = v["timezone"] self.locale = v["local"] end end end
def get_s3_file_url(key)
def get_s3_file_url(key) signer = Aws::S3::Presigner.new(client: @s3_client) url = signer.presigned_url(:get_object, bucket: ZuoraConnect.configuration.s3_bucket_name, key: "#{ZuoraConnect.configuration.s3_folder_name}/#{key}") end
def init
def init @options = Hash.new @logins = Hash.new if ZuoraConnect.configuration.use_s3 if ZuoraConnect.configuration.mode == "Development" @s3_client = Aws::S3::Resource.new(region: ZuoraConnect.configuration.aws_region,access_key_id: ZuoraConnect.configuration.dev_mode_access_key_id,secret_access_key: ZuoraConnect.configuration.dev_mode_secret_access_key) else @s3_client = Aws::S3::Resource.new(region: ZuoraConnect.configuration.aws_region) end end @valid = false self.attr_builder("timezone", ZuoraConnect.configuration.default_time_zone) self.attr_builder("locale", ZuoraConnect.configuration.default_locale) Apartment::Tenant.switch!(self.id) if( ActiveRecord::Migration.check_pending! != nil) Apartment::Migrator.migrate(self.id) end Thread.current[:appinstance] = self end
def new_session(session: {}, username: self.access_token, password: self.refresh_token)
def new_session(session: {}, username: self.access_token, password: self.refresh_token) @api_version = (username.include?("@") ? "v1" : "v2") @username = username @password = password @last_refresh = session["#{self.id}::last_refresh"] ## DEV MODE TASK DATA MOCKUP if ZuoraConnect.configuration.mode != "Production" self.options = ZuoraConnect.configuration.dev_mode_options ZuoraConnect.configuration.dev_mode_logins.each do |k,v| tmp = ZuoraConnect::Login.new(v) self.logins[k] = tmp self.attr_builder(k, tmp) end self.mode = ZuoraConnect.configuration.dev_mode_mode else 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("[#{self.id}] REFRESHING - Session Nil") if session.nil? Rails.logger.debug("[#{self.id}] REFRESHING - AppInstance ID(#{self.id}) does not match session id(#{session["appInstance"].to_i})") if (!session.nil? && self.id != session["appInstance"].to_i) Rails.logger.debug("[#{self.id}] REFRESHING - Task Data Blank") if session["#{self.id}::task_data"].blank? Rails.logger.debug("[#{self.id}] REFRESHING - No Time on Cookie") if session["#{self.id}::last_refresh"].blank? Rails.logger.debug("[#{self.id}] REFRESHING - Session Old") if (session["#{self.id}::last_refresh"].blank? || session["#{self.id}::last_refresh"].to_i < ZuoraConnect.configuration.timeout.ago.to_i ) self.refresh(session) else Rails.logger.debug("[#{self.id}] REBUILDING") build_task(session["#{self.id}::task_data"], session) end end I18n.locale = self.locale Time.zone = self.timezone @valid = true end
def oauth_expired?
def oauth_expired? (expires_at < Time.now) end
def refresh(session = nil)
def refresh(session = nil) count ||= 0 if self.api_version == "v1" response = HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json",:basic_auth => auth = {:username => self.username, :password => self.password}) else response = HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json",:body => {:access_token => self.access_token}) end if response.code == 200 @last_refresh = Time.now.to_i build_task(JSON.parse(response.body), session) else raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error Communicating with Connect", response.body, response.code) end rescue if self.api_version == "v2" && count < 2 && response.code == 401 self.refresh_oauth count += 1 retry else raise end end
def refresh_oauth
def refresh_oauth Rails.logger.debug("[#{self.id}] REFRESHING - OAuth") params = { :grant_type => "refresh_token", :redirect_uri => ZuoraConnect.configuration.oauth_client_redirect_uri, :refresh_token => self.refresh_token } response = HTTParty.post("#{ZuoraConnect.configuration.url}/oauth/token",:body => params) response_body = JSON.parse(response.body) if response.code == 200 self.refresh_token = response_body["refresh_token"] self.access_token = response_body["access_token"] self.oauth_expires_at = Time.at(response_body["created_at"].to_i) + response_body["expires_in"].seconds self.save else raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error Refreshing Access Token", response.body, response.code) end end
def save_data(session = Hash.new)
def save_data(session = Hash.new) self.logins.each do |key, login| if login.tenant_type == "Zuora" if login.available_entities.size > 1 && Rails.application.config.session_store != ActionDispatch::Session::CookieStore login.available_entities.each do |entity_key| session["#{self.id}::#{key}::#{entity_key}:session"] = login.client(entity_key).current_session end else session["#{self.id}::#{key}:session"] = login.client.current_session end end end session["#{self.id}::task_data"] = self.task_data session["#{self.id}::last_refresh"] = self.last_refresh session["appInstance"] = self.id return session end
def send_email
def send_email end
def updateOption(optionId, value)
def updateOption(optionId, value) if self.access_token && self.refresh_token if self.api_version == "v1" return HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/application_options/#{optionId}/edit?value=#{value}",:basic_auth => auth = {:username => self.username, :password => self.password}) else return HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/application_options/#{optionId}/edit?value=#{value}",:body => {:access_token => self.username}) end else return false end end
def upload_to_s3(local_file,s3_path = nil)
def upload_to_s3(local_file,s3_path = nil) s3_path = local_file.split("/").last if s3_path.nil? obj = @s3_client.bucket(ZuoraConnect.configuration.s3_bucket_name).object("#{ZuoraConnect.configuration.s3_folder_name}/#{self.id.to_s}/#{s3_path}}") obj.upload_file(local_file) end