]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/changeset_controller.rb
api06: Fix diff uploading (still doesn't give a useful response):
[rails.git] / app / controllers / changeset_controller.rb
index 19d1591a0405d1ce731969db5a4e0ca4b302862f..585821a558bd0f353faf3b73ed904aa1434810a0 100644 (file)
@@ -35,17 +35,15 @@ class ChangesetController < ApplicationController
   end
 
   def fix_way(w, node_ids)
-    w.nds.each { |nd|
-      new_id = node_ids[nd.node_id]
-      nd.node_id = new_id unless new_id.nil?
-    }
+    w.nds = w.instance_eval { @nds }.
+      map { |nd| node_ids[nd] || nd }
+    return w
   end
 
   def fix_rel(r, ids)
-    r.members.each { |memb|
-      new_id = ids[memb.member_type][memb.member_id]
-      nd.member_id = new_id unless new_id.nil?
-    }
+    r.members = r.instance_eval { @members }.
+      map { |memb| [memb[0], ids[memb[0]][memb[1].to_i] || memb[1], memb[2]] }
+    return r
   end
 
   def upload
@@ -69,43 +67,38 @@ class ChangesetController < ApplicationController
       end
       doc.find('//osm/create/way').each do |nd|
        way = Way.from_xml_node(nd, true)
+       fix_way(way, node_ids)
        raise OSM::APIPreconditionFailedError.new if !way.preconditions_ok?
-       create_prim way_ids, fix_way(way, node_ids), nd
+       create_prim way_ids, way, nd
       end
       doc.find('//osm/create/relation').each do |nd|
        relation = Relation.from_xml_node(nd, true)
-       raise OSM::APIPreconditionFailedError.new if !way.preconditions_ok?
-       create_prim relation_ids, fix_rel(relation, ids), nd
+       fix_rel(relation, ids)
+       raise OSM::APIPreconditionFailedError.new if !relation.preconditions_ok?
+       create_prim rel_ids, relation, nd
       end
 
-      doc.find('//osm/modify/node').each do |nd|
-       unless NodeController.update_internal nil, Node.from_xml_node(nd)
-         raise OSM::APIPreconditionFailedError.new
-       end
+      doc.find('//osm/modify/relation').each do |nd|
+       new_relation = Relation.from_xml_node(nd)
+       Relation.find(new_relation.id).update_from new_relation, @user
       end
       doc.find('//osm/modify/way').each do |nd|
-       unless WayController.update_internal nil, fix_way(Way.from_xml_node(nd), node_ids)
-         raise OSM::APIPreconditionFailedError.new
-       end
+       new_way = Way.from_xml_node(nd)
+       Way.find(new_way.id).update_from new_way, @user
       end
-      doc.find('//osm/modify/relation').each do |nd|
-       unless RelationController.update_internal nil, fix_rel(Relation.from_xml_node(nd), ids)
-         raise OSM::APIPreconditionFailedError.new
-       end
+      doc.find('//osm/modify/node').each do |nd|
+       new_node = Node.from_xml_node(nd)
+       Node.find(new_node.id).update_from new_node, @user
       end
 
-      doc.find('//osm/delete/node').each do |nd|
-       unless NodeController.delete_internal nil, Node.from_xml_node(n)
-         raise OSM::APIPreconditionFailedError.new
-       end
+      doc.find('//osm/delete/relation').each do |nd|
+       Relation.find(nd['id']).delete_with_history(@user)
       end
       doc.find('//osm/delete/way').each do |nd|
-       Way.from_xml_node(nd).delete_with_relations_and_history(@user)
+       Way.find(nd['id']).delete_with_relations_and_history(@user)
       end
-      doc.find('//osm/delete/relation').each do |nd|
-       unless RelationController.delete_internal nil, fix_rel(Relation.from_xml_node(nd), ids)
-         raise OSM::APIPreconditionFailedError.new
-       end
+      doc.find('//osm/delete/node').each do |nd|
+       Node.find(nd['id']).delete_with_history(@user)
       end
     end