podemos-info/participa2

View on GitHub
decidim-module-census_connector/app/models/census/api/census_api.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require "faraday"

module Census
  module API
    module CensusAPI
      extend ActiveSupport::Concern

      class << self
        attr_accessor :service_status
      end

      included do
        delegate :get, :patch, :post, :delete, to: :connection
      end

      def initialize(user_request)
        @user_request = user_request
      end

      def api_url(path)
        "/api/v1/#{I18n.locale}/#{path}"
      end

      def send_request
        response = yield
        update_service_status true
        [response.status, response.body]
      rescue Faraday::Error::ConnectionFailed => e
        update_service_status false
        [500, e.message]
      end

      def process_response(request_result)
        status, body = request_result
        if [200, 201, 202, 204].include?(status)
          info = status == 204 ? {} : JSON.parse(body, symbolize_names: true)
          info = yield(info) if block_given?
          [:ok, info]
        elsif status == 422
          [:invalid, errors: JSON.parse(body, symbolize_names: true)]
        else
          Rails.logger.warn body
          [:error, {}]
        end
      end

      def if_valid(result)
        result[1] if result[0] == :ok
      end

      def service_status
        Census::API::CensusAPI.service_status
      end

      private

      attr_accessor :user_request

      def update_service_status(status)
        Census::API::CensusAPI.service_status = status
      end

      def connection
        Faraday.new(url: ::Decidim::CensusConnector.census_api_base_uri, proxy: proxy) do |conn|
          conn.request :multipart
          conn.request :url_encoded

          conn.response :logger, ::Logger.new(STDOUT), bodies: true if Decidim::CensusConnector.census_api_debug

          if user_request
            conn.headers[:user_agent] = user_request.user_agent
            conn.headers[:user_ip] = user_request.remote_ip
          end

          conn.adapter :em_http
        end
      end

      def proxy
        return if Decidim::CensusConnector.census_api_proxy_address.blank?

        "#{Decidim::CensusConnector.census_api_proxy_address}:#{Decidim::CensusConnector.census_api_proxy_port}"
      end
    end
  end
end