]> git.openstreetmap.org Git - rails.git/blob - app/controllers/api/messages_controller.rb
Merge pull request #5437 from AntonKhorev/user-status-resource
[rails.git] / app / controllers / api / messages_controller.rb
1 # The MessagesController is the RESTful interface to Message objects
2
3 module Api
4   class MessagesController < ApiController
5     before_action :authorize
6
7     before_action :check_api_writable, :only => [:create, :update, :destroy]
8
9     authorize_resource
10
11     before_action :set_request_formats
12
13     # Dump the details on a message given in params[:id]
14     def show
15       @message = Message.includes(:sender, :recipient).find(params[:id])
16
17       raise OSM::APIAccessDenied if current_user.id != @message.from_user_id && current_user.id != @message.to_user_id
18
19       # Render the result
20       respond_to do |format|
21         format.xml
22         format.json
23       end
24     end
25
26     # Create a new message from current user
27     def create
28       # Check the arguments are sane
29       raise OSM::APIBadUserInput, "No title was given" if params[:title].blank?
30       raise OSM::APIBadUserInput, "No body was given" if params[:body].blank?
31
32       # Extract the arguments
33       if params[:recipient_id]
34         recipient_id = params[:recipient_id].to_i
35         recipient = User.find(recipient_id)
36       elsif params[:recipient]
37         recipient_display_name = params[:recipient]
38         recipient = User.find_by(:display_name => recipient_display_name)
39       else
40         raise OSM::APIBadUserInput, "No recipient was given"
41       end
42
43       raise OSM::APIRateLimitExceeded if current_user.sent_messages.where(:sent_on => Time.now.utc - 1.hour..).count >= current_user.max_messages_per_hour
44
45       @message = Message.new(:sender => current_user,
46                              :recipient => recipient,
47                              :sent_on => Time.now.utc,
48                              :title => params[:title],
49                              :body => params[:body],
50                              :body_format => "markdown")
51       @message.save!
52
53       UserMailer.message_notification(@message).deliver_later if @message.notify_recipient?
54
55       # Return a copy of the new message
56       respond_to do |format|
57         format.xml { render :action => :show }
58         format.json { render :action => :show }
59       end
60     end
61
62     # Update read status of a message
63     def update
64       @message = Message.find(params[:id])
65       read_status_idx = %w[true false].index params[:read_status]
66
67       raise OSM::APIBadUserInput, "Invalid value of `read_status` was given" if read_status_idx.nil?
68       raise OSM::APIAccessDenied unless current_user.id == @message.to_user_id
69
70       @message.message_read = read_status_idx.zero?
71       @message.save!
72
73       # Return a copy of the message
74       respond_to do |format|
75         format.xml { render :action => :show }
76         format.json { render :action => :show }
77       end
78     end
79
80     # Delete message by marking it as not visible for the current user
81     def destroy
82       @message = Message.find(params[:id])
83       if current_user.id == @message.from_user_id
84         @message.from_user_visible = false
85       elsif current_user.id == @message.to_user_id
86         @message.to_user_visible = false
87       else
88         raise OSM::APIAccessDenied
89       end
90
91       @message.save!
92
93       # Return a copy of the message
94       respond_to do |format|
95         format.xml { render :action => :show }
96         format.json { render :action => :show }
97       end
98     end
99   end
100 end