layout "site"
require "xml/libxml"
- skip_before_action :verify_authenticity_token, :except => [:list]
- before_action :authorize_web, :only => [:list, :feed, :comments_feed]
- before_action :set_locale, :only => [:list, :feed, :comments_feed]
- before_action :authorize, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+ skip_before_action :verify_authenticity_token, :except => [:index]
+ before_action :authorize_web, :only => [:index, :feed, :comments_feed]
+ before_action :set_locale, :only => [:index, :feed, :comments_feed]
+ before_action :authorize, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
before_action :require_moderator, :only => [:hide_comment, :unhide_comment]
- before_action :require_allow_write_api, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
- before_action :require_public_data, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe]
- before_action :check_api_writable, :only => [:create, :update, :delete, :upload, :include, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
- before_action :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
- before_action(:only => [:list, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
- around_action :api_call_handle_error, :except => [:list, :feed, :comments_feed]
- around_action :api_call_timeout, :except => [:list, :feed, :comments_feed, :upload]
- around_action :web_timeout, :only => [:list, :feed, :comments_feed]
+ before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+ before_action :require_public_data, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe]
+ before_action :check_api_writable, :only => [:create, :update, :upload, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+ before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
+ before_action(:only => [:index, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
+ around_action :api_call_handle_error, :except => [:index, :feed, :comments_feed]
+ around_action :api_call_timeout, :except => [:index, :feed, :comments_feed, :upload]
+ around_action :web_timeout, :only => [:index, :feed, :comments_feed]
# Helper methods for checking consistency
include ConsistencyValidations
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_id = @user.id
+ cs.user = current_user
cs.save_with_tags!
# Subscribe user to changeset comments
- cs.subscribers << @user
+ cs.subscribers << current_user
render :plain => cs.id.to_s
end
assert_method :put
changeset = Changeset.find(params[:id])
- check_changeset_consistency(changeset, @user)
+ 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,
changeset.set_closed_time_now
changeset.save!
- render :nothing => true
+ head :ok
end
##
assert_method :post
cs = Changeset.find(params[:id])
- check_changeset_consistency(cs, @user)
+ check_changeset_consistency(cs, current_user)
# keep an array of lons and lats
lon = []
assert_method :post
changeset = Changeset.find(params[:id])
- check_changeset_consistency(changeset, @user)
+ check_changeset_consistency(changeset, current_user)
diff_reader = DiffReader.new(request.raw_post, changeset)
Changeset.transaction do
changesets = conditions_closed(changesets, params["closed"])
changesets = conditions_ids(changesets, params["changesets"])
+ # sort and limit the changesets
+ changesets = changesets.order("created_at DESC").limit(100)
+
+ # preload users, tags and comments
+ changesets = changesets.preload(:user, :changeset_tags, :comments)
+
# create the results document
results = OSM::API.new.get_xml_doc
changeset = Changeset.find(params[:id])
new_changeset = Changeset.from_xml(request.raw_post)
- check_changeset_consistency(changeset, @user)
- changeset.update_from(new_changeset, @user)
- render :xml => changeset.to_xml
+ check_changeset_consistency(changeset, current_user)
+ changeset.update_from(new_changeset, current_user)
+ render :xml => changeset.to_xml.to_s
end
##
# list non-empty changesets in reverse chronological order
- def list
- if request.format == :atom && params[:max_id]
- redirect_to url_for(params.merge(:max_id => nil)), :status => :moved_permanently
+ def index
+ @params = params.permit(:display_name, :bbox, :friends, :nearby, :max_id, :list)
+
+ if request.format == :atom && @params[:max_id]
+ redirect_to url_for(@params.merge(:max_id => nil)), :status => :moved_permanently
return
end
- if params[:display_name]
- user = User.find_by(:display_name => params[:display_name])
+ if @params[:display_name]
+ user = User.find_by(:display_name => @params[:display_name])
if !user || !user.active?
- render_unknown_user params[:display_name]
+ render_unknown_user @params[:display_name]
return
end
end
- if (params[:friends] || params[:nearby]) && !@user
+ if (@params[:friends] || @params[:nearby]) && !current_user
require_user
return
end
- if request.format == :html && !params[:list]
+ if request.format == :html && !@params[:list]
require_oauth
render :action => :history, :layout => map_layout
else
changesets = conditions_nonempty(Changeset.all)
- if params[:display_name]
- changesets = if user.data_public? || user == @user
+ if @params[:display_name]
+ changesets = if user.data_public? || user == current_user
changesets.where(:user_id => user.id)
else
changesets.where("false")
end
- elsif params[:bbox]
+ elsif @params[:bbox]
changesets = conditions_bbox(changesets, BoundingBox.from_bbox_params(params))
- elsif params[:friends] && @user
- changesets = changesets.where(:user_id => @user.friend_users.identifiable)
- elsif params[:nearby] && @user
- changesets = changesets.where(:user_id => @user.nearby)
+ elsif @params[:friends] && current_user
+ changesets = changesets.where(:user_id => current_user.friend_users.identifiable)
+ elsif @params[:nearby] && current_user
+ changesets = changesets.where(:user_id => current_user.nearby)
end
- if params[:max_id]
- changesets = changesets.where("changesets.id <= ?", params[:max_id])
- end
+ changesets = changesets.where("changesets.id <= ?", @params[:max_id]) if @params[:max_id]
@edits = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments)
- render :action => :list, :layout => false
+ render :action => :index, :layout => false
end
end
##
# list edits as an atom feed
def feed
- list
+ index
end
##
# Add a comment to a changeset
def comment
# Check the arguments are sane
- raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
- raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
+ raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+ raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
# Extract the arguments
id = params[:id].to_i
# Find the changeset and check it is valid
changeset = Changeset.find(id)
- raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+ raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
# Add a comment to the changeset
comment = changeset.comments.create(:changeset => changeset,
:body => body,
- :author => @user)
+ :author => current_user)
# Notify current subscribers of the new comment
changeset.subscribers.visible.each do |user|
- if @user != user
- Notifier.changeset_comment_notification(comment, user).deliver_now
- end
+ Notifier.changeset_comment_notification(comment, user).deliver_now if current_user != user
end
# Add the commenter to the subscribers if necessary
- changeset.subscribers << @user unless changeset.subscribers.exists?(@user.id)
+ changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
# Return a copy of the updated changeset
render :xml => changeset.to_xml.to_s
# Adds a subscriber to the changeset
def subscribe
# Check the arguments are sane
- raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+ 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::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
- raise OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user.id)
+ raise OSM::APIChangesetAlreadySubscribedError, changeset if changeset.subscribers.exists?(current_user.id)
# Add the subscriber
- changeset.subscribers << @user
+ changeset.subscribers << current_user
# Return a copy of the updated changeset
render :xml => changeset.to_xml.to_s
# Removes a subscriber from the changeset
def unsubscribe
# Check the arguments are sane
- raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+ 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::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
- raise OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user.id)
+ raise OSM::APIChangesetNotSubscribedError, changeset unless changeset.subscribers.exists?(current_user.id)
# Remove the subscriber
- changeset.subscribers.delete(@user)
+ changeset.subscribers.delete(current_user)
# Return a copy of the updated changeset
render :xml => changeset.to_xml.to_s
# Sets visible flag on comment to false
def hide_comment
# Check the arguments are sane
- raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+ raise OSM::APIBadUserInput, "No id was given" unless params[:id]
# Extract the arguments
id = params[:id].to_i
# Sets visible flag on comment to true
def unhide_comment
# Check the arguments are sane
- raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+ raise OSM::APIBadUserInput, "No id was given" unless params[:id]
# Extract the arguments
id = params[:id].to_i
@comments = changeset.comments.includes(:author, :changeset).limit(comments_limit)
else
# Return comments
- @comments = ChangesetComment.includes(:author, :changeset).where(:visible => :true).order("created_at DESC").limit(comments_limit).preload(:changeset)
+ @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset)
end
# Render the result
changesets
else
# shouldn't provide both name and UID
- raise OSM::APIBadUserInput.new("provide either the user ID or display name, but not both") if user && name
+ raise OSM::APIBadUserInput, "provide either the user ID or display name, but not both" if user && name
# use either the name or the UID to find the user which we're selecting on.
u = if name.nil?
# user input checking, we don't have any UIDs < 1
- raise OSM::APIBadUserInput.new("invalid user ID") if user.to_i < 1
+ raise OSM::APIBadUserInput, "invalid user ID" if user.to_i < 1
u = User.find(user.to_i)
else
u = User.find_by(:display_name => name)
end
# make sure we found a user
- raise OSM::APINotFoundError.new if u.nil?
+ raise OSM::APINotFoundError if u.nil?
# should be able to get changesets of public users only, or
# our own changesets regardless of public-ness.
# changesets if they're non-public
setup_user_auth
- raise OSM::APINotFoundError if @user.nil? || @user.id != u.id
+ raise OSM::APINotFoundError if current_user.nil? || current_user != u
end
changesets.where(:user_id => u.id)
# restrict changes to those closed during a particular time period
def conditions_time(changesets, time)
if time.nil?
- return changesets
+ changesets
elsif time.count(",") == 1
# if there is a range, i.e: comma separated, then the first is
# low, second is high - same as with bounding boxes.
# check that we actually have 2 elements in the array
times = time.split(/,/)
- raise OSM::APIBadUserInput.new("bad time range") if times.size != 2
+ raise OSM::APIBadUserInput, "bad time range" if times.size != 2
- from, to = times.collect { |t| DateTime.parse(t) }
- return changesets.where("closed_at >= ? and created_at <= ?", from, to)
+ from, to = times.collect { |t| Time.parse(t) }
+ changesets.where("closed_at >= ? and created_at <= ?", from, to)
else
# if there is no comma, assume its a lower limit on time
- return changesets.where("closed_at >= ?", DateTime.parse(time))
+ changesets.where("closed_at >= ?", Time.parse(time))
end
- # stupid DateTime seems to throw both of these for bad parsing, so
+ # stupid Time seems to throw both of these for bad parsing, so
# we have to catch both and ensure the correct code path is taken.
rescue ArgumentError => ex
- raise OSM::APIBadUserInput.new(ex.message.to_s)
+ raise OSM::APIBadUserInput, ex.message.to_s
rescue RuntimeError => ex
- raise OSM::APIBadUserInput.new(ex.message.to_s)
+ raise OSM::APIBadUserInput, ex.message.to_s
end
##
if ids.nil?
changesets
elsif ids.empty?
- raise OSM::APIBadUserInput.new("No changesets were given to search for")
+ raise OSM::APIBadUserInput, "No changesets were given to search for"
else
ids = ids.split(",").collect(&:to_i)
changesets.where(:id => ids)
if params[:limit].to_i > 0 && params[:limit].to_i <= 10000
params[:limit].to_i
else
- raise OSM::APIBadUserInput.new("Comments limit must be between 1 and 10000")
+ raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000"
end
else
100