Use a builder view for the capabilities call
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 9 Jan 2019 13:30:18 +0000 (14:30 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 9 Jan 2019 13:30:18 +0000 (14:30 +0100)
This is easier to work with than building the XML document by hand
in the controller.

app/controllers/api_controller.rb
app/views/api/capabilities.builder [new file with mode: 0644]

index d97feace24d748afa86be812e582493561818d62..90883376c97d7af2cf8239b582baea67d576b7e9 100644 (file)
@@ -253,48 +253,9 @@ class ApiController < ApplicationController
   # * 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
-    doc = OSM::API.new.get_xml_doc
-
-    api = XML::Node.new "api"
-    version = XML::Node.new "version"
-    version["minimum"] = API_VERSION.to_s
-    version["maximum"] = API_VERSION.to_s
-    api << version
-    area = XML::Node.new "area"
-    area["maximum"] = MAX_REQUEST_AREA.to_s
-    api << area
-    notearea = XML::Node.new "note_area"
-    notearea["maximum"] = MAX_NOTE_REQUEST_AREA.to_s
-    api << notearea
-    tracepoints = XML::Node.new "tracepoints"
-    tracepoints["per_page"] = TRACEPOINTS_PER_PAGE.to_s
-    api << tracepoints
-    waynodes = XML::Node.new "waynodes"
-    waynodes["maximum"] = MAX_NUMBER_OF_WAY_NODES.to_s
-    api << waynodes
-    changesets = XML::Node.new "changesets"
-    changesets["maximum_elements"] = Changeset::MAX_ELEMENTS.to_s
-    api << changesets
-    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
-    policy = XML::Node.new "policy"
-    blacklist = XML::Node.new "imagery"
-    IMAGERY_BLACKLIST.each do |url_regex|
-      xnd = XML::Node.new "blacklist"
-      xnd["regex"] = url_regex.to_s
-      blacklist << xnd
-    end
-    policy << blacklist
-    doc.root << policy
-
-    render :xml => doc.to_s
+    @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
diff --git a/app/views/api/capabilities.builder b/app/views/api/capabilities.builder
new file mode 100644 (file)
index 0000000..3fa7905
--- /dev/null
@@ -0,0 +1,22 @@
+xml.instruct! :xml, :version => "1.0"
+xml.osm(OSM::API.new.xml_root_attributes) do |osm|
+  osm.api do |api|
+    api.version(:minimum => API_VERSION.to_s, :maximum => API_VERSION.to_s)
+    api.area(:maximum => MAX_REQUEST_AREA.to_s)
+    api.note_area(:maximum => MAX_NOTE_REQUEST_AREA.to_s)
+    api.tracepoints(:per_page => TRACEPOINTS_PER_PAGE.to_s)
+    api.waynodes(:maximum => MAX_NUMBER_OF_WAY_NODES.to_s)
+    api.changesets(:maximum_elements => Changeset::MAX_ELEMENTS.to_s)
+    api.timeout(:seconds => API_TIMEOUT.to_s)
+    api.status(:database => @database_status.to_s,
+               :api => @api_status.to_s,
+               :gpx => @gpx_status.to_s)
+  end
+  osm.policy do |policy|
+    policy.imagery do |imagery|
+      IMAGERY_BLACKLIST.each do |url_regex|
+        imagery.blacklist(:regex => url_regex.to_s)
+      end
+    end
+  end
+end