]> git.openstreetmap.org Git - rails.git/commitdiff
Use a builder to render changeset downloads
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 15 Sep 2021 15:33:04 +0000 (16:33 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 15 Sep 2021 15:33:04 +0000 (16:33 +0100)
app/controllers/api/changesets_controller.rb
app/views/api/changesets/download.xml.builder [new file with mode: 0644]
test/controllers/api/changesets_controller_test.rb

index 34627a1187acca98b026da44c4c3ce5ecc0e0428..63fda31bdc297e0e509437da3d6ada61584197bd 100644 (file)
@@ -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 (file)
index 0000000..1e400cd
--- /dev/null
@@ -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
index 8e8f4c1850523aa23ab5f3f9d3490879f0b51bf3..f3de0682b53ad1ca28da38b400f1436f1fb7dd7f 100644 (file)
@@ -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