X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/eafcf91ceb1b5f293a38455a2025ffda06112b8f..541c24b23d09917dc841c51ea6225c76bc074c0b:/app/controllers/amf_controller.rb diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 0dca302ed..706180557 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -588,6 +588,8 @@ class AmfController < ApplicationController # 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::APITooManyWayNodesError => ex + return [-1, "You have tried to upload a way with #{ex.provided}, however only #{ex.max} are allowed."] rescue OSM::APIAlreadyDeletedError => ex return [-1, "The object has already been deleted"] rescue OSM::APIError => ex @@ -621,13 +623,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 +647,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 +687,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,20 +697,49 @@ 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') + #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) + old_way.unshared_node_ids.each do |node_id| + # delete the node + node = Node.find(node_id) + delete_node = Node.new + delete_node.version = node_id_version[node_id] + node.delete_with_history!(delete_node, user) end - deleteitemrelations(way_id, 'way') - - way.delete_with_relations_and_nodes_and_history(changeset_id.to_i) + # 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 # ==================================================================== # Support functions + # delete a way and its nodes that aren't part of other ways + # this functionality used to be in the model, however it is specific to amf + # controller + #def delete_unshared_nodes(changeset_id, way_id) + # Remove a node or way from all relations # FIXME needs version, changeset, and user def deleteitemrelations(objid, type, version) #:doc: