Now that we have all api controllers inheriting from a common base, it's easier to override the deny_access handler without having to switch between both. Fixes #2064
54 lines
1.6 KiB
Ruby
54 lines
1.6 KiB
Ruby
module Api
|
|
class ChangesController < ApiController
|
|
authorize_resource :class => false
|
|
|
|
before_action :check_api_readable
|
|
around_action :api_call_handle_error, :api_call_timeout
|
|
|
|
# Get a list of the tiles that have changed within a specified time
|
|
# period
|
|
def index
|
|
zoom = (params[:zoom] || "12").to_i
|
|
|
|
if params.include?(:start) && params.include?(:end)
|
|
starttime = Time.parse(params[:start])
|
|
endtime = Time.parse(params[:end])
|
|
else
|
|
hours = (params[:hours] || "1").to_i.hours
|
|
endtime = Time.now.getutc
|
|
starttime = endtime - hours
|
|
end
|
|
|
|
if zoom >= 1 && zoom <= 16 &&
|
|
endtime > starttime && endtime - starttime <= 24.hours
|
|
mask = (1 << zoom) - 1
|
|
|
|
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"
|
|
changes["starttime"] = starttime.xmlschema
|
|
changes["endtime"] = endtime.xmlschema
|
|
|
|
tiles.each do |tile, count|
|
|
x = (tile.to_i >> zoom) & mask
|
|
y = tile.to_i & mask
|
|
|
|
t = XML::Node.new "tile"
|
|
t["x"] = x.to_s
|
|
t["y"] = y.to_s
|
|
t["z"] = zoom.to_s
|
|
t["changes"] = count.to_s
|
|
|
|
changes << t
|
|
end
|
|
|
|
doc.root << changes
|
|
|
|
render :xml => doc.to_s
|
|
else
|
|
render :plain => "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours", :status => :bad_request
|
|
end
|
|
end
|
|
end
|
|
end
|