+ # The base class for API Errors.
+ class APIError < RuntimeError
+ def render_opts
+ { :text => "", :status => :internal_server_error }
+ end
+ end
+
+ # Raised when an API object is not found.
+ class APINotFoundError < APIError
+ end
+
+ # Raised when a precondition to an API action fails sanity check.
+ class APIPreconditionFailedError < APIError
+ def render_opts
+ { :text => "", :status => :precondition_failed }
+ end
+ end
+
+ # Raised when to delete an already-deleted object.
+ class APIAlreadyDeletedError < APIError
+ def render_opts
+ { :text => "", :status => :gone }
+ end
+ end
+
+ # Raised when the user logged in isn't the same as the changeset
+ class APIUserChangesetMismatchError < APIError
+ def render_opts
+ { :text => "The user doesn't own that changeset", :status => :conflict }
+ end
+ end
+
+ # Raised when the changeset provided is already closed
+ class APIChangesetAlreadyClosedError < APIError
+ def render_opts
+ { :text => "The supplied changeset has already been closed", :status => :conflict }
+ end
+ end
+
+ # Raised when a change is expecting a changeset, but the changeset doesn't exist
+ class APIChangesetMissingError < APIError
+ def render_opts
+ { :text => "You need to supply a changeset to be able to make a change", :status => :conflict }
+ end
+ end
+
+ # Raised when the provided version is not equal to the latest in the db.
+ class APIVersionMismatchError < APIError
+ def initialize(provided, latest)
+ @provided, @latest = provided, latest
+ end
+
+ attr_reader :provided, :latest
+
+ def render_opts
+ { :text => "Version mismatch: Provided " + provided.to_s +
+ ", server had: " + latest.to_s, :status => :conflict }
+ end
+ end
+
+ # Helper methods for going to/from mercator and lat/lng.