From 76f1d7bc783228894652f24f0619e8a48d0b3271 Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 15 Sep 2021 16:33:04 +0100 Subject: [PATCH 1/1] Use a builder to render changeset downloads --- app/controllers/api/changesets_controller.rb | 42 +++++++++---------- app/views/api/changesets/download.xml.builder | 19 +++++++++ .../api/changesets_controller_test.rb | 1 - 3 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 app/views/api/changesets/download.xml.builder diff --git a/app/controllers/api/changesets_controller.rb b/app/controllers/api/changesets_controller.rb index 34627a118..63fda31bd 100644 --- a/app/controllers/api/changesets_controller.rb +++ b/app/controllers/api/changesets_controller.rb @@ -11,6 +11,8 @@ module Api 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] @@ -122,35 +124,29 @@ module Api 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 ## diff --git a/app/views/api/changesets/download.xml.builder b/app/views/api/changesets/download.xml.builder new file mode 100644 index 000000000..1e400cd9f --- /dev/null +++ b/app/views/api/changesets/download.xml.builder @@ -0,0 +1,19 @@ +xml.instruct! :xml, :version => "1.0" + +xml.osmChange(OSM::API.new.xml_root_attributes) do |osm| + @created.each do |elt| + osm.create do |create| + create << render(elt) + end + end + @modified.each do |elt| + osm.modify do |modify| + modify << render(elt) + end + end + @deleted.each do |elt| + osm.delete do |delete| + delete << render(elt) + end + end +end diff --git a/test/controllers/api/changesets_controller_test.rb b/test/controllers/api/changesets_controller_test.rb index 8e8f4c185..f3de0682b 100644 --- a/test/controllers/api/changesets_controller_test.rb +++ b/test/controllers/api/changesets_controller_test.rb @@ -1428,7 +1428,6 @@ module Api get changeset_download_path(changeset) assert_response :success - assert_template nil # print @response.body # FIXME: needs more assert_select tests assert_select "osmChange[version='#{Settings.api_version}'][generator='#{Settings.generator}']" do -- 2.39.5