1 # frozen_string_literal: true
4 class ChangesetCommentsController < ApiController
7 before_action :check_api_writable, :except => [:index]
8 before_action :authorize, :except => [:index]
12 before_action :require_public_data, :only => [:create]
14 before_action :set_request_formats
17 # show all comments or search for a subset
19 @comments = ChangesetComment.includes(:author).where(:visible => true).order(:created_at => :desc)
20 @comments = query_conditions_time(@comments)
21 @comments = query_conditions_user(@comments, :author)
22 @comments = query_limit(@comments)
26 # Add a comment to a changeset
28 # Check the arguments are sane
29 raise OSM::APIBadUserInput, "No id was given" unless params[:changeset_id]
30 raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
31 raise OSM::APIRateLimitExceeded if rate_limit_exceeded?
33 # Extract the arguments
34 changeset_id = params[:changeset_id].to_i
37 # Find the changeset and check it is valid
38 changeset = Changeset.find(changeset_id)
39 raise OSM::APIChangesetNotYetClosedError, changeset if changeset.open?
41 # Add a comment to the changeset
42 comment = changeset.comments.create(:changeset => changeset,
44 :author => current_user)
46 # Notify current subscribers of the new comment
47 changeset.subscribers.visible.each do |user|
48 UserMailer.changeset_comment_notification(comment, user).deliver_later if current_user != user
51 # Add the commenter to the subscribers if necessary
52 changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
54 # Return a copy of the updated changeset
55 @changeset = changeset
56 render "api/changesets/show"
58 respond_to do |format|
67 # Check if the current user has exceed the rate limit for comments
68 def rate_limit_exceeded?
69 recent_comments = current_user.changeset_comments.where(:created_at => (Time.now.utc - 1.hour)..).count
71 recent_comments >= current_user.max_changeset_comments_per_hour