]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/api_controller.rb
Move the trackpoints call into its own controller (and rename to tracepoints)
[rails.git] / app / controllers / api_controller.rb
index 9324a8ed56a4c4eb2351123a0c7d677ce56fd894..8f9cb6adc92c8b557326296cb6884975da550f61 100644 (file)
 class ApiController < ApplicationController
   skip_before_action :verify_authenticity_token
-  before_action :check_api_readable, :except => [:capabilities]
-  before_action :setup_user_auth, :only => [:permissions]
-  around_action :api_call_handle_error, :api_call_timeout
-
-  # Get an XML response containing a list of tracepoints that have been uploaded
-  # within the specified bounding box, and in the specified page.
-  def trackpoints
-    # retrieve the page number
-    page = params["page"].to_s.to_i
-
-    unless page >= 0
-      report_error("Page number must be greater than or equal to 0")
-      return
-    end
-
-    offset = page * TRACEPOINTS_PER_PAGE
-
-    # Figure out the bbox
-    # check boundary is sane and area within defined
-    # see /config/application.yml
-    begin
-      bbox = BoundingBox.from_bbox_params(params)
-      bbox.check_boundaries
-      bbox.check_size
-    rescue StandardError => err
-      report_error(err.message)
-      return
-    end
-
-    # get all the points
-    points = Tracepoint.bbox(bbox).offset(offset).limit(TRACEPOINTS_PER_PAGE).order("gpx_id DESC, trackid ASC, timestamp ASC")
-
-    doc = XML::Document.new
-    doc.encoding = XML::Encoding::UTF_8
-    root = XML::Node.new "gpx"
-    root["version"] = "1.0"
-    root["creator"] = "OpenStreetMap.org"
-    root["xmlns"] = "http://www.topografix.com/GPX/1/0"
-
-    doc.root = root
+  before_action :api_deny_access_handler
 
-    # initialise these variables outside of the loop so that they
-    # stay in scope and don't get free'd up by the GC during the
-    # loop.
-    gpx_id = -1
-    trackid = -1
-    track = nil
-    trkseg = nil
-    anon_track = nil
-    anon_trkseg = nil
-    gpx_file = nil
-    timestamps = false
+  authorize_resource :class => false
 
-    points.each do |point|
-      if gpx_id != point.gpx_id
-        gpx_id = point.gpx_id
-        trackid = -1
-        gpx_file = Trace.find(gpx_id)
-
-        if gpx_file.trackable?
-          track = XML::Node.new "trk"
-          doc.root << track
-          timestamps = true
-
-          if gpx_file.identifiable?
-            track << (XML::Node.new("name") << gpx_file.name)
-            track << (XML::Node.new("desc") << gpx_file.description)
-            track << (XML::Node.new("url") << url_for(:controller => "trace", :action => "view", :display_name => gpx_file.user.display_name, :id => gpx_file.id))
-          end
-        else
-          # use the anonymous track segment if the user hasn't allowed
-          # their GPX points to be tracked.
-          timestamps = false
-          if anon_track.nil?
-            anon_track = XML::Node.new "trk"
-            doc.root << anon_track
-          end
-          track = anon_track
-        end
-      end
-
-      if trackid != point.trackid
-        if gpx_file.trackable?
-          trkseg = XML::Node.new "trkseg"
-          track << trkseg
-          trackid = point.trackid
-        else
-          if anon_trkseg.nil?
-            anon_trkseg = XML::Node.new "trkseg"
-            anon_track << anon_trkseg
-          end
-          trkseg = anon_trkseg
-        end
-      end
-
-      trkseg << point.to_xml_node(timestamps)
-    end
-
-    response.headers["Content-Disposition"] = "attachment; filename=\"tracks.gpx\""
-
-    render :xml => doc.to_s
-  end
+  before_action :check_api_readable
+  before_action :setup_user_auth, :only => [:permissions]
+  around_action :api_call_handle_error, :api_call_timeout
 
   # This is probably the most common call of all. It is used for getting the
   # OSM data for a specified bounding box, usually for editing. First the
@@ -157,9 +62,7 @@ class ApiController < ApplicationController
     # - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this
     nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
 
-    unless nodes_to_fetch.empty?
-      nodes += Node.includes(:node_tags).find(nodes_to_fetch)
-    end
+    nodes += Node.includes(:node_tags).find(nodes_to_fetch) unless nodes_to_fetch.empty?
 
     visible_nodes = {}
     changeset_cache = {}
@@ -193,7 +96,7 @@ class ApiController < ApplicationController
     # this "uniq" may be slightly inefficient; it may be better to first collect and output
     # all node-related relations, then find the *not yet covered* way-related ones etc.
     relations.uniq.each do |relation|
-      doc.root << relation.to_xml_node(nil, changeset_cache, user_display_name_cache)
+      doc.root << relation.to_xml_node(changeset_cache, user_display_name_cache)
     end
 
     response.headers["Content-Disposition"] = "attachment; filename=\"map.osm\""
@@ -247,56 +150,6 @@ class ApiController < ApplicationController
     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
-    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
-  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.