Move the capabilities call out of api_controller
authorAndy Allan <git@gravitystorm.co.uk>
Sat, 23 Feb 2019 13:36:02 +0000 (14:36 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Sun, 24 Feb 2019 10:00:20 +0000 (11:00 +0100)
app/abilities/ability.rb
app/controllers/api/capabilities_controller.rb [new file with mode: 0644]
app/controllers/api_controller.rb
app/views/api/capabilities/show.builder [moved from app/views/api/capabilities.builder with 100% similarity]
config/routes.rb
test/controllers/api/capabilities_test.rb [new file with mode: 0644]
test/controllers/api_controller_test.rb

index 4127c0d..f28acd5 100644 (file)
@@ -4,9 +4,10 @@ class Ability
   include CanCan::Ability
 
   def initialize(user)
   include CanCan::Ability
 
   def initialize(user)
-    can [:trackpoints, :map, :changes, :capabilities, :permissions], :api
+    can [:trackpoints, :map, :changes, :permissions], :api
     can [:relation, :relation_history, :way, :way_history, :node, :node_history,
          :changeset, :note, :new_note, :query], :browse
     can [:relation, :relation_history, :way, :way_history, :node, :node_history,
          :changeset, :note, :new_note, :query], :browse
+    can :show, :capability
     can [:index, :feed, :show, :download, :query], Changeset
     can :index, ChangesetComment
     can :search, :direction
     can [:index, :feed, :show, :download, :query], Changeset
     can :index, ChangesetComment
     can :search, :direction
diff --git a/app/controllers/api/capabilities_controller.rb b/app/controllers/api/capabilities_controller.rb
new file mode 100644 (file)
index 0000000..8337bc8
--- /dev/null
@@ -0,0 +1,21 @@
+module Api
+  class CapabilitiesController < ApplicationController
+    skip_before_action :verify_authenticity_token
+    before_action :api_deny_access_handler
+
+    authorize_resource :class => false
+
+    around_action :api_call_handle_error, :api_call_timeout
+
+    # External apps that use the api are able to query the api to find out some
+    # parameters of the API. It currently returns:
+    # * minimum and maximum API versions that can be used.
+    # * maximum area that can be requested in a bbox request in square degrees
+    # * number of tracepoints that are returned in each tracepoints page
+    def show
+      @database_status = database_status
+      @api_status = api_status
+      @gpx_status = gpx_status
+    end
+  end
+end
index 3273665..2e1a07c 100644 (file)
@@ -4,7 +4,7 @@ class ApiController < ApplicationController
 
   authorize_resource :class => false
 
 
   authorize_resource :class => false
 
-  before_action :check_api_readable, :except => [:capabilities]
+  before_action :check_api_readable
   before_action :setup_user_auth, :only => [:permissions]
   around_action :api_call_handle_error, :api_call_timeout
 
   before_action :setup_user_auth, :only => [:permissions]
   around_action :api_call_handle_error, :api_call_timeout
 
@@ -251,17 +251,6 @@ class ApiController < ApplicationController
     end
   end
 
     end
   end
 
-  # External apps that use the api are able to query the api to find out some
-  # parameters of the API. It currently returns:
-  # * minimum and maximum API versions that can be used.
-  # * maximum area that can be requested in a bbox request in square degrees
-  # * number of tracepoints that are returned in each tracepoints page
-  def capabilities
-    @database_status = database_status
-    @api_status = api_status
-    @gpx_status = gpx_status
-  end
-
   # External apps that use the api are able to query which permissions
   # they have. This currently returns a list of permissions granted to the current user:
   # * if authenticated via OAuth, this list will contain all permissions granted by the user to the access_token.
   # External apps that use the api are able to query which permissions
   # they have. This currently returns a list of permissions granted to the current user:
   # * if authenticated via OAuth, this list will contain all permissions granted by the user to the access_token.
index b0fe5e4..32e6f73 100644 (file)
@@ -1,9 +1,11 @@
 OpenStreetMap::Application.routes.draw do
   # API
 OpenStreetMap::Application.routes.draw do
   # API
-  get "api/capabilities" => "api#capabilities"
+  namespace :api do
+    get "capabilities" => "capabilities#show"
+  end
 
   scope "api/0.6" do
 
   scope "api/0.6" do
-    get "capabilities" => "api#capabilities"
+    get "capabilities" => "api/capabilities#show"
     get "permissions" => "api#permissions"
 
     put "changeset/create" => "changesets#create"
     get "permissions" => "api#permissions"
 
     put "changeset/create" => "changesets#create"
diff --git a/test/controllers/api/capabilities_test.rb b/test/controllers/api/capabilities_test.rb
new file mode 100644 (file)
index 0000000..127201f
--- /dev/null
@@ -0,0 +1,35 @@
+require "test_helper"
+
+module Api
+  class CapabilitiesControllerTest < ActionController::TestCase
+    ##
+    # test all routes which lead to this controller
+    def test_routes
+      assert_routing(
+        { :path => "/api/capabilities", :method => :get },
+        { :controller => "api/capabilities", :action => "show" }
+      )
+      assert_recognizes(
+        { :controller => "api/capabilities", :action => "show" },
+        { :path => "/api/0.6/capabilities", :method => :get }
+      )
+    end
+
+    def test_capabilities
+      get :show
+      assert_response :success
+      assert_select "osm[version='#{API_VERSION}'][generator='#{GENERATOR}']", :count => 1 do
+        assert_select "api", :count => 1 do
+          assert_select "version[minimum='#{API_VERSION}'][maximum='#{API_VERSION}']", :count => 1
+          assert_select "area[maximum='#{MAX_REQUEST_AREA}']", :count => 1
+          assert_select "note_area[maximum='#{MAX_NOTE_REQUEST_AREA}']", :count => 1
+          assert_select "tracepoints[per_page='#{TRACEPOINTS_PER_PAGE}']", :count => 1
+          assert_select "changesets[maximum_elements='#{Changeset::MAX_ELEMENTS}']", :count => 1
+          assert_select "status[database='online']", :count => 1
+          assert_select "status[api='online']", :count => 1
+          assert_select "status[gpx='online']", :count => 1
+        end
+      end
+    end
+  end
+end
index cdc20a1..cb759ec 100644 (file)
@@ -18,14 +18,6 @@ class ApiControllerTest < ActionController::TestCase
   ##
   # test all routes which lead to this controller
   def test_routes
   ##
   # test all routes which lead to this controller
   def test_routes
-    assert_routing(
-      { :path => "/api/capabilities", :method => :get },
-      { :controller => "api", :action => "capabilities" }
-    )
-    assert_recognizes(
-      { :controller => "api", :action => "capabilities" },
-      { :path => "/api/0.6/capabilities", :method => :get }
-    )
     assert_routing(
       { :path => "/api/0.6/permissions", :method => :get },
       { :controller => "api", :action => "permissions" }
     assert_routing(
       { :path => "/api/0.6/permissions", :method => :get },
       { :controller => "api", :action => "permissions" }
@@ -379,23 +371,6 @@ class ApiControllerTest < ActionController::TestCase
     assert_response :success
   end
 
     assert_response :success
   end
 
-  def test_capabilities
-    get :capabilities
-    assert_response :success
-    assert_select "osm[version='#{API_VERSION}'][generator='#{GENERATOR}']", :count => 1 do
-      assert_select "api", :count => 1 do
-        assert_select "version[minimum='#{API_VERSION}'][maximum='#{API_VERSION}']", :count => 1
-        assert_select "area[maximum='#{MAX_REQUEST_AREA}']", :count => 1
-        assert_select "note_area[maximum='#{MAX_NOTE_REQUEST_AREA}']", :count => 1
-        assert_select "tracepoints[per_page='#{TRACEPOINTS_PER_PAGE}']", :count => 1
-        assert_select "changesets[maximum_elements='#{Changeset::MAX_ELEMENTS}']", :count => 1
-        assert_select "status[database='online']", :count => 1
-        assert_select "status[api='online']", :count => 1
-        assert_select "status[gpx='online']", :count => 1
-      end
-    end
-  end
-
   def test_permissions_anonymous
     get :permissions
     assert_response :success
   def test_permissions_anonymous
     get :permissions
     assert_response :success