Move the trackpoints call into its own controller (and rename to tracepoints)
This commit is contained in:
parent
6a4092bc16
commit
317b8f9d45
6 changed files with 276 additions and 212 deletions
|
@ -4,7 +4,7 @@ class Ability
|
|||
include CanCan::Ability
|
||||
|
||||
def initialize(user)
|
||||
can [:trackpoints, :map, :changes, :permissions], :api
|
||||
can [:map, :changes, :permissions], :api
|
||||
can [:relation, :relation_history, :way, :way_history, :node, :node_history,
|
||||
:changeset, :note, :new_note, :query], :browse
|
||||
can :show, :capability
|
||||
|
@ -22,6 +22,7 @@ class Ability
|
|||
can [:search_all, :search_nodes, :search_ways, :search_relations], :search
|
||||
can [:trackpoints], :swf
|
||||
can [:index, :show, :data, :georss, :picture, :icon], Trace
|
||||
can :index, Tracepoint
|
||||
can [:terms, :api_users, :login, :logout, :new, :create, :save, :confirm, :confirm_resend, :confirm_email, :lost_password, :reset_password, :show, :api_read, :auth_success, :auth_failure], User
|
||||
can [:index, :show, :blocks_on, :blocks_by], UserBlock
|
||||
can [:index, :show], Node
|
||||
|
|
112
app/controllers/api/tracepoints_controller.rb
Normal file
112
app/controllers/api/tracepoints_controller.rb
Normal file
|
@ -0,0 +1,112 @@
|
|||
module Api
|
||||
class TracepointsController < ApplicationController
|
||||
skip_before_action :verify_authenticity_token
|
||||
before_action :api_deny_access_handler
|
||||
|
||||
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 * 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
|
||||
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(TRACEPOINTS_PER_PAGE)
|
||||
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
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 => "/traces", :action => "show", :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
|
||||
end
|
||||
end
|
|
@ -8,107 +8,6 @@ class ApiController < ApplicationController
|
|||
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
|
||||
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(TRACEPOINTS_PER_PAGE)
|
||||
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
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 => "traces", :action => "show", :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
|
||||
|
||||
# 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
|
||||
# bounding box (bbox) is checked to make sure that it is sane. All nodes
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue