]> git.openstreetmap.org Git - rails.git/blob - app/controllers/api/changeset_comments_controller.rb
Merge remote-tracking branch 'upstream/pull/2161'
[rails.git] / app / controllers / api / changeset_comments_controller.rb
1 module Api
2   class ChangesetCommentsController < ApplicationController
3     skip_before_action :verify_authenticity_token
4     before_action :authorize
5     before_action :api_deny_access_handler
6
7     authorize_resource
8
9     before_action :require_public_data, :only => [:create]
10     before_action :check_api_writable
11     before_action :check_api_readable, :except => [:create]
12     around_action :api_call_handle_error
13     around_action :api_call_timeout
14
15     ##
16     # Add a comment to a changeset
17     def create
18       # Check the arguments are sane
19       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
20       raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
21
22       # Extract the arguments
23       id = params[:id].to_i
24       body = params[:text]
25
26       # Find the changeset and check it is valid
27       changeset = Changeset.find(id)
28       raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
29
30       # Add a comment to the changeset
31       comment = changeset.comments.create(:changeset => changeset,
32                                           :body => body,
33                                           :author => current_user)
34
35       # Notify current subscribers of the new comment
36       changeset.subscribers.visible.each do |user|
37         Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
38       end
39
40       # Add the commenter to the subscribers if necessary
41       changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
42
43       # Return a copy of the updated changeset
44       render :xml => changeset.to_xml.to_s
45     end
46
47     ##
48     # Sets visible flag on comment to false
49     def destroy
50       # Check the arguments are sane
51       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
52
53       # Extract the arguments
54       id = params[:id].to_i
55
56       # Find the changeset
57       comment = ChangesetComment.find(id)
58
59       # Hide the comment
60       comment.update(:visible => false)
61
62       # Return a copy of the updated changeset
63       render :xml => comment.changeset.to_xml.to_s
64     end
65
66     ##
67     # Sets visible flag on comment to true
68     def restore
69       # Check the arguments are sane
70       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
71
72       # Extract the arguments
73       id = params[:id].to_i
74
75       # Find the changeset
76       comment = ChangesetComment.find(id)
77
78       # Unhide the comment
79       comment.update(:visible => true)
80
81       # Return a copy of the updated changeset
82       render :xml => comment.changeset.to_xml.to_s
83     end
84   end
85 end