haru/redmine_wiki_extensions

View on GitHub
app/controllers/wiki_extensions_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# Wiki Extensions plugin for Redmine
# Copyright (C) 2009-2024  Haruyuki Iida
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.


class WikiExtensionsController < ApplicationController
  menu_item :wiki
  before_action :find_project, :find_user
  before_action :authorize, except: :stylesheet

  def add_comment

    comment = WikiExtensionsComment.new
    comment.wiki_page_id = params[:wiki_page_id].to_i
    comment.user_id = @user.id
    comment.comment = params[:comment]
    comment.save
    page = WikiPage.find(comment.wiki_page_id)
    # Send email-notification to watchers of wiki page
    WikiExtensionsCommentsMailer.deliver_wiki_commented(comment, page) if Setting.notified_events.include? "wiki_comment_added"
    redirect_to :controller => 'wiki', :action => 'show', :project_id => @project, :id => page.title
  end
  
  def reply_comment
    
    comment = WikiExtensionsComment.new
    comment.parent_id = params[:comment_id].to_i
    comment.wiki_page_id = params[:wiki_page_id].to_i
    comment.user_id = @user.id
    comment.comment = params[:reply]
    comment.save
    page = WikiPage.find(comment.wiki_page_id)
    # Send email-notification to watchers of wiki page
    WikiExtensionsCommentsMailer.deliver_wiki_commented(comment, page) if Setting.notified_events.include? "wiki_comment_added"
    redirect_to :controller => 'wiki', :action => 'show', :project_id => @project, :id => page.title
  end

  def tag
    tag_id = params[:tag_id].to_i
    @tag = WikiExtensionsTag.find(tag_id)
  end

  def forward_wiki_page
    menu_id = params[:menu_id].to_i
    menu = WikiExtensionsMenu.find_or_create(@project.id, menu_id)
    redirect_to :controller => 'wiki', :action => 'show', :project_id => @project, :id => menu.page_name
  end

  def destroy_comment
    comment_id = params[:comment_id].to_i
    comment = WikiExtensionsComment.find(comment_id)
    unless User.current.admin or User.current.id == comment.user.id
      render_403 
      return false
    end
    
    page = WikiPage.find(comment.wiki_page_id)
    comment.destroy
    redirect_to :controller => 'wiki', :action => 'show', :project_id => @project, :id => page.title
  end

  def update_comment
    comment_id = params[:comment_id].to_i
    comment = WikiExtensionsComment.find(comment_id)
    unless User.current.admin or User.current.id == comment.user.id
      render_403
      return false
    end
 
    page = WikiPage.find(comment.wiki_page_id)
    comment.comment = params[:comment]
    comment.save
    redirect_to :controller => 'wiki', :action => 'show', :project_id => @project, :id => page.title

  end

  def vote
    target_class_name = params[:target_class_name]
    target_id = params[:target_id].to_i
    key = params[:key]
    vote = WikiExtensionsVote.find_or_create(target_class_name, target_id, key)
    session[:wiki_extension_voted] = Hash.new unless session[:wiki_extension_voted]
    unless session[:wiki_extension_voted][vote.id]
      vote.countup
      vote.save!
      session[:wiki_extension_voted][vote.id] = 1
    end
    
    render :inline => " #{vote.count}"
  end

  def stylesheet
    stylesheet = WikiPage.find_by(wiki_id: @project.wiki.id, title: "StyleSheet")
    unless stylesheet
      render_404
      return
    end

    unless stylesheet.visible?
      render_403
      return
    end
    render plain: stylesheet.content.text, content_type: 'text/css'
  end
  
  private
  def find_project
    # @project variable must be set before calling the authorize filter
    @project = Project.find(params[:id]) unless params[:id].blank?
  end

  def find_user
    @user = User.current
  end

end