From c6e190d26a2d5c47d993aa0e79a3d36900083f4c Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Mon, 31 Mar 2025 02:57:51 +0300 Subject: [PATCH] Create search query base class --- app/abilities/ability.rb | 2 +- .../searches/queries_controller.rb | 23 +++++++++++++ app/helpers/geocoder_helper.rb | 2 +- config/routes.rb | 5 +++ test/abilities/abilities_test.rb | 2 +- .../searches/queries_controller_test.rb | 32 +++++++++++++++++++ 6 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 app/controllers/searches/queries_controller.rb create mode 100644 test/controllers/searches/queries_controller_test.rb diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb index b1c99a3f1..c605ee9b4 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 [:search, :search_latlon, :search_osm_nominatim, :search_osm_nominatim_reverse], :geocoder + can [:create, :search, :search_latlon, :search_osm_nominatim, :search_osm_nominatim_reverse], :geocoder if Settings.status != "database_offline" can [:read, :feed], Changeset diff --git a/app/controllers/searches/queries_controller.rb b/app/controllers/searches/queries_controller.rb new file mode 100644 index 000000000..9c130f10d --- /dev/null +++ b/app/controllers/searches/queries_controller.rb @@ -0,0 +1,23 @@ +module Searches + class QueriesController < ApplicationController + before_action :authorize_web + before_action :set_locale + authorize_resource :class => :geocoder + + private + + def fetch_text(url) + response = OSM.http_client.get(URI.parse(url)) + + if response.success? + response.body + else + raise response.status.to_s + end + end + + def fetch_xml(url) + REXML::Document.new(fetch_text(url)) + end + end +end diff --git a/app/helpers/geocoder_helper.rb b/app/helpers/geocoder_helper.rb index 882f2c835..4040307cc 100644 --- a/app/helpers/geocoder_helper.rb +++ b/app/helpers/geocoder_helper.rb @@ -3,7 +3,7 @@ module GeocoderHelper html_options = { :class => "set_position stretched-link", :data => {} } url = if result[:type] && result[:id] - url_for(:controller => result[:type].pluralize, :action => :show, :id => result[:id]) + url_for(:controller => "/#{result[:type].pluralize}", :action => :show, :id => result[:id]) elsif result[:min_lon] && result[:min_lat] && result[:max_lon] && result[:max_lat] "/?bbox=#{result[:min_lon]},#{result[:min_lat]},#{result[:max_lon]},#{result[:max_lat]}" else diff --git a/config/routes.rb b/config/routes.rb index 89e64b900..e0119a981 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -337,6 +337,11 @@ OpenStreetMap::Application.routes.draw do post "/geocoder/search_latlon" => "geocoder#search_latlon" post "/geocoder/search_osm_nominatim" => "geocoder#search_osm_nominatim" post "/geocoder/search_osm_nominatim_reverse" => "geocoder#search_osm_nominatim_reverse" + resource :search, :only => [] do + scope :module => :searches do + # TODO + end + end # directions get "/directions" => "directions#search" diff --git a/test/abilities/abilities_test.rb b/test/abilities/abilities_test.rb index 99168375a..297d9fc4f 100644 --- a/test/abilities/abilities_test.rb +++ b/test/abilities/abilities_test.rb @@ -9,7 +9,7 @@ class GuestAbilityTest < AbilityTest test "geocoder permission for a guest" do ability = Ability.new nil - [:search, :search_latlon, :search_osm_nominatim, + [:create, :search, :search_latlon, :search_osm_nominatim, :search_osm_nominatim_reverse].each do |action| assert ability.can?(action, :geocoder), "should be able to #{action} geocoder" end diff --git a/test/controllers/searches/queries_controller_test.rb b/test/controllers/searches/queries_controller_test.rb new file mode 100644 index 000000000..d98d9832d --- /dev/null +++ b/test/controllers/searches/queries_controller_test.rb @@ -0,0 +1,32 @@ +require "test_helper" + +module Searches + class QueriesControllerTest < ActionDispatch::IntegrationTest + private + + def results_check(*results) + assert_response :success + assert_template :create + assert_template :layout => nil + if results.empty? + assert_select "ul.results-list", 0 + else + assert_select "ul.results-list", 1 do + assert_select "li.search_results_entry", results.count + + results.each do |result| + attrs = result.collect { |k, v| "[data-#{k}='#{v}']" }.join + assert_select "li.search_results_entry a.set_position#{attrs}", result[:name] + end + end + end + end + + def results_check_error(error) + assert_response :success + assert_template :error + assert_template :layout => nil + assert_select ".alert.alert-danger", error + end + end +end -- 2.39.5