module Api
class ChangesetsController < ApiController
- layout "site"
require "xml/libxml"
before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
before_action :require_public_data, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :subscribe, :unsubscribe]
+ before_action :set_request_formats, :only => [:download]
+
around_action :api_call_handle_error
around_action :api_call_timeout, :except => [:upload]
def create
assert_method :put
- cs = Changeset.from_xml(request.raw_post, true)
+ cs = Changeset.from_xml(request.raw_post, :create => true)
# Assume that Changeset.from_xml has thrown an exception if there is an error parsing the xml
cs.user = current_user
end
end
- # create changeset and user caches
- changeset_cache = {}
- user_display_name_cache = {}
-
- # create an osmChange document for the output
- result = OSM::API.new.get_xml_doc
- result.root.name = "osmChange"
-
# generate an output element for each operation. note: we avoid looking
# at the history because it is simpler - but it would be more correct to
# check these assertions.
+ @created = []
+ @modified = []
+ @deleted = []
+
elements.each do |elt|
- result.root <<
- if elt.version == 1
- # first version, so it must be newly-created.
- created = XML::Node.new "create"
- created << elt.to_xml_node(changeset_cache, user_display_name_cache)
- elsif elt.visible
- # must be a modify
- modified = XML::Node.new "modify"
- modified << elt.to_xml_node(changeset_cache, user_display_name_cache)
- else
- # if the element isn't visible then it must have been deleted
- deleted = XML::Node.new "delete"
- deleted << elt.to_xml_node(changeset_cache, user_display_name_cache)
- end
+ if elt.version == 1
+ # first version, so it must be newly-created.
+ @created << elt
+ elsif elt.visible
+ # must be a modify
+ @modified << elt
+ else
+ # if the element isn't visible then it must have been deleted
+ @deleted << elt
+ end
end
- render :xml => result.to_s
+ respond_to do |format|
+ format.xml
+ end
end
##
# low, second is high - same as with bounding boxes.
# check that we actually have 2 elements in the array
- times = time.split(/,/)
+ times = time.split(",")
raise OSM::APIBadUserInput, "bad time range" if times.size != 2
from, to = times.collect { |t| Time.parse(t) }
end
# stupid Time seems to throw both of these for bad parsing, so
# we have to catch both and ensure the correct code path is taken.
- rescue ArgumentError => e
- raise OSM::APIBadUserInput, e.message.to_s
- rescue RuntimeError => e
+ rescue ArgumentError, RuntimeError => e
raise OSM::APIBadUserInput, e.message.to_s
end