From 500ffb95f8dae3f2c6e237e4a3f64ebf37a4252a Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Mon, 31 Mar 2025 05:28:40 +0300 Subject: [PATCH] Create nominatim reverse search query resource --- app/abilities/ability.rb | 2 +- app/controllers/geocoder_controller.rb | 33 +----------------- .../nominatim_reverse_queries_controller.rb | 34 +++++++++++++++++++ config/routes.rb | 2 +- test/abilities/abilities_test.rb | 3 +- test/controllers/geocoder_controller_test.rb | 25 -------------- ...minatim_reverse_queries_controller_test.rb | 33 ++++++++++++++++++ 7 files changed, 71 insertions(+), 61 deletions(-) create mode 100644 app/controllers/searches/nominatim_reverse_queries_controller.rb create mode 100644 test/controllers/searches/nominatim_reverse_queries_controller_test.rb diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb index 2aae3f4ae..5de3d6b5e 100644 --- a/app/abilities/ability.rb +++ b/app/abilities/ability.rb @@ -10,7 +10,7 @@ class Ability can :search, :direction can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :communities, :preview, :copyright, :id], :site can [:finish, :embed], :export - can [:create, :search, :search_osm_nominatim_reverse], :geocoder + can [:create, :search], :geocoder if Settings.status != "database_offline" can [:read, :feed], Changeset diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index c8d3c35cd..34f45dc39 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -18,7 +18,7 @@ class GeocoderController < ApplicationController @sources.push(:name => "latlon", :url => root_path, :fetch_url => search_latlon_query_path(params.permit(:lat, :lon, :latlon_digits, :zoom))) @sources.push(:name => "osm_nominatim_reverse", :url => nominatim_reverse_query_url(:format => "html"), - :fetch_url => url_for(params.permit(:lat, :lon, :zoom).merge(:action => "search_osm_nominatim_reverse"))) + :fetch_url => search_nominatim_reverse_query_path(params.permit(:lat, :lon, :zoom))) elsif params[:query] @sources.push(:name => "osm_nominatim", :url => nominatim_query_url(:format => "html"), :fetch_url => search_nominatim_query_path(params.permit(:query, :minlat, :minlon, :maxlat, :maxlon))) @@ -31,37 +31,6 @@ class GeocoderController < ApplicationController end end - def search_osm_nominatim_reverse - # get query parameters - zoom = params[:zoom] - - # create result array - @results = [] - - # ask nominatim - response = fetch_xml(nominatim_reverse_query_url(:format => "xml")) - - # parse the response - response.elements.each("reversegeocode/result") do |result| - lat = result.attributes["lat"] - lon = result.attributes["lon"] - object_type = result.attributes["osm_type"] - object_id = result.attributes["osm_id"] - description = result.text - - @results.push(:lat => lat, :lon => lon, - :zoom => zoom, - :name => description, - :type => object_type, :id => object_id) - end - - render "searches/queries/create" - rescue StandardError => e - host = URI(Settings.nominatim_url).host - @error = "Error contacting #{host}: #{e}" - render "searches/queries/error" - end - private def fetch_text(url) diff --git a/app/controllers/searches/nominatim_reverse_queries_controller.rb b/app/controllers/searches/nominatim_reverse_queries_controller.rb new file mode 100644 index 000000000..c0fe8e6c9 --- /dev/null +++ b/app/controllers/searches/nominatim_reverse_queries_controller.rb @@ -0,0 +1,34 @@ +module Searches + class NominatimReverseQueriesController < QueriesController + include NominatimMethods + + def create + # get query parameters + zoom = params[:zoom] + + # create result array + @results = [] + + # ask nominatim + response = fetch_xml(nominatim_reverse_query_url(:format => "xml")) + + # parse the response + response.elements.each("reversegeocode/result") do |result| + lat = result.attributes["lat"] + lon = result.attributes["lon"] + object_type = result.attributes["osm_type"] + object_id = result.attributes["osm_id"] + description = result.text + + @results.push(:lat => lat, :lon => lon, + :zoom => zoom, + :name => description, + :type => object_type, :id => object_id) + end + rescue StandardError => e + host = URI(Settings.nominatim_url).host + @error = "Error contacting #{host}: #{e}" + render :action => "error" + end + end +end diff --git a/config/routes.rb b/config/routes.rb index b09c07c7c..f4d6c826f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -334,11 +334,11 @@ OpenStreetMap::Application.routes.draw do # geocoder get "/search" => "geocoder#search" - post "/geocoder/search_osm_nominatim_reverse" => "geocoder#search_osm_nominatim_reverse" resource :search, :only => [] do scope :module => :searches do resource :latlon_query, :only => :create resource :nominatim_query, :only => :create + resource :nominatim_reverse_query, :only => :create end end diff --git a/test/abilities/abilities_test.rb b/test/abilities/abilities_test.rb index 8273cd3e5..4219b41c0 100644 --- a/test/abilities/abilities_test.rb +++ b/test/abilities/abilities_test.rb @@ -9,8 +9,7 @@ class GuestAbilityTest < AbilityTest test "geocoder permission for a guest" do ability = Ability.new nil - [:create, :search, - :search_osm_nominatim_reverse].each do |action| + [:create, :search].each do |action| assert ability.can?(action, :geocoder), "should be able to #{action} geocoder" end end diff --git a/test/controllers/geocoder_controller_test.rb b/test/controllers/geocoder_controller_test.rb index fe0b46f1b..e7f2ec669 100644 --- a/test/controllers/geocoder_controller_test.rb +++ b/test/controllers/geocoder_controller_test.rb @@ -8,10 +8,6 @@ class GeocoderControllerTest < ActionDispatch::IntegrationTest { :path => "/search", :method => :get }, { :controller => "geocoder", :action => "search" } ) - assert_routing( - { :path => "/geocoder/search_osm_nominatim_reverse", :method => :post }, - { :controller => "geocoder", :action => "search_osm_nominatim_reverse" } - ) end ## @@ -315,27 +311,6 @@ class GeocoderControllerTest < ActionDispatch::IntegrationTest search_check "foo bar baz", %w[osm_nominatim] end - ## - # Test the nominatim reverse search - def test_search_osm_nominatim_reverse - with_http_stubs "nominatim" do - post geocoder_search_osm_nominatim_reverse_path(:lat => 51.7632, :lon => -0.0076, :zoom => 15), :xhr => true - results_check :name => "Broxbourne, Hertfordshire, East of England, England, United Kingdom", - :lat => 51.7465723, :lon => -0.0190782, - :type => "node", :id => 28825933, :zoom => 15 - - post geocoder_search_osm_nominatim_reverse_path(:lat => 51.7632, :lon => -0.0076, :zoom => 17), :xhr => true - results_check :name => "Dinant Link Road, Broxbourne, Hertfordshire, East of England, England, EN11 8HX, United Kingdom", - :lat => 51.7634883, :lon => -0.0088373, - :type => "way", :id => 3489841, :zoom => 17 - - post geocoder_search_osm_nominatim_reverse_path(:lat => 13.7709, :lon => 100.50507, :zoom => 19), :xhr => true - results_check :name => "MM Steak&Grill, ถนนศรีอยุธยา, บางขุนพรหม, กรุงเทพมหานคร, เขตดุสิต, กรุงเทพมหานคร, 10300, ประเทศไทย", - :lat => 13.7708691, :lon => 100.505073233221, - :type => "way", :id => 542901374, :zoom => 19 - end - end - private def latlon_check(query, lat, lon) diff --git a/test/controllers/searches/nominatim_reverse_queries_controller_test.rb b/test/controllers/searches/nominatim_reverse_queries_controller_test.rb new file mode 100644 index 000000000..dddca2db9 --- /dev/null +++ b/test/controllers/searches/nominatim_reverse_queries_controller_test.rb @@ -0,0 +1,33 @@ +require_relative "queries_controller_test" + +module Searches + class NominatimReverseQueriesControllerTest < QueriesControllerTest + ## + # test all routes which lead to this controller + def test_routes + assert_routing( + { :path => "/search/nominatim_reverse_query", :method => :post }, + { :controller => "searches/nominatim_reverse_queries", :action => "create" } + ) + end + + def test_create + with_http_stubs "nominatim" do + post search_nominatim_reverse_query_path(:lat => 51.7632, :lon => -0.0076, :zoom => 15), :xhr => true + results_check :name => "Broxbourne, Hertfordshire, East of England, England, United Kingdom", + :lat => 51.7465723, :lon => -0.0190782, + :type => "node", :id => 28825933, :zoom => 15 + + post search_nominatim_reverse_query_path(:lat => 51.7632, :lon => -0.0076, :zoom => 17), :xhr => true + results_check :name => "Dinant Link Road, Broxbourne, Hertfordshire, East of England, England, EN11 8HX, United Kingdom", + :lat => 51.7634883, :lon => -0.0088373, + :type => "way", :id => 3489841, :zoom => 17 + + post search_nominatim_reverse_query_path(:lat => 13.7709, :lon => 100.50507, :zoom => 19), :xhr => true + results_check :name => "MM Steak&Grill, ถนนศรีอยุธยา, บางขุนพรหม, กรุงเทพมหานคร, เขตดุสิต, กรุงเทพมหานคร, 10300, ประเทศไทย", + :lat => 13.7708691, :lon => 100.505073233221, + :type => "way", :id => 542901374, :zoom => 19 + end + end + end +end -- 2.39.5