ministryofjustice/Claim-for-Crown-Court-Defence

View on GitHub
app/services/distance_calculator_service/google_api.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class DistanceCalculatorService
  class GoogleAPI
    def initialize(origin, destination)
      @origin = origin
      @destination = destination
    end

    def distances
      @distances ||= routes.map { |route| sum_legs route['legs'] }.select(&:positive?)
    end

    private

    def sum_legs(legs)
      return 0 if legs.nil?

      legs.filter_map { |leg| leg.dig('distance', 'value') }.sum
    end

    def routes
      @routes ||= begin
        JSON.parse(directions)['routes']
      rescue StandardError => e
        log("Failed to calculate distance from #{@origin} to #{@destination}", error: e, level: :error)
        []
      end
    end

    def directions
      @directions ||= Faraday.get(Rails.application.config.google_directions_api_url, **params).body
    end

    def params
      @params ||= {
        region: 'uk',
        alternatives: true,
        key: Rails.application.secrets.google_api_key,
        origin: @origin,
        destination: @destination
      }
    end

    def log(message, error: nil, level: :info)
      LogStuff.send(
        level,
        class: 'DistanceCalculatorService::GoogleApi',
        action: 'routes',
        origin: @origin,
        destination: @destination,
        error: error ? "#{error.class} - #{error.message}" : 'false'
      ) do
        message
      end
    end
  end
end