update last target after editing comments
[shapado:cantonics-shapado.git] / app / controllers / comments_controller.rb
1 class CommentsController < ApplicationController
2   before_filter :login_required
3   before_filter :check_permissions, :except => [:create]
4
5   def create
6     @comment = Comment.new
7     @comment.body = params[:body]
8     @comment.commentable_type = params[:commentable_type]
9     @comment.commentable_id = params[:commentable_id]
10     @comment.user = current_user
11     @comment.group = current_group
12
13     if saved = @comment.save
14       current_user.on_activity(:comment_question, current_group)
15       Magent.push("actors.judge", :on_comment, @comment.id)
16
17       if question_id = @comment.question_id
18         Question.update_last_target(question_id, @comment)
19       end
20
21       flash[:notice] = t("comments.create.flash_notice")
22     else
23       flash[:error] = @comment.errors.full_messages.join(", ")
24     end
25
26     # TODO: use magent to do it
27     if (question = @comment.find_question) && (recipient = @comment.find_recipient)
28       email = recipient.email
29       if !email.blank? && current_user.id != recipient.id && recipient.notification_opts.new_answer
30         Notifier.deliver_new_comment(current_group, @comment, recipient, question)
31       end
32     end
33
34     respond_to do |format|
35       if saved
36         format.html {redirect_to params[:source]}
37         format.json {render :json => @comment.to_json, :status => :created}
38         format.js do
39           render(:json => {:success => true, :message => flash[:notice],
40             :html => render_to_string(:partial => "comments/comment",
41                                       :object => @comment,
42                                       :locals => {:source => params[:source], :mini => true})}.to_json)
43         end
44       else
45         format.html {redirect_to params[:source]}
46         format.json {render :json => @comment.errors.to_json, :status => :unprocessable_entity }
47         format.js {render :json => {:success => false, :message => flash[:error] }.to_json }
48       end
49     end
50   end
51
52
53   def edit
54     @comment = Comment.find(params[:id])
55     respond_to do |format|
56       format.html
57       format.js do
58         render :json => {:status => :ok,
59          :html => render_to_string(:partial => "comments/edit_form",
60                                    :locals => {:source => params[:source],
61                                                :commentable => @comment.commentable})
62         }
63       end
64     end
65   end
66
67   def update
68     respond_to do |format|
69       @comment = Comment.find(params[:id])
70       @comment.body = params[:body]
71       if @comment.valid? && @comment.save
72         if question_id = @comment.question_id
73           Question.update_last_target(question_id, @comment)
74         end
75
76         flash[:notice] = t(:flash_notice, :scope => "comments.update")
77         format.html { redirect_to(params[:source]) }
78         format.json { render :json => @comment.to_json, :status => :ok}
79         format.js { render :json => { :message => flash[:notice],
80                                       :success => true,
81                                       :body => @comment.body} }
82       else
83         flash[:error] = @comment.errors.full_messages.join(", ")
84         format.html { render :action => "edit" }
85         format.json { render :json => @comment.errors, :status => :unprocessable_entity }
86         format.js { render :json => { :success => false, :message => flash[:error]}.to_json }
87       end
88     end
89   end
90
91   def destroy
92     @comment = Comment.find(params[:id])
93     @comment.destroy
94
95     respond_to do |format|
96       format.html { redirect_to(params[:source]) }
97       format.json { head :ok }
98     end
99   end
100
101   protected
102   def check_permissions
103     @comment = Comment.find!(params[:id])
104     if !(current_user.owner_of?(current_group) || current_user.can_modify?(@comment))
105       format.html do
106         flash[:error] = t("global.permission_denied")
107         redirect_to params[:source]
108       end
109       format.json { render :json => {:message => t("global.permission_denied")}, :status => :unprocessable_entity }
110     end
111   end
112 end