]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/api_controller.rb
Fix various routing and route generation errors
[rails.git] / app / controllers / api_controller.rb
index 3e9e627db7fe02c2b7f5777f32f1429b13e9ed1d..53e14202c051558090c820d91f17f6169d89d4bc 100644 (file)
@@ -1,12 +1,10 @@
 class ApiController < ApplicationController
 
+  skip_before_filter :verify_authenticity_token
   before_filter :check_api_readable, :except => [:capabilities]
   after_filter :compress_output
   around_filter :api_call_handle_error, :api_call_timeout
 
-  # Help methods for checking boundary sanity and area size
-  include MapBoundary
-
   # 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
@@ -18,35 +16,29 @@ class ApiController < ApplicationController
         return
     end
 
-    offset = page * APP_CONFIG['tracepoints_per_page']
+    offset = page * TRACEPOINTS_PER_PAGE
 
     # Figure out the bbox
-    bbox = params['bbox']
-    unless bbox and bbox.count(',') == 3
-      report_error("The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat")
-      return
-    end
-
-    bbox = bbox.split(',')
-    min_lon, min_lat, max_lon, max_lat = sanitise_boundaries(bbox)
     # check boundary is sane and area within defined
     # see /config/application.yml
     begin
-      check_boundaries(min_lon, min_lat, max_lon, max_lat)
+      bbox = BoundingBox.from_bbox_params(params)
+      bbox.check_boundaries
+      bbox.check_size
     rescue Exception => err
       report_error(err.message)
       return
     end
 
     # get all the points
-    points = Tracepoint.find_by_area(min_lat, min_lon, max_lat, max_lon, :offset => offset, :limit => APP_CONFIG['tracepoints_per_page'], :order => "gpx_id DESC, trackid ASC, timestamp ASC" )
+    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/"
+    root['xmlns'] = "http://www.topografix.com/GPX/1/0"
     
     doc.root = root
 
@@ -107,7 +99,7 @@ class ApiController < ApplicationController
       trkseg << point.to_xml_node(timestamps)
     end
 
-    response.headers["Content-Disposition"] = "attachment; filename=\"map.osm\""
+    response.headers["Content-Disposition"] = "attachment; filename=\"tracks.gpx\""
 
     render :text => doc.to_s, :content_type => "text/xml"
   end
@@ -123,36 +115,25 @@ class ApiController < ApplicationController
   # fetched. Finally all the xml is returned.
   def map
     # Figure out the bbox
-    bbox = params['bbox']
-
-    unless bbox and bbox.count(',') == 3
-      # alternatively: report_error(TEXT['boundary_parameter_required']
-      report_error("The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat")
-      return
-    end
-
-    bbox = bbox.split(',')
-
-    min_lon, min_lat, max_lon, max_lat = sanitise_boundaries(bbox)
-
     # check boundary is sane and area within defined
     # see /config/application.yml
     begin
-      check_boundaries(min_lon, min_lat, max_lon, max_lat)
+      bbox = BoundingBox.from_bbox_params(params)
+      bbox.check_boundaries
+      bbox.check_size
     rescue Exception => err
       report_error(err.message)
       return
     end
 
-    # FIXME um why is this area using a different order for the lat/lon from above???
-    @nodes = Node.find_by_area(min_lat, min_lon, max_lat, max_lon, :conditions => {:visible => true}, :include => :node_tags, :limit => APP_CONFIG['max_number_of_nodes']+1)
+    @nodes = Node.bbox(bbox).where(:visible => true).includes(:node_tags).limit(MAX_NUMBER_OF_NODES+1)
     # get all the nodes, by tag not yet working, waiting for change from NickB
     # need to be @nodes (instance var) so tests in /spec can be performed
     #@nodes = Node.search(bbox, params[:tag])
 
     node_ids = @nodes.collect(&:id)
-    if node_ids.length > APP_CONFIG['max_number_of_nodes']
-      report_error("You requested too many nodes (limit is #{APP_CONFIG['max_number_of_nodes']}). Either request a smaller area, or use planet.osm")
+    if node_ids.length > MAX_NUMBER_OF_NODES
+      report_error("You requested too many nodes (limit is #{MAX_NUMBER_OF_NODES}). Either request a smaller area, or use planet.osm")
       return
     end
     if node_ids.length == 0
@@ -163,12 +144,7 @@ class ApiController < ApplicationController
     doc = OSM::API.new.get_xml_doc
 
     # add bounds
-    bounds = XML::Node.new 'bounds'
-    bounds['minlat'] = min_lat.to_s
-    bounds['minlon'] = min_lon.to_s
-    bounds['maxlat'] = max_lat.to_s
-    bounds['maxlon'] = max_lon.to_s
-    doc.root << bounds
+    doc.root << bbox.add_bounds_to(XML::Node.new 'bounds')
 
     # get ways
     # find which ways are needed
@@ -191,7 +167,7 @@ class ApiController < ApplicationController
     nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
 
     if nodes_to_fetch.length > 0
-      @nodes += Node.find(nodes_to_fetch, :include => :node_tags)
+      @nodes += Node.includes(:node_tags).find(nodes_to_fetch)
     end
 
     visible_nodes = {}
@@ -213,15 +189,15 @@ class ApiController < ApplicationController
       end
     end 
 
-    relations = Relation.find_for_nodes(visible_nodes.keys, :conditions => {:visible => true}) +
-                Relation.find_for_ways(way_ids, :conditions => {:visible => true})
+    relations = Relation.nodes(visible_nodes.keys).visible +
+                Relation.ways(way_ids).visible
 
     # we do not normally return the "other" partners referenced by an relation, 
     # e.g. if we return a way A that is referenced by relation X, and there's 
     # another way B also referenced, that is not returned. But we do make 
     # an exception for cases where an relation references another *relation*; 
     # in that case we return that as well (but we don't go recursive here)
-    relations += Relation.find_for_relations(relations.collect { |r| r.id }, :conditions => {:visible => true})
+    relations += Relation.relations(relations.collect { |r| r.id }).visible
 
     # 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.
@@ -252,8 +228,7 @@ class ApiController < ApplicationController
        endtime > starttime and endtime - starttime <= 24.hours
       mask = (1 << zoom) - 1
 
-      tiles = Node.count(:conditions => ["timestamp BETWEEN ? AND ?", starttime, endtime],
-                         :group => "maptile_for_point(latitude, longitude, #{zoom})")
+      tiles = Node.where(:timestamp => starttime .. endtime).group("maptile_for_point(latitude, longitude, #{zoom})").count
 
       doc = OSM::API.new.get_xml_doc
       changes = XML::Node.new 'changes'
@@ -295,19 +270,19 @@ class ApiController < ApplicationController
     version['maximum'] = "#{API_VERSION}";
     api << version
     area = XML::Node.new 'area'
-    area['maximum'] = APP_CONFIG['max_request_area'].to_s;
+    area['maximum'] = MAX_REQUEST_AREA.to_s;
     api << area
     tracepoints = XML::Node.new 'tracepoints'
-    tracepoints['per_page'] = APP_CONFIG['tracepoints_per_page'].to_s
+    tracepoints['per_page'] = TRACEPOINTS_PER_PAGE.to_s
     api << tracepoints
     waynodes = XML::Node.new 'waynodes'
-    waynodes['maximum'] = APP_CONFIG['max_number_of_way_nodes'].to_s
+    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'] = APP_CONFIG['api_timeout'].to_s
+    timeout['seconds'] = API_TIMEOUT.to_s
     api << timeout
     
     doc.root << api