X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/8383fd0928a3a431dc58c48d42bf1d19bc43ea34..d887252eeb49f905a979c21f2559c85d9a0455bd:/app/controllers/api/changes_controller.rb diff --git a/app/controllers/api/changes_controller.rb b/app/controllers/api/changes_controller.rb new file mode 100644 index 000000000..c9195e1d9 --- /dev/null +++ b/app/controllers/api/changes_controller.rb @@ -0,0 +1,57 @@ +module Api + class ChangesController < ApplicationController + skip_before_action :verify_authenticity_token + before_action :api_deny_access_handler + + 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