- skip_before_action :verify_authenticity_token, :except => [:index]
- before_action :authorize_web, :only => [:index, :feed]
- before_action :set_locale, :only => [:index, :feed]
- before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
- before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
- 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, :index, :feed, :subscribe, :unsubscribe]
- before_action(:only => [:index, :feed]) { |c| c.check_database_readable(true) }
- around_action :api_call_handle_error, :except => [:index, :feed]
- around_action :api_call_timeout, :except => [:index, :feed, :upload]
- around_action :web_timeout, :only => [:index, :feed]
-
- # Helper methods for checking consistency
- include ConsistencyValidations
-
- # Create a changeset from XML.
- def create
- assert_method :put
-
- cs = Changeset.from_xml(request.raw_post, true)
-
- # Assume that Changeset.from_xml has thrown an exception if there is an error parsing the xml
- cs.user = current_user
- cs.save_with_tags!
-
- # Subscribe user to changeset comments
- cs.subscribers << current_user
-
- render :plain => cs.id.to_s
- end
-
- ##
- # Return XML giving the basic info about the changeset. Does not
- # return anything about the nodes, ways and relations in the changeset.
- def read
- changeset = Changeset.find(params[:id])
-
- render :xml => changeset.to_xml(params[:include_discussion].presence).to_s
- end
-
- ##
- # marks a changeset as closed. this may be called multiple times
- # on the same changeset, so is idempotent.
- def close
- assert_method :put
-
- changeset = Changeset.find(params[:id])
- check_changeset_consistency(changeset, current_user)
-
- # to close the changeset, we'll just set its closed_at time to
- # now. this might not be enough if there are concurrency issues,
- # but we'll have to wait and see.
- changeset.set_closed_time_now
-
- changeset.save!
- head :ok
- end
-
- ##
- # insert a (set of) points into a changeset bounding box. this can only
- # increase the size of the bounding box. this is a hint that clients can
- # set either before uploading a large number of changes, or changes that
- # the client (but not the server) knows will affect areas further away.
- def expand_bbox
- # only allow POST requests, because although this method is
- # idempotent, there is no "document" to PUT really...
- assert_method :post
-
- cs = Changeset.find(params[:id])
- check_changeset_consistency(cs, current_user)
-
- # keep an array of lons and lats
- lon = []
- lat = []
-
- # the request is in pseudo-osm format... this is kind-of an
- # abuse, maybe should change to some other format?
- doc = XML::Parser.string(request.raw_post, :options => XML::Parser::Options::NOERROR).parse
- doc.find("//osm/node").each do |n|
- lon << n["lon"].to_f * GeoRecord::SCALE
- lat << n["lat"].to_f * GeoRecord::SCALE
- end
-
- # add the existing bounding box to the lon-lat array
- lon << cs.min_lon unless cs.min_lon.nil?
- lat << cs.min_lat unless cs.min_lat.nil?
- lon << cs.max_lon unless cs.max_lon.nil?
- lat << cs.max_lat unless cs.max_lat.nil?
-
- # collapse the arrays to minimum and maximum
- cs.min_lon = lon.min
- cs.min_lat = lat.min
- cs.max_lon = lon.max
- cs.max_lat = lat.max
-
- # save the larger bounding box and return the changeset, which
- # will include the bigger bounding box.
- cs.save!
- render :xml => cs.to_xml.to_s
- end
-
- ##
- # Upload a diff in a single transaction.
- #
- # This means that each change within the diff must succeed, i.e: that
- # each version number mentioned is still current. Otherwise the entire
- # transaction *must* be rolled back.
- #
- # Furthermore, each element in the diff can only reference the current
- # changeset.
- #
- # Returns: a diffResult document, as described in
- # http://wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6
- def upload
- # only allow POST requests, as the upload method is most definitely
- # not idempotent, as several uploads with placeholder IDs will have
- # different side-effects.
- # see http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2
- assert_method :post
-
- changeset = Changeset.find(params[:id])
- check_changeset_consistency(changeset, current_user)