openstreetmap-website/app/controllers/api/tracepoints_controller.rb
Andy Allan 95e5178bfb Refactor tracepoint index to use an xml builder view
This avoids constructing xml by hand in both the controller and
the model, and opens the way for other rendering in future.

The complexity of deciding which point goes where, along with revisiting
previous tracks and tracksegs means that I've broken it down into
two parts - sorting the points into the right trksegs is done first,
before rendering them all as xml. I couldn't find a way to allow
revisiting using the builder.
2021-09-29 15:14:53 +01:00

43 lines
1.5 KiB
Ruby

module Api
class TracepointsController < ApiController
authorize_resource
before_action :check_api_readable
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 index
# 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 * Settings.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 => e
report_error(e.message)
return
end
# get all the points
ordered_points = Tracepoint.bbox(bbox).joins(:trace).where(:gpx_files => { :visibility => %w[trackable identifiable] }).order("gpx_id DESC, trackid ASC, timestamp ASC")
unordered_points = Tracepoint.bbox(bbox).joins(:trace).where(:gpx_files => { :visibility => %w[public private] }).order("gps_points.latitude", "gps_points.longitude", "gps_points.timestamp")
@points = ordered_points.union_all(unordered_points).offset(offset).limit(Settings.tracepoints_per_page).preload(:trace)
response.headers["Content-Disposition"] = "attachment; filename=\"tracks.gpx\""
render :formats => [:gpx]
end
end
end