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