Comments(EmbeddedDocument) can be localized
[shapado:shapado.git] / app / controllers / comments_controller.rb
1 class CommentsController < ApplicationController
2   before_filter :login_required, :except => [:index]
3   before_filter :find_scope
4   before_filter :check_permissions, :except => [:create, :index]
5
6   def index
7     @comments = @answer ? @answer.comments : @question.comments
8
9     respond_to do |format|
10       format.json { render :json => @comments }
11     end
12   end
13
14   def create
15     @comment = Comment.new
16     @comment.body = params[:body]
17     @comment.user = current_user
18 #     @comment.position = params[:comment][:position] FIXME
19
20     current_scope << @comment
21
22     if @comment.valid? && saved = scope.save
23       current_user.on_activity(:comment_question, current_group)
24
25       Jobs::Activities.async.on_comment(@comment.id).commit!
26
27       if question_id = @comment.question_id
28         Question.update_last_target(question_id, @comment)
29       end
30
31       flash[:notice] = t("comments.create.flash_notice")
32     else
33       flash[:error] = @comment.errors.full_messages.join(", ")
34     end
35
36     Jobs::Activities.async.on_new_comment(scope.id, scope._type, @comment.id)
37
38     respond_to do |format|
39       if saved
40         format.html {redirect_to params[:source]}
41         format.json {render :json => @comment.to_json, :status => :created}
42         format.js do
43           render(:json => {:success => true, :message => flash[:notice],
44             :html => render_to_string(:partial => "comments/comment",
45                                       :object => @comment,
46                                       :locals => {:source => params[:source], :mini => true})}.to_json)
47         end
48       else
49         format.html {redirect_to params[:source]}
50         format.json {render :json => @comment.errors.to_json, :status => :unprocessable_entity }
51         format.js {render :json => {:success => false, :message => flash[:error] }.to_json }
52       end
53     end
54   end
55
56   def edit
57     @comment = current_scope.find(params[:id])
58     respond_to do |format|
59       format.html
60       format.js do
61         render :json => {:status => :ok,
62          :html => render_to_string(:partial => "comments/edit_form",
63                                    :locals => {:source => params[:source],
64                                                :commentable => @comment.commentable})
65         }
66       end
67     end
68   end
69
70   def update
71     respond_to do |format|
72       @comment = current_scope.find(params[:id])
73       @comment.body = params[:body]
74       if @comment.valid? && scope.save
75         if question_id = @comment.question_id
76           Question.update_last_target(question_id, @comment)
77         end
78
79         flash[:notice] = t(:flash_notice, :scope => "comments.update")
80         format.html { redirect_to(params[:source]) }
81         format.json { render :json => @comment.to_json, :status => :ok}
82         format.js { render :json => { :message => flash[:notice],
83                                       :success => true,
84                                       :body => @comment.body} }
85       else
86         flash[:error] = @comment.errors.full_messages.join(", ")
87         format.html { render :action => "edit" }
88         format.json { render :json => @comment.errors, :status => :unprocessable_entity }
89         format.js { render :json => { :success => false, :message => flash[:error]}.to_json }
90       end
91     end
92   end
93
94   def destroy
95     @scope = scope
96     @scope.comments.delete_if { |f| f._id == params[:id] }
97     @scope.save!
98
99     respond_to do |format|
100       format.html { redirect_to(params[:source]) }
101       format.json { head :ok }
102     end
103   end
104
105   protected
106   def check_permissions
107     @comment = current_scope.find(params[:id])
108     valid = false
109     if params[:action] == "destroy"
110       valid = @comment.can_be_deleted_by?(current_user)
111     else
112       valid = current_user.can_modify?(@comment) || current_user.mod_of?(@comment.group)
113     end
114
115     if !valid
116       respond_to do |format|
117         format.html do
118           flash[:error] = t("global.permission_denied")
119           redirect_to params[:source] || questions_path
120         end
121         format.js { render :json => {:success => false, :message => t("global.permission_denied") } }
122         format.json { render :json => {:message => t("global.permission_denied")}, :status => :unprocessable_entity }
123       end
124     end
125   end
126
127   def current_scope
128     scope.comments
129   end
130
131   def find_scope
132     @question = Question.by_slug(params[:question_id])
133     @answer = @question.answers.find(params[:answer_id]) unless params[:answer_id].blank?
134   end
135
136   def scope
137     unless @answer.nil?
138       @answer
139     else
140       @question
141     end
142   end
143
144   def full_scope
145     unless @answer.nil?
146       [@question, @answer]
147     else
148       [@question]
149     end
150   end
151   helper_method :full_scope
152
153 end