From: Shaun McDonald Date: Thu, 11 Dec 2008 17:22:15 +0000 (+0000) Subject: Making amf controller act more like the xml apis X-Git-Tag: live~7557^2~102 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/b051dd11afd42e2ae6fc8ec99982ddfc26788fe8 Making amf controller act more like the xml apis --- diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 14ad2147a..d040a51bb 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -621,13 +621,11 @@ class AmfController < ApplicationController # We always need a new node, based on the data that has been sent to us new_node = Node.new - new_node.id = id new_node.changeset_id = changeset new_node.version = version new_node.lat = lat new_node.lon = lon new_node.tags = tags - new_node.visible = visible if id <= 0 # We're creating the node new_node.create_with_history(user) @@ -647,7 +645,7 @@ class AmfController < ApplicationController rescue OSM::APIChangesetAlreadyClosedError => ex return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}"] rescue OSM::APIVersionMismatchError => ex - # Really need to check to see whether this is a server load issue, and the + # Really need to check to see whether this is a server load issue, and the # last version was in the same changeset, or belongs to the same user, then # we can return something different return [-3, "You have taken too long to edit, please reload the area"] @@ -687,9 +685,9 @@ class AmfController < ApplicationController # of the nodes have been changed by someone else then, there is a problem! # Returns 0 (success), unchanged way id. - def deleteway(usertoken, changeset_id, way_id, version_id, node_id_version) #:doc: + def deleteway(usertoken, changeset_id, way_id, way_version, node_id_version) #:doc: user = getuser(usertoken) - if user then return -1,"You are not logged in, so the way could not be deleted." end + unless user then return -1,"You are not logged in, so the way could not be deleted." end # Need a transaction so that if one item fails to delete, the whole delete fails. Way.transaction do way_id = way_id.to_i @@ -697,24 +695,38 @@ class AmfController < ApplicationController # FIXME: would be good not to make two history entries when removing # two nodes from the same relation old_way = Way.find(way_id) - old_way.unshared_node_ids.each do |n| - deleteitemrelations(n, 'node') - end - deleteitemrelations(way_id, 'way') + #old_way.unshared_node_ids.each do |n| + # deleteitemrelations(n, 'node') + #end + #deleteitemrelations(way_id, 'way') #way.delete_with_relations_and_nodes_and_history(changeset_id.to_i) - way.unshared_node_ids.each do |node_id| + old_way.unshared_node_ids.each do |node_id| # delete the node node = Node.find(node_id) delete_node = Node.new - delete_node.id = node_id delete_node.version = node_id_version[node_id] node.delete_with_history!(delete_node, user) end # delete the way + delete_way = Way.new + delete_way.version = way_version + old_way.delete_with_history!(delete_way, user) end [0, way_id] + rescue OSM::APIChangesetAlreadyClosedError => ex + return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}"] + rescue OSM::APIVersionMismatchError => ex + # Really need to check to see whether this is a server load issue, and the + # last version was in the same changeset, or belongs to the same user, then + # we can return something different + return [-3, "You have taken too long to edit, please reload the area"] + rescue OSM::APIAlreadyDeletedError => ex + return [-1, "The object has already been deleted"] + rescue OSM::APIError => ex + # Some error that we don't specifically catch + return [-2, "Something really bad happened :-()"] end diff --git a/app/models/way.rb b/app/models/way.rb index 92b69ed7d..86b25e08e 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -228,7 +228,7 @@ class Way < ActiveRecord::Base self.nds.each do |n| node = Node.find(:first, :conditions => ["id = ?", n]) unless node and node.visible - return false + raise OSM::APIPreconditionFailedError.new("The node with id #{n} either does not exist, or is not visible") end end return true @@ -257,30 +257,6 @@ class Way < ActiveRecord::Base end end - # delete a way and its nodes that aren't part of other ways, with history - - # FIXME: merge the potlatch code to delete the relations - # and refactor to use delete_with_history! - # This really needs the ids and versions of the nodes/relations to be passed in too - # so that we can do the version checking before the delete - def delete_with_relations_and_nodes_and_history(changeset_id) - # delete the nodes not used by other ways - self.unshared_node_ids.each do |node_id| - n = Node.find(node_id) - n.changeset_id = changeset_id - n.visible = false - # FIXME next line is bad - n.save_with_history! - end - - self.changeset_id = changeset_id - self.tags = [] - self.nds = [] - self.visible = false - # FIXME next line is bad - self.save_with_history! - end - # Find nodes that belong to this way only def unshared_node_ids node_ids = self.nodes.collect { |node| node.id }