Handle change from @to_user to @this_user for new message action
[rails.git] / app / controllers / message_controller.rb
1 class MessageController < ApplicationController
2   layout 'site'
3
4   before_filter :authorize_web
5   before_filter :set_locale
6   before_filter :require_user
7   before_filter :lookup_this_user, :only => [:new]
8   before_filter :check_database_readable
9   before_filter :check_database_writable, :only => [:new, :reply, :mark]
10
11   # Allow the user to write a new message to another user. This action also 
12   # deals with the sending of that message to the other user when the user
13   # clicks send.
14   # The display_name param is the display name of the user that the message is being sent to.
15   def new
16     if params[:message]
17       if @user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR
18         flash[:error] = t 'message.new.limit_exceeded'
19       else
20         @message = Message.new(params[:message])
21         @message.to_user_id = @this_user.id
22         @message.from_user_id = @user.id
23         @message.sent_on = Time.now.getutc
24
25         if @message.save
26           flash[:notice] = t 'message.new.message_sent'
27           Notifier.message_notification(@message).deliver
28           redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
29         end
30       end
31     else
32       if params[:title]
33         # ?title= is set when someone reponds to this user's diary
34         # entry. Then we pre-fill out the subject and the <title>
35         @title = @subject = params[:title]
36       else
37         # The default /message/new/$user view
38         @title = t 'message.new.title'
39       end
40     end
41   end
42
43   # Allow the user to reply to another message.
44   def reply
45     message = Message.find(params[:message_id])
46
47     if message.to_user_id == @user.id then
48       @body = "On #{message.sent_on} #{message.sender.display_name} wrote:\n\n#{message.body.gsub(/^/, '> ')}" 
49       @title = @subject = "Re: #{message.title.sub(/^Re:\s*/, '')}"
50       @this_user = User.find(message.from_user_id)
51
52       render :action => 'new'
53     else
54       flash[:notice] = t 'message.reply.wrong_user', :user => @user.display_name
55       redirect_to :controller => "user", :action => "login", :referer => request.fullpath
56     end
57   rescue ActiveRecord::RecordNotFound
58     @title = t'message.no_such_message.title'
59     render :action => 'no_such_message', :status => :not_found
60   end
61
62   # Show a message
63   def read
64     @title = t 'message.read.title'
65     @message = Message.find(params[:message_id])
66
67     if @message.to_user_id == @user.id or @message.from_user_id == @user.id then
68       @message.message_read = true if @message.to_user_id == @user.id
69       @message.save
70     else
71       flash[:notice] = t 'message.read.wrong_user', :user => @user.display_name
72       redirect_to :controller => "user", :action => "login", :referer => request.fullpath
73     end
74   rescue ActiveRecord::RecordNotFound
75     @title = t'message.no_such_message.title'
76     render :action => 'no_such_message', :status => :not_found
77   end
78
79   # Display the list of messages that have been sent to the user.
80   def inbox
81     @title = t 'message.inbox.title'
82     if @user and params[:display_name] == @user.display_name
83     else
84       redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
85     end
86   end
87
88   # Display the list of messages that the user has sent to other users.
89   def outbox
90     @title = t 'message.outbox.title'
91     if @user and params[:display_name] == @user.display_name
92     else
93       redirect_to :controller => 'message', :action => 'outbox', :display_name => @user.display_name
94     end
95   end
96
97   # Set the message as being read or unread.
98   def mark
99     if params[:message_id]
100       id = params[:message_id]
101       @message = Message.where(:id => id).where("to_user_id = ? OR from_user_id = ?", @user.id, @user.id).first
102       if params[:mark] == 'unread'
103         message_read = false 
104         notice = t 'message.mark.as_unread'
105       else
106         message_read = true
107         notice = t 'message.mark.as_read'
108       end
109       @message.message_read = message_read
110       if @message.save
111         if not request.xhr?
112           flash[:notice] = notice
113           redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
114         end
115       end
116     end
117   rescue ActiveRecord::RecordNotFound
118     @title = t'message.no_such_message.title'
119     render :action => 'no_such_message', :status => :not_found
120   end
121
122   # Delete the message.
123   def delete
124     if params[:message_id]
125       id = params[:message_id]
126       message = Message.where(:id => id).where("to_user_id = ? OR from_user_id = ?", @user.id, @user.id).first
127       message.from_user_visible = false if message.sender == @user
128       message.to_user_visible = false if message.recipient == @user
129       if message.save
130         flash[:notice] = t 'message.delete.deleted'
131
132         if params[:referer]
133           redirect_to params[:referer]
134         else
135           redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
136         end
137       end
138     end
139   rescue ActiveRecord::RecordNotFound
140     @title = t'message.no_such_message.title'
141     render :action => 'no_such_message', :status => :not_found
142   end
143 end