Move the search controller to the api namespace
authorAndy Allan <git@gravitystorm.co.uk>
Sun, 24 Feb 2019 11:42:07 +0000 (12:42 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Sun, 24 Feb 2019 11:42:07 +0000 (12:42 +0100)
app/controllers/api/search_controller.rb [new file with mode: 0644]
app/controllers/search_controller.rb [deleted file]
config/routes.rb
test/controllers/api/search_controller_test.rb [new file with mode: 0644]
test/controllers/search_controller_test.rb [deleted file]

diff --git a/app/controllers/api/search_controller.rb b/app/controllers/api/search_controller.rb
new file mode 100644 (file)
index 0000000..0afbbf8
--- /dev/null
@@ -0,0 +1,102 @@
+module Api
+  class SearchController < ApplicationController
+    # Support searching for nodes, ways, or all
+    # Can search by tag k, v, or both (type->k,value->v)
+    # Can search by name (k=name,v=....)
+    skip_before_action :verify_authenticity_token
+    authorize_resource :class => false
+
+    def search_all
+      do_search(true, true, true)
+    end
+
+    def search_ways
+      do_search(true, false, false)
+    end
+
+    def search_nodes
+      do_search(false, true, false)
+    end
+
+    def search_relations
+      do_search(false, false, true)
+    end
+
+    def do_search(do_ways, do_nodes, do_relations)
+      type = params["type"]
+      value = params["value"]
+      unless type || value
+        name = params["name"]
+        if name
+          type = "name"
+          value = name
+        end
+      end
+
+      if do_nodes
+        response.headers["Error"] = "Searching of nodes is currently unavailable"
+        head :service_unavailable
+        return false
+      end
+
+      unless value
+        response.headers["Error"] = "Searching for a key without value is currently unavailable"
+        head :service_unavailable
+        return false
+      end
+
+      # Matching for node tags table
+      if do_nodes
+        nodes = Node.joins(:node_tags)
+        nodes = nodes.where(:current_node_tags => { :k => type }) if type
+        nodes = nodes.where(:current_node_tags => { :v => value }) if value
+        nodes = nodes.limit(100)
+      else
+        nodes = []
+      end
+
+      # Matching for way tags table
+      if do_ways
+        ways = Way.joins(:way_tags)
+        ways = ways.where(:current_way_tags => { :k => type }) if type
+        ways = ways.where(:current_way_tags => { :v => value }) if value
+        ways = ways.limit(100)
+      else
+        ways = []
+      end
+
+      # Matching for relation tags table
+      if do_relations
+        relations = Relation.joins(:relation_tags)
+        relations = relations.where(:current_relation_tags => { :k => type }) if type
+        relations = relations.where(:current_relation_tags => { :v => value }) if value
+        relations = relations.limit(2000)
+      else
+        relations = []
+      end
+
+      # Fetch any node needed for our ways (only have matching nodes so far)
+      nodes += Node.find(ways.collect(&:nds).uniq)
+
+      # Print
+      visible_nodes = {}
+      changeset_cache = {}
+      user_display_name_cache = {}
+      doc = OSM::API.new.get_xml_doc
+      nodes.each do |node|
+        doc.root << node.to_xml_node(changeset_cache, user_display_name_cache)
+        visible_nodes[node.id] = node
+      end
+
+      ways.each do |way|
+        doc.root << way.to_xml_node(visible_nodes, changeset_cache, user_display_name_cache)
+      end
+
+      relations.each do |rel|
+        doc.root << rel.to_xml_node(changeset_cache, user_display_name_cache)
+      end
+
+      render :xml => doc.to_s
+    end
+  end
+end
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
deleted file mode 100644 (file)
index 3a2e404..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-class SearchController < ApplicationController
-  # Support searching for nodes, ways, or all
-  # Can search by tag k, v, or both (type->k,value->v)
-  # Can search by name (k=name,v=....)
-  skip_before_action :verify_authenticity_token
-  authorize_resource :class => false
-
-  def search_all
-    do_search(true, true, true)
-  end
-
-  def search_ways
-    do_search(true, false, false)
-  end
-
-  def search_nodes
-    do_search(false, true, false)
-  end
-
-  def search_relations
-    do_search(false, false, true)
-  end
-
-  def do_search(do_ways, do_nodes, do_relations)
-    type = params["type"]
-    value = params["value"]
-    unless type || value
-      name = params["name"]
-      if name
-        type = "name"
-        value = name
-      end
-    end
-
-    if do_nodes
-      response.headers["Error"] = "Searching of nodes is currently unavailable"
-      head :service_unavailable
-      return false
-    end
-
-    unless value
-      response.headers["Error"] = "Searching for a key without value is currently unavailable"
-      head :service_unavailable
-      return false
-    end
-
-    # Matching for node tags table
-    if do_nodes
-      nodes = Node.joins(:node_tags)
-      nodes = nodes.where(:current_node_tags => { :k => type }) if type
-      nodes = nodes.where(:current_node_tags => { :v => value }) if value
-      nodes = nodes.limit(100)
-    else
-      nodes = []
-    end
-
-    # Matching for way tags table
-    if do_ways
-      ways = Way.joins(:way_tags)
-      ways = ways.where(:current_way_tags => { :k => type }) if type
-      ways = ways.where(:current_way_tags => { :v => value }) if value
-      ways = ways.limit(100)
-    else
-      ways = []
-    end
-
-    # Matching for relation tags table
-    if do_relations
-      relations = Relation.joins(:relation_tags)
-      relations = relations.where(:current_relation_tags => { :k => type }) if type
-      relations = relations.where(:current_relation_tags => { :v => value }) if value
-      relations = relations.limit(2000)
-    else
-      relations = []
-    end
-
-    # Fetch any node needed for our ways (only have matching nodes so far)
-    nodes += Node.find(ways.collect(&:nds).uniq)
-
-    # Print
-    visible_nodes = {}
-    changeset_cache = {}
-    user_display_name_cache = {}
-    doc = OSM::API.new.get_xml_doc
-    nodes.each do |node|
-      doc.root << node.to_xml_node(changeset_cache, user_display_name_cache)
-      visible_nodes[node.id] = node
-    end
-
-    ways.each do |way|
-      doc.root << way.to_xml_node(visible_nodes, changeset_cache, user_display_name_cache)
-    end
-
-    relations.each do |rel|
-      doc.root << rel.to_xml_node(changeset_cache, user_display_name_cache)
-    end
-
-    render :xml => doc.to_s
-  end
-end
index 314cefe..a124901 100644 (file)
@@ -61,10 +61,10 @@ OpenStreetMap::Application.routes.draw do
 
     get "changes" => "api/changes#index"
 
-    get "search" => "search#search_all", :as => "api_search"
-    get "ways/search" => "search#search_ways"
-    get "relations/search" => "search#search_relations"
-    get "nodes/search" => "search#search_nodes"
+    get "search" => "api/search#search_all", :as => "api_search"
+    get "ways/search" => "api/search#search_ways"
+    get "relations/search" => "api/search#search_relations"
+    get "nodes/search" => "api/search#search_nodes"
 
     get "user/:id" => "users#api_read", :id => /\d+/
     get "user/details" => "users#api_details"
diff --git a/test/controllers/api/search_controller_test.rb b/test/controllers/api/search_controller_test.rb
new file mode 100644 (file)
index 0000000..e11a3c7
--- /dev/null
@@ -0,0 +1,108 @@
+require "test_helper"
+
+module Api
+  class SearchControllerTest < ActionController::TestCase
+    ##
+    # test all routes which lead to this controller
+    def test_routes
+      assert_routing(
+        { :path => "/api/0.6/search", :method => :get },
+        { :controller => "api/search", :action => "search_all" }
+      )
+      assert_routing(
+        { :path => "/api/0.6/nodes/search", :method => :get },
+        { :controller => "api/search", :action => "search_nodes" }
+      )
+      assert_routing(
+        { :path => "/api/0.6/ways/search", :method => :get },
+        { :controller => "api/search", :action => "search_ways" }
+      )
+      assert_routing(
+        { :path => "/api/0.6/relations/search", :method => :get },
+        { :controller => "api/search", :action => "search_relations" }
+      )
+    end
+
+    ##
+    # test searching nodes
+    def test_search_nodes
+      get :search_nodes, :params => { :type => "test" }
+      assert_response :service_unavailable
+      assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
+
+      get :search_nodes, :params => { :type => "test", :value => "yes" }
+      assert_response :service_unavailable
+      assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
+
+      get :search_nodes, :params => { :name => "Test Node" }
+      assert_response :service_unavailable
+      assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
+    end
+
+    ##
+    # test searching ways
+    def test_search_ways
+      first_way = create(:way_with_nodes, :nodes_count => 2)
+      deleted_way = create(:way_with_nodes, :deleted, :nodes_count => 2)
+      third_way = create(:way_with_nodes, :nodes_count => 2)
+
+      [first_way, deleted_way, third_way].each do |way|
+        create(:way_tag, :way => way, :k => "test", :v => "yes")
+      end
+      create(:way_tag, :way => third_way, :k => "name", :v => "Test Way")
+
+      get :search_ways, :params => { :type => "test" }
+      assert_response :service_unavailable
+      assert_equal "Searching for a key without value is currently unavailable", response.headers["Error"]
+
+      get :search_ways, :params => { :type => "test", :value => "yes" }
+      assert_response :success
+      assert_select "way", 3
+
+      get :search_ways, :params => { :name => "Test Way" }
+      assert_response :success
+      assert_select "way", 1
+    end
+
+    ##
+    # test searching relations
+    def test_search_relations
+      first_relation = create(:relation)
+      deleted_relation = create(:relation)
+      third_relation = create(:relation)
+
+      [first_relation, deleted_relation, third_relation].each do |relation|
+        create(:relation_tag, :relation => relation, :k => "test", :v => "yes")
+      end
+      create(:relation_tag, :relation => third_relation, :k => "name", :v => "Test Relation")
+
+      get :search_relations, :params => { :type => "test" }
+      assert_response :service_unavailable
+      assert_equal "Searching for a key without value is currently unavailable", response.headers["Error"]
+
+      get :search_relations, :params => { :type => "test", :value => "yes" }
+      assert_response :success
+      assert_select "relation", 3
+
+      get :search_relations, :params => { :name => "Test Relation" }
+      assert_response :success
+      assert_select "relation", 1
+    end
+
+    ##
+    # test searching nodes, ways and relations
+    def test_search_all
+      get :search_all, :params => { :type => "test" }
+      assert_response :service_unavailable
+      assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
+
+      get :search_all, :params => { :type => "test", :value => "yes" }
+      assert_response :service_unavailable
+      assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
+
+      get :search_all, :params => { :name => "Test" }
+      assert_response :service_unavailable
+      assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
+    end
+  end
+end
diff --git a/test/controllers/search_controller_test.rb b/test/controllers/search_controller_test.rb
deleted file mode 100644 (file)
index 49a70f1..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-require "test_helper"
-
-class SearchControllerTest < ActionController::TestCase
-  ##
-  # test all routes which lead to this controller
-  def test_routes
-    assert_routing(
-      { :path => "/api/0.6/search", :method => :get },
-      { :controller => "search", :action => "search_all" }
-    )
-    assert_routing(
-      { :path => "/api/0.6/nodes/search", :method => :get },
-      { :controller => "search", :action => "search_nodes" }
-    )
-    assert_routing(
-      { :path => "/api/0.6/ways/search", :method => :get },
-      { :controller => "search", :action => "search_ways" }
-    )
-    assert_routing(
-      { :path => "/api/0.6/relations/search", :method => :get },
-      { :controller => "search", :action => "search_relations" }
-    )
-  end
-
-  ##
-  # test searching nodes
-  def test_search_nodes
-    get :search_nodes, :params => { :type => "test" }
-    assert_response :service_unavailable
-    assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
-
-    get :search_nodes, :params => { :type => "test", :value => "yes" }
-    assert_response :service_unavailable
-    assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
-
-    get :search_nodes, :params => { :name => "Test Node" }
-    assert_response :service_unavailable
-    assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
-  end
-
-  ##
-  # test searching ways
-  def test_search_ways
-    first_way = create(:way_with_nodes, :nodes_count => 2)
-    deleted_way = create(:way_with_nodes, :deleted, :nodes_count => 2)
-    third_way = create(:way_with_nodes, :nodes_count => 2)
-
-    [first_way, deleted_way, third_way].each do |way|
-      create(:way_tag, :way => way, :k => "test", :v => "yes")
-    end
-    create(:way_tag, :way => third_way, :k => "name", :v => "Test Way")
-
-    get :search_ways, :params => { :type => "test" }
-    assert_response :service_unavailable
-    assert_equal "Searching for a key without value is currently unavailable", response.headers["Error"]
-
-    get :search_ways, :params => { :type => "test", :value => "yes" }
-    assert_response :success
-    assert_select "way", 3
-
-    get :search_ways, :params => { :name => "Test Way" }
-    assert_response :success
-    assert_select "way", 1
-  end
-
-  ##
-  # test searching relations
-  def test_search_relations
-    first_relation = create(:relation)
-    deleted_relation = create(:relation)
-    third_relation = create(:relation)
-
-    [first_relation, deleted_relation, third_relation].each do |relation|
-      create(:relation_tag, :relation => relation, :k => "test", :v => "yes")
-    end
-    create(:relation_tag, :relation => third_relation, :k => "name", :v => "Test Relation")
-
-    get :search_relations, :params => { :type => "test" }
-    assert_response :service_unavailable
-    assert_equal "Searching for a key without value is currently unavailable", response.headers["Error"]
-
-    get :search_relations, :params => { :type => "test", :value => "yes" }
-    assert_response :success
-    assert_select "relation", 3
-
-    get :search_relations, :params => { :name => "Test Relation" }
-    assert_response :success
-    assert_select "relation", 1
-  end
-
-  ##
-  # test searching nodes, ways and relations
-  def test_search_all
-    get :search_all, :params => { :type => "test" }
-    assert_response :service_unavailable
-    assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
-
-    get :search_all, :params => { :type => "test", :value => "yes" }
-    assert_response :service_unavailable
-    assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
-
-    get :search_all, :params => { :name => "Test" }
-    assert_response :service_unavailable
-    assert_equal "Searching of nodes is currently unavailable", response.headers["Error"]
-  end
-end