]> git.openstreetmap.org Git - rails.git/blob - app/controllers/api/changeset_comments_controller.rb
Merge remote-tracking branch 'upstream/pull/5248'
[rails.git] / app / controllers / api / changeset_comments_controller.rb
1 module Api
2   class ChangesetCommentsController < ApiController
3     before_action :check_api_writable
4     before_action :authorize
5
6     authorize_resource
7
8     before_action :require_public_data, :only => [:create]
9
10     before_action :set_request_formats
11
12     ##
13     # Add a comment to a changeset
14     def create
15       # Check the arguments are sane
16       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
17       raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
18       raise OSM::APIRateLimitExceeded if rate_limit_exceeded?
19
20       # Extract the arguments
21       id = params[:id].to_i
22       body = params[:text]
23
24       # Find the changeset and check it is valid
25       changeset = Changeset.find(id)
26       raise OSM::APIChangesetNotYetClosedError, changeset if changeset.open?
27
28       # Add a comment to the changeset
29       comment = changeset.comments.create(:changeset => changeset,
30                                           :body => body,
31                                           :author => current_user)
32
33       # Notify current subscribers of the new comment
34       changeset.subscribers.visible.each do |user|
35         UserMailer.changeset_comment_notification(comment, user).deliver_later if current_user != user
36       end
37
38       # Add the commenter to the subscribers if necessary
39       changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
40
41       # Return a copy of the updated changeset
42       @changeset = changeset
43       render "api/changesets/show"
44
45       respond_to do |format|
46         format.xml
47         format.json
48       end
49     end
50
51     ##
52     # Sets visible flag on comment to false
53     def destroy
54       # Check the arguments are sane
55       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
56
57       # Extract the arguments
58       id = params[:id].to_i
59
60       # Find the changeset
61       comment = ChangesetComment.find(id)
62
63       # Hide the comment
64       comment.update(:visible => false)
65
66       # Return a copy of the updated changeset
67       @changeset = comment.changeset
68       render "api/changesets/show"
69
70       respond_to do |format|
71         format.xml
72         format.json
73       end
74     end
75
76     ##
77     # Sets visible flag on comment to true
78     def restore
79       # Check the arguments are sane
80       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
81
82       # Extract the arguments
83       id = params[:id].to_i
84
85       # Find the changeset
86       comment = ChangesetComment.find(id)
87
88       # Unhide the comment
89       comment.update(:visible => true)
90
91       # Return a copy of the updated changeset
92       @changeset = comment.changeset
93       render "api/changesets/show"
94
95       respond_to do |format|
96         format.xml
97         format.json
98       end
99     end
100
101     private
102
103     ##
104     # Check if the current user has exceed the rate limit for comments
105     def rate_limit_exceeded?
106       recent_comments = current_user.changeset_comments.where(:created_at => Time.now.utc - 1.hour..).count
107
108       recent_comments >= current_user.max_changeset_comments_per_hour
109     end
110   end
111 end