From 6d395a27d005f953e9b5f5840324e57b0508a797 Mon Sep 17 00:00:00 2001 From: Olga Ivanova Date: Wed, 3 Jul 2019 14:36:06 +0200 Subject: [PATCH] Review --- sms_services/base.rb | 133 ------------------------------------------ sms_services/kcell.rb | 48 --------------- soap_services/base.rb | 102 -------------------------------- soap_services/pkb.rb | 129 ---------------------------------------- 4 files changed, 412 deletions(-) delete mode 100644 sms_services/base.rb delete mode 100644 sms_services/kcell.rb delete mode 100644 soap_services/base.rb delete mode 100644 soap_services/pkb.rb diff --git a/sms_services/base.rb b/sms_services/base.rb deleted file mode 100644 index aa81d15..0000000 --- a/sms_services/base.rb +++ /dev/null @@ -1,133 +0,0 @@ -module Services::Sms - class Base - SMS_PROVIDERS = [ - KCELL = "Kcell" - ] - - SETTINGS = [ - FALLBACK_PROVIDER_SETTING = "sms_service.fallback_provider", - DEFAULT_PROVIDER_SETTING = "sms_service.default_provider", - ] - - def self.phone_normalization_klass - PhoneNumberString - end - - # Services::Sms::Base.prepare("+371 20128732", "hello world", "gsm") - def self.prepare(phone, message, custom_provider=nil) - provider_to_use = custom_provider.presence || - PREFERRED_SENDER_FOR[PhoneNumber::CarrierDetective.call(phone: phone)].call - - Rails.logger.info( - "--> Services::Sms::Base.prepare(#{ phone }, #{ message }, #{ custom_provider }) "\ - "got '#{ provider_to_use }' provider" - ) - - provider_klass_for(provider_to_use).new(phone, message) - end - - attr_accessor :phone, :message, :error_code - - def initialize(phone, message) - self.phone = self.class.phone_normalization_klass.new(phone) - self.message = message - end - - def perform_send! - if ready_to_send? - response = send_request!(prepare_params) - self.error_code = parse_response(response) - - error_code.nil? ? success_response : failed_response - else - self.error_code = -99 - end - - error_code.nil? - end - - def get_error - return if error_code.blank? - - if errors_list.has_key?(error_code) - return I18n.t(errors_list[error_code], scope: "sms.errors") - end - - I18n.t( - "Unidentified error: %{code}", - default: "Unidentified error: %{code}", scope: "sms.errors", - code: error_code - ) - end - - def ready_to_send? - phone.present? - end - - protected - - def self.default_provider - Releaf::Settings[DEFAULT_PROVIDER_SETTING] - end - - def self.fallback_enabled? - Releaf::Settings[FALLBACK_PROVIDER_SETTING].present? - end - - def self.fallback_provider - provider_klass_for(Releaf::Settings[FALLBACK_PROVIDER_SETTING]) - end - - def self.provider_klass_for(provider_name) - "Services::Sms::#{ provider_name.camelcase }".constantize - end - - #== Instance privates == - - def send_request!(params) - uri = URI(url) - uri.query = URI.encode_www_form(params) - Net::HTTP.get_response(uri) - end - - def prepare_params - raise NotImplementedError, "#prepare_params not implemented" - end - - def url - config.fetch("uri") - end - - def parse_response(response) - raise NotImplementedError, "#parse_response not implemented" - end - - def errors_list - {-99 => "Invalid phone number"} # Custom error code - end - - def provider - self.class.name.demodulize - end - - def config - CONFIG.dig("sms", provider.snakecase) - end - - def send_through_fallback_service!(error=nil, switch_to_fallback=true) - switch_default_provider! if switch_to_fallback - - fallback_provider = self.class.fallback_provider.new(phone, message) - fallback_provider.perform_send! - end - - def switch_default_provider! - return unless self.class.fallback_enabled? - - Releaf::Settings[DEFAULT_PROVIDER_SETTING] = Releaf::Settings[FALLBACK_PROVIDER_SETTING] - end - - def success_response; end - def failed_response; end - end -end diff --git a/sms_services/kcell.rb b/sms_services/kcell.rb deleted file mode 100644 index c41634e..0000000 --- a/sms_services/kcell.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Services::Sms - class Kcell < Base - - def send_request!(params) - uri = URI(url) - - http = Net::HTTP.new(uri.host) - request = Net::HTTP::Post.new(uri.request_uri, headers) - request.basic_auth(config["username"], config["password"]) - request.body = params.to_json - http.request(request) - end - - - def self.phone_normalization_klass - PhoneNumbers::Kcell - end - - protected - - def url - "#{ super }/messages" - end - - def parse_response(response) - return if !response.body - end - - def prepare_params - { - "client_message_id": current_uid, - "sender": config["from"], - "recipient": phone, - "message_text": message, - "time_bounds": config["time_bounds"] - } - end - - private - def current_uid - Time.now.to_f - end - - def headers - { 'Content-Type' => 'application/json' } - end - end -end diff --git a/soap_services/base.rb b/soap_services/base.rb deleted file mode 100644 index bfe1e68..0000000 --- a/soap_services/base.rb +++ /dev/null @@ -1,102 +0,0 @@ -module Services - module SoapAdapters - module Base - attr_accessor :response, :error - - REQUEST_FAILURE = :request_failed - RESOURCE_NOT_FOUND = :resource_not_found - - def success? - request_succeeded? && resource_found? - end - - private - - def response_data(*path) - return unless response.respond_to?(:to_hash) - - path.inject(response.to_hash) { |result, part| result.try(:[], part) } - end - - def request_succeeded? - response && response.success? - end - - def perform_request(timeout_count=15) - begin - Timeout.timeout(timeout_count) do - call_soap - try_to_parse_response - yield if block_given? && success? - end - rescue => e - @response = nil - Rails.logger.error("SOAP request failed: #{ e }") - end - - set_errors - end - - def call_soap - @response = soap_client.call(soap_action, savon_action_options) - end - - def savon_action_options - {message: soap_message}.merge(custom_savon_action_options) - end - - def custom_savon_action_options - {} - end - - def try_to_parse_response - response.try(:to_hash) - end - - def set_errors - @error = REQUEST_FAILURE unless request_succeeded? - @error ||= RESOURCE_NOT_FOUND unless resource_found? - end - - def soap_client - @soap_client ||= Savon.client(savon_client_options) - end - - def savon_client_options - { - wsdl: config(:service_uri), - adapter: :net_http, - log: false, - }.merge(custom_savon_client_options) - end - - def custom_savon_client_options - {} - end - - def mapped_keys_for(collection) - if collection.is_a?(Array) - collection.map do |collection_item| - map_keys(collection_item) - end - else - map_keys(collection) - end - end - - def map_keys(collection) - collection.inject({}) do |result, (key, value)| - new_key = key_map[key] - result[new_key] = value if new_key - result - end - end - - def xlsx_to_zip(spreadsheet, file_name) - temp_zip = FileZipping.zip_file(spreadsheet, file_name) - @debtors_list.update_attributes(file: temp_zip, file_name: "creditinfo_debtors_#{ Date.today.strftime("%Y-%m-%d") }", file_created_at: Time.now) - temp_zip.unlink - end - end - end -end diff --git a/soap_services/pkb.rb b/soap_services/pkb.rb deleted file mode 100644 index 769dbe4..0000000 --- a/soap_services/pkb.rb +++ /dev/null @@ -1,129 +0,0 @@ -module Services - module SoapAdapters - class Pkb - include Services::SoapAdapters::Base - - attr_reader :data - attr_reader :iin, :id_number_type, :culture - - FULL_REPORT_TYPE = 6 - STANDART_REPORT_TYPE = 4 - HAVE_NOT_FULL_REPORT_FOR_THIS_CLIENT_ERROR = 'Не существует запрашиваемого отчета для данного субъекта' - - def initialize(iin, id_number_type, culture='ru-Ru', key_map={}) - @iin = iin - @id_number_type = id_number_type - @culture = culture - @report_import_code = FULL_REPORT_TYPE - - self - end - - def fetch - fetch_report - - if error_message?(HAVE_NOT_FULL_REPORT_FOR_THIS_CLIENT_ERROR) - @report_import_code = STANDART_REPORT_TYPE - fetch_report - end - - self - end - - private - - attr_accessor :report_import_code - - def fetch_report - perform_request do - fetch_general_information - end - end - - def soap_action - :get_report - end - - def savon_client_options - { - wsdl: config(:service_uri), - adapter: :net_http, - env_namespace: :x, - namespace_identifier: :ws, - ssl_verify_mode: :none - } - end - - def soap_message - xml_body - end - - def custom_savon_action_options - { soap_header: xml_header } - end - - def xml_body - xml = Builder::XmlMarkup.new - xml.ws :reportId, 0 - xml.ws :doc do - xml.keyValue do - xml.reportImportCode report_import_code - xml.idNumber iin - xml.idNumberType id_number_type - xml.consentConfirmed 1 - end - end - end - - def xml_header - xml = Builder::XmlMarkup.new - xml.ws :CigWsHeader do - xml.ws :Culture, culture - xml.ws :UserName, config(:username) - xml.ws :Password, config(:password) - end - end - - def resource_found? - request_succeeded? && (raw_collection[:cig_result].present? || raw_collection[:cig_result_error].present?) - end - - def raw_collection - response_data(:get_report_response, :get_report_result) || {} - end - - def fetch_general_information - if report_exist? - @data = { - general_information: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :header) || {}, - existing_contracts: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :existing_contracts) || {}, - public_sources: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :public_sources) || {}, - identification_documents: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :identification_documents) || {}, - subject_details: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :subject_details) || {}, - classification_of_borrower: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :classification_of_borrower) || {}, - subjects_address: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :subjects_address) || {}, - negative_data: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :negative_data) || {}, - number_of_queries: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :number_of_queries) || {}, - summary_information: raw_collection.try(:[], :cig_result).try(:[], :result).try(:[], :root).try(:[], :summary_information) || {} - } - elsif raw_collection.any? && raw_collection.try(:[], :cig_result_error).present? - @data = { - error_message: raw_collection.try(:[], :cig_result_error).try(:[], :errmessage) || {} - } - end - end - - def report_exist? - raw_collection.any? && raw_collection.try(:[], :cig_result).present? rescue false - end - - def error_message?(message) - data[:error_message].eql?(message) rescue false - end - - def self.config_path - %w[services pkb] - end - end - end -end