jetrockets/corelogic-ruby

View on GitHub
lib/corelogic/api/properties_repository.rb

Summary

Maintainability
A
1 hr
Test Coverage
require "corelogic/response_parser"
require "corelogic/collection"
require "corelogic/property"
require "corelogic/property/ownership"
require "corelogic/property/building"
require "corelogic/property/tax_assessment"
require "corelogic/property/site"
require "corelogic/property/location"
require "corelogic/property/owner_transfer"
require "corelogic/property/last_market_sale"
require "corelogic/property/prior_sale"

module Corelogic
  module API
    class PropertiesRepository
      include Corelogic::AutoInject["connection"]
      include Corelogic::AutoInject["response_parser"]
      include Corelogic::AutoInject["authenticator"]

      SEARCH_PATH = 'property'

      def search(options = {})
        Corelogic::Collection.new(Corelogic::Property, perform_response(SEARCH_PATH, options))
      end

      def ownership(property_id)
        Property::Ownership.new(perform_response("property/#{property_id}/ownership"))
      end

      def building(property_id)
        Property::Building.new(perform_response("property/#{property_id}/building"))
      end

      def tax_assessment(property_id)
        Property::TaxAssessment.new(perform_response("property/#{property_id}/tax-assessment"))
      end

      def site(property_id)
        Property::Site.new(perform_response("property/#{property_id}/site"))
      end

      def location(property_id)
        Property::Location.new(perform_response("property/#{property_id}/location"))
      end

      def owner_transfer(property_id)
        Property::OwnerTransfer.new(perform_response("property/#{property_id}/owner-transfer"))
      end

      def last_market_sale(property_id)
        Property::LastMarketSale.new(perform_response("property/#{property_id}/last-market-sale"))
      end

      def prior_sale(property_id)
        Property::PriorSale.new(perform_response("property/#{property_id}/prior-sale"))
      end

      def property_detail(property)
        response = perform_response("property/#{property.id}/property-detail")

        property.assign_data!(response[:property])
        property.ownership = Property::Ownership.new(response[:ownership]) if response[:ownership]
        property.building = Property::Building.new(response[:building]) if response[:building]
        property.tax_assessment = Property::TaxAssessment.new(response[:taxAssessment]) if response[:taxAssessment]
        property.site = Property::Site.new(response[:site]) if response[:site]
        property.location = Property::Location.new(response[:location]) if response[:location]
        property.owner_transfer = Property::OwnerTransfer.new(response[:ownerTransfer]) if response[:ownerTransfer]
        property.last_market_sale = Property::LastMarketSale.new(response[:lastMarketSale]) if response[:lastMarketSale]
        property.prior_sale = Property::PriorSale.new(response[:priorSale]) if response[:priorSale]
        property
      end

      private

      def perform_response(path, options = {})
        try = 0
        begin
          try += 1
          response_parser.perform(perform_get(path, options))
        rescue Corelogic::Error::Unauthorized => e
          puts e.message
          if try < 2
            puts "Retry: #{try}" if ENV['RAILS_ENV'] && ENV['RAILS_ENV'] == 'development'
            perform_connection(true)
            retry
          end
        end
      end

      def perform_get(path, options = {})
        perform_connection.get(path, params: options)
      end

      def perform_connection(force = false)
        return authenticator.call(connection, force: true) if force
        return connection if connection.authenticated?
        authenticator.call(connection)
      end

    end
  end
end