commit
b4911b8a70
13 changed files with 104 additions and 94 deletions
|
@ -2,7 +2,7 @@ class Ban::SearchController < ApplicationController
|
||||||
def get
|
def get
|
||||||
request = params[:request]
|
request = params[:request]
|
||||||
|
|
||||||
json = ApiAdresse::AddressRetriever.new(request).list.map do |value|
|
json = ApiAdresse::AddressAdapter.new(request).get_suggestions.map do |value|
|
||||||
{ label: value }
|
{ label: value }
|
||||||
end.to_json
|
end.to_json
|
||||||
|
|
||||||
|
@ -10,7 +10,9 @@ class Ban::SearchController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_address_point
|
def get_address_point
|
||||||
point = ApiAdresse::Geocodeur.convert_adresse_to_point(params[:request])
|
request = params[:request]
|
||||||
|
|
||||||
|
point = ApiAdresse::PointAdapter.new(request).geocode
|
||||||
|
|
||||||
if point.present?
|
if point.present?
|
||||||
lon = point.x.to_s
|
lon = point.x.to_s
|
||||||
|
|
33
app/lib/api_adresse/adapter.rb
Normal file
33
app/lib/api_adresse/adapter.rb
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
class ApiAdresse::Adapter
|
||||||
|
private
|
||||||
|
|
||||||
|
def initialize(address, limit, blank_return)
|
||||||
|
@address = address
|
||||||
|
@limit = limit
|
||||||
|
@blank_return = blank_return
|
||||||
|
end
|
||||||
|
|
||||||
|
def features
|
||||||
|
@features ||= get_features
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_features
|
||||||
|
response = ApiAdresse::API.call(@address, @limit)
|
||||||
|
result = JSON.parse(response)
|
||||||
|
result['features']
|
||||||
|
rescue RestClient::Exception, JSON::ParserError, TypeError
|
||||||
|
@blank_return
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_result
|
||||||
|
if features.present?
|
||||||
|
process_features
|
||||||
|
else
|
||||||
|
@blank_return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_features
|
||||||
|
raise NoMethodError
|
||||||
|
end
|
||||||
|
end
|
17
app/lib/api_adresse/address_adapter.rb
Normal file
17
app/lib/api_adresse/address_adapter.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
class ApiAdresse::AddressAdapter < ApiAdresse::Adapter
|
||||||
|
def initialize(address)
|
||||||
|
super(address, 5, [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_suggestions
|
||||||
|
handle_result
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def process_features
|
||||||
|
features.map do |feature|
|
||||||
|
feature['properties']['label']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,26 +0,0 @@
|
||||||
class ApiAdresse::AddressRetriever
|
|
||||||
def initialize(address)
|
|
||||||
@address = address
|
|
||||||
end
|
|
||||||
|
|
||||||
def list
|
|
||||||
@list ||= convert_api_result_to_full_address
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def convert_api_result_to_full_address
|
|
||||||
result = JSON.parse(ApiAdresse::API.call(@address, 5))
|
|
||||||
|
|
||||||
if result['features'].empty?
|
|
||||||
Rails.logger.error "unable to find location for address #{@address}"
|
|
||||||
return []
|
|
||||||
end
|
|
||||||
|
|
||||||
result['features'].map do |feature|
|
|
||||||
feature['properties']['label']
|
|
||||||
end
|
|
||||||
rescue TypeError, JSON::ParserError
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,8 +0,0 @@
|
||||||
class ApiAdresse::Geocodeur
|
|
||||||
def self.convert_adresse_to_point(address)
|
|
||||||
ApiAdresse::PointRetriever.new(address).point
|
|
||||||
rescue RestClient::Exception, JSON::ParserError => e
|
|
||||||
Rails.logger.error(e.message)
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
|
15
app/lib/api_adresse/point_adapter.rb
Normal file
15
app/lib/api_adresse/point_adapter.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
class ApiAdresse::PointAdapter < ApiAdresse::Adapter
|
||||||
|
def initialize(address)
|
||||||
|
super(address, 1, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def geocode
|
||||||
|
handle_result
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def process_features
|
||||||
|
RGeo::GeoJSON.decode(features[0]['geometry'], json_parser: :json)
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,22 +0,0 @@
|
||||||
class ApiAdresse::PointRetriever
|
|
||||||
def initialize(address)
|
|
||||||
@address = address
|
|
||||||
end
|
|
||||||
|
|
||||||
def point
|
|
||||||
@point ||= convert_api_result_to_point
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def convert_api_result_to_point
|
|
||||||
result = JSON.parse(ApiAdresse::API.call(@address))
|
|
||||||
|
|
||||||
if result['features'].empty?
|
|
||||||
Rails.logger.error "unable to find location for address #{@address}"
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
RGeo::GeoJSON.decode(result['features'][0]['geometry'], json_parser: :json)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,7 +1,4 @@
|
||||||
class ApiCarto::API
|
class ApiCarto::API
|
||||||
def initialize
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.search_qp(geojson)
|
def self.search_qp(geojson)
|
||||||
url = [API_CARTO_URL, "quartiers-prioritaires", "search"].join("/")
|
url = [API_CARTO_URL, "quartiers-prioritaires", "search"].join("/")
|
||||||
call(url, geojson)
|
call(url, geojson)
|
||||||
|
|
|
@ -6,9 +6,6 @@ class ApiEntreprise::API
|
||||||
|
|
||||||
TIMEOUT = 15
|
TIMEOUT = 15
|
||||||
|
|
||||||
def initialize
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.entreprise(siren, procedure_id)
|
def self.entreprise(siren, procedure_id)
|
||||||
call(ENTREPRISE_RESOURCE_NAME, siren, procedure_id)
|
call(ENTREPRISE_RESOURCE_NAME, siren, procedure_id)
|
||||||
end
|
end
|
||||||
|
|
|
@ -243,7 +243,7 @@ class Dossier < ApplicationRecord
|
||||||
|
|
||||||
def geo_position
|
def geo_position
|
||||||
if etablissement.present?
|
if etablissement.present?
|
||||||
point = ApiAdresse::Geocodeur.convert_adresse_to_point(etablissement.geo_adresse)
|
point = ApiAdresse::PointAdapter.new(etablissement.geo_adresse).geocode
|
||||||
end
|
end
|
||||||
|
|
||||||
lon = "2.428462"
|
lon = "2.428462"
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe ApiAdresse::AddressRetriever do
|
describe ApiAdresse::AddressAdapter do
|
||||||
describe '#list' do
|
describe '#get_suggestions' do
|
||||||
let(:request) { 'Paris' }
|
let(:request) { 'Paris' }
|
||||||
let(:response) { File.open('spec/support/files/api_adresse/search_results.json') }
|
let(:response) { File.open('spec/support/files/api_adresse/search_results.json') }
|
||||||
let(:status) { 200 }
|
let(:status) { 200 }
|
||||||
|
|
||||||
subject { described_class.new(request).list }
|
subject { described_class.new(request).get_suggestions }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
stub_request(:get, "https://api-adresse.data.gouv.fr/search?&q=#{request}&limit=5")
|
stub_request(:get, "https://api-adresse.data.gouv.fr/search?&q=#{request}&limit=5")
|
|
@ -1,26 +0,0 @@
|
||||||
require 'spec_helper'
|
|
||||||
|
|
||||||
describe ApiAdresse::Geocodeur do
|
|
||||||
let(:address) { '50 av des champs elysees' }
|
|
||||||
describe '.convert_adresse_to_point', vcr: { cassette_name: 'api_adresse_octo' } do
|
|
||||||
it 'return a point' do
|
|
||||||
expect(described_class.convert_adresse_to_point(address).class).to eq(RGeo::Cartesian::PointImpl)
|
|
||||||
end
|
|
||||||
context 'when RestClient::Exception' do
|
|
||||||
before do
|
|
||||||
allow(ApiAdresse::API).to receive(:call).and_raise(RestClient::Exception)
|
|
||||||
end
|
|
||||||
it 'return nil' do
|
|
||||||
expect(described_class.convert_adresse_to_point(address)).to be_nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
context 'when JSON::ParserError' do
|
|
||||||
before do
|
|
||||||
allow_any_instance_of(ApiAdresse::PointRetriever).to receive(:point).and_raise(JSON::ParserError)
|
|
||||||
end
|
|
||||||
it 'return nil' do
|
|
||||||
expect(described_class.convert_adresse_to_point(address)).to be_nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
31
spec/lib/api_adresse/point_adapter_spec.rb
Normal file
31
spec/lib/api_adresse/point_adapter_spec.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe ApiAdresse::PointAdapter do
|
||||||
|
let(:address) { '50 av des champs elysees' }
|
||||||
|
|
||||||
|
describe '.geocode', vcr: { cassette_name: 'api_adresse_octo' } do
|
||||||
|
it 'return a point' do
|
||||||
|
expect(described_class.new(address).geocode.class).to eq(RGeo::Cartesian::PointImpl)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when RestClient::Exception' do
|
||||||
|
before do
|
||||||
|
allow(ApiAdresse::API).to receive(:call).and_raise(RestClient::Exception)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'return nil' do
|
||||||
|
expect(described_class.new(address).geocode).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when JSON::ParserError' do
|
||||||
|
before do
|
||||||
|
allow(JSON).to receive(:parse).and_raise(JSON::ParserError)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'return nil' do
|
||||||
|
expect(described_class.new(address).geocode).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue