cartodb/services/table-geocoder/lib/table_geocoder_factory.rb
2020-06-15 10:58:47 +08:00

70 lines
2.5 KiB
Ruby

require_relative 'table_geocoder'
require_relative 'internal_geocoder'
require_relative 'gme/table_geocoder'
require_relative 'exceptions'
module Carto
class TableGeocoderFactory
def self.get(user, geocoding_model, cartodb_geocoder_config, table_service, params = {})
# Reset old connections to make sure changes apply.
# NOTE: This assumes it's being called from a Resque job
user.db_service.reset_pooled_connections
log = params.fetch(:log)
log.append_and_store 'TableGeocoderFactory.get()'
log.append_and_store "params: #{params.select{ |k| k != :log }}"
if user == table_service.owner
user_connection = user.in_database
else
if !table_service.table_visualization.has_permission?(user, Carto::Permission::ACCESS_READWRITE)
raise 'Insufficient permissions on table'
end
user_connection = table_service.owner.in_database
end
instance_config = cartodb_geocoder_config
.deep_symbolize_keys
.merge(
table_schema: table_service.try(:database_schema),
table_name: table_service.try(:name),
qualified_table_name: table_service.try(:qualified_table_name),
sequel_qualified_table_name: table_service.try(:sequel_qualified_table_name),
connection: user_connection
)
.merge(params)
kind = instance_config.fetch(:kind)
if kind == 'high-resolution'
if user.google_maps_geocoder_enabled?
geocoder_class = Carto::Gme::TableGeocoder
instance_config[:client_id] = user.google_maps_client_id
instance_config[:private_key] = user.google_maps_private_key
elsif user.geocoder_provider == 'heremaps'
geocoder_class = CartoDB::TableGeocoder
else
raise 'Unsupported geocoder provider'
end
else
geocoder_class = CartoDB::InternalGeocoder::Geocoder
end
instance_config[:usage_metrics] = get_geocoder_metrics_instance(user)
instance_config[:log] = log
instance_config[:geocoding_model] = geocoding_model
log.append_and_store "geocoder_class = #{geocoder_class}"
instance = geocoder_class.new(instance_config)
log.append_and_store "geocoder_type = #{instance.name}"
instance
end
def self.get_geocoder_metrics_instance(user)
orgname = user.organization.nil? ? nil : user.organization.name
CartoDB::GeocoderUsageMetrics.new(user.username, orgname)
end
end
end