class ChangesetsController < ApiController
include QueryMethods
- before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
+ before_action :check_api_writable, :only => [:create, :update, :upload]
before_action :setup_user_auth, :only => [:show]
- before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+ before_action :authorize, :only => [:create, :update, :upload, :close]
authorize_resource
- before_action :require_public_data, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+ before_action :require_public_data, :only => [:create, :update, :upload, :close]
before_action :set_request_formats, :except => [:create, :close, :upload]
skip_around_action :api_call_timeout, :only => [:upload]
@changeset = Changeset.find(params[:id])
if params[:include_discussion].presence
@comments = @changeset.comments
- @comments = @comments.unscope(:where => :visible) if params[:show_hidden_comments].presence && can?(:restore, ChangesetComment)
+ @comments = @comments.unscope(:where => :visible) if params[:show_hidden_comments].presence && can?(:create, :changeset_comment_visibility)
@comments = @comments.includes(:author)
end
cs.save_with_tags!
# Subscribe user to changeset comments
- cs.subscribe(current_user)
+ cs.subscribers << current_user
render :plain => cs.id.to_s
end
end
end
- ##
- # download the changeset as an osmChange document.
- #
- # to make it easier to revert diffs it would be better if the osmChange
- # format were reversible, i.e: contained both old and new versions of
- # modified elements. but it doesn't at the moment...
- #
- # this method cannot order the database changes fully (i.e: timestamp and
- # version number may be too coarse) so the resulting diff may not apply
- # to a different database. however since changesets are not atomic this
- # behaviour cannot be guaranteed anyway and is the result of a design
- # choice.
- def download
- changeset = Changeset.find(params[:id])
-
- # get all the elements in the changeset which haven't been redacted
- # and stick them in a big array.
- elements = [changeset.old_nodes.unredacted,
- changeset.old_ways.unredacted,
- changeset.old_relations.unredacted].flatten
-
- # sort the elements by timestamp and version number, as this is the
- # almost sensible ordering available. this would be much nicer if
- # global (SVN-style) versioning were used - then that would be
- # unambiguous.
- elements.sort_by! { |e| [e.timestamp, e.version] }
-
- # generate an output element for each operation. note: we avoid looking
- # at the history because it is simpler - but it would be more correct to
- # check these assertions.
- @created = []
- @modified = []
- @deleted = []
-
- elements.each do |elt|
- if elt.version == 1
- # first version, so it must be newly-created.
- @created << elt
- elsif elt.visible
- # must be a modify
- @modified << elt
- else
- # if the element isn't visible then it must have been deleted
- @deleted << elt
- end
- end
-
- respond_to do |format|
- format.xml
- end
- end
-
##
# updates a changeset's tags. none of the changeset's attributes are
# user-modifiable, so they will be ignored.
end
end
- ##
- # Adds a subscriber to the changeset
- def subscribe
- # Check the arguments are sane
- raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
- # Extract the arguments
- id = params[:id].to_i
-
- # Find the changeset and check it is valid
- changeset = Changeset.find(id)
- raise OSM::APIChangesetAlreadySubscribedError, changeset if changeset.subscribed?(current_user)
-
- # Add the subscriber
- changeset.subscribe(current_user)
-
- # Return a copy of the updated changeset
- @changeset = changeset
- render "show"
-
- respond_to do |format|
- format.xml
- format.json
- end
- end
-
- ##
- # Removes a subscriber from the changeset
- def unsubscribe
- # Check the arguments are sane
- raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
- # Extract the arguments
- id = params[:id].to_i
-
- # Find the changeset and check it is valid
- changeset = Changeset.find(id)
- raise OSM::APIChangesetNotSubscribedError, changeset unless changeset.subscribed?(current_user)
-
- # Remove the subscriber
- changeset.unsubscribe(current_user)
-
- # Return a copy of the updated changeset
- @changeset = changeset
- render "show"
-
- respond_to do |format|
- format.xml
- format.json
- end
- end
-
private
#------------------------------------------------------------