Added database, API and GPX status to capabilities.
authorMatt Amos <zerebubuth@gmail.com>
Mon, 1 Apr 2013 19:24:16 +0000 (20:24 +0100)
committerTom Hughes <tom@compton.nu>
Tue, 2 Apr 2013 14:05:20 +0000 (15:05 +0100)
app/controllers/api_controller.rb
app/controllers/application_controller.rb
test/functional/api_controller_test.rb

index 602b79d69c5462e6f9a0cdae3d2e1c55b343c306..5e75c731e9be85a1cbded6614815e4b688b54a3c 100644 (file)
@@ -285,7 +285,12 @@ class ApiController < ApplicationController
     timeout = XML::Node.new 'timeout'
     timeout['seconds'] = API_TIMEOUT.to_s
     api << timeout
-    
+    status = XML::Node.new 'status'
+    status['database'] = database_status.to_s
+    status['api'] = api_status.to_s
+    status['gpx'] = gpx_status.to_s
+    api << status
+
     doc.root << api
 
     render :text => doc.to_s, :content_type => "text/xml"
index 4b2c7082558c22eee5fe0ad4c8532c210744db89..e5a2b354037dd85fa9864729ddf9059584df2c10 100644 (file)
@@ -206,20 +206,49 @@ class ApplicationController < ActionController::Base
   end
 
   def check_api_readable
-    if STATUS == :database_offline or STATUS == :api_offline
+    if api_status == :offline
       report_error "Database offline for maintenance", :service_unavailable
       return false
     end
   end
 
   def check_api_writable
-    if STATUS == :database_offline or STATUS == :database_readonly or
-       STATUS == :api_offline or STATUS == :api_readonly
+    unless api_status == :online
       report_error "Database offline for maintenance", :service_unavailable
       return false
     end
   end
 
+  def database_status
+    if STATUS == :database_offline
+      :offline
+    elsif STATUS == :database_readonly
+      :readonly
+    else 
+      :online
+    end
+  end
+
+  def api_status
+    status = database_status
+    if status == :online
+      if STATUS == :api_offline
+        status = :offline
+      elsif STATUS == :api_readonly
+        status = :readonly
+      end
+    end
+    return status
+  end
+
+  def gpx_status
+    status = database_status
+    if status == :online
+      status = :offline if STATUS == :gpx_offline
+    end
+    return status
+  end
+
   def require_public_data
     unless @user.data_public?
       report_error "You must make your edits public to upload new data", :forbidden
index 01a227b37d62ce83b71357db6c2c727daccbae0c..04be473875d2b21a21566ac42b92de961d5f354c 100644 (file)
@@ -299,6 +299,9 @@ class ApiControllerTest < ActionController::TestCase
         assert_select "area[maximum=#{MAX_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