wikis_controller.rb 3.46 KB
Newer Older
1
class Projects::WikisController < Projects::ApplicationController
2
  before_action :authorize_read_wiki!
3
  before_action :authorize_create_wiki!, only: [:edit, :create, :history]
4 5
  before_action :authorize_admin_wiki!, only: :destroy
  before_action :load_project_wiki
6

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
7
  def pages
8
    @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page])
9
    @wiki_entries = WikiPage.group_by_directory(@wiki_pages)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
10 11
  end

Valery Sizov's avatar
Valery Sizov committed
12
  def show
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
13
    @page = @project_wiki.find_page(params[:id], params[:version_id])
14

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
15
    if @page
16
      render 'show'
17
    elsif file = @project_wiki.find_file(params[:id], params[:version_id])
18 19 20
      response.headers['Content-Security-Policy'] = "default-src 'none'"
      response.headers['X-Content-Security-Policy'] = "default-src 'none'"

21 22 23 24 25 26 27 28 29 30
      if file.on_disk?
        send_file file.on_disk_path, disposition: 'inline'
      else
        send_data(
          file.raw_data,
          type: file.mime_type,
          disposition: 'inline',
          filename: file.name
        )
      end
31
    else
32
      return render('empty') unless can?(current_user, :create_wiki, @project)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
33 34
      @page = WikiPage.new(@project_wiki)
      @page.title = params[:id]
35 36

      render 'edit'
Valery Sizov's avatar
Valery Sizov committed
37 38 39 40
    end
  end

  def edit
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
41
    @page = @project_wiki.find_page(params[:id])
42 43 44
  end

  def update
45
    return render('empty') unless can?(current_user, :create_wiki, @project)
46

47
    @page = @project_wiki.find_page(params[:id])
Dongqing Hu's avatar
Dongqing Hu committed
48
    @page = WikiPages::UpdateService.new(@project, current_user, wiki_params).execute(@page)
49

Dongqing Hu's avatar
Dongqing Hu committed
50
    if @page.valid?
51 52 53 54
      redirect_to(
        namespace_project_wiki_path(@project.namespace, @project, @page),
        notice: 'Wiki was successfully updated.'
      )
55 56 57
    else
      render 'edit'
    end
Valery Sizov's avatar
Valery Sizov committed
58 59 60
  end

  def create
61
    @page = WikiPages::CreateService.new(@project, current_user, wiki_params).execute
62

63
    if @page.persisted?
Vinnie Okada's avatar
Vinnie Okada committed
64 65 66 67
      redirect_to(
        namespace_project_wiki_path(@project.namespace, @project, @page),
        notice: 'Wiki was successfully updated.'
      )
68 69
    else
      render action: "edit"
Valery Sizov's avatar
Valery Sizov committed
70 71
    end
  end
Valery Sizov's avatar
Valery Sizov committed
72 73

  def history
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
74
    @page = @project_wiki.find_page(params[:id])
75

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
76
    unless @page
Vinnie Okada's avatar
Vinnie Okada committed
77 78 79 80
      redirect_to(
        namespace_project_wiki_path(@project.namespace, @project, :home),
        notice: "Page not found"
      )
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
81
    end
Valery Sizov's avatar
Valery Sizov committed
82
  end
83

Valery Sizov's avatar
Valery Sizov committed
84
  def destroy
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
85
    @page = @project_wiki.find_page(params[:id])
86
    WikiPages::DestroyService.new(@project, current_user).execute(@page)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
87

Vinnie Okada's avatar
Vinnie Okada committed
88 89 90 91
    redirect_to(
      namespace_project_wiki_path(@project.namespace, @project, :home),
      notice: "Page was successfully deleted"
    )
92
  end
Valery Sizov's avatar
Valery Sizov committed
93

94
  def preview_markdown
95 96
    text = params[:text]

97 98
    ext = Gitlab::ReferenceExtractor.new(@project, current_user)
    ext.analyze(text, author: current_user)
99 100

    render json: {
101
      body: view_context.markdown(text, pipeline: :wiki, project_wiki: @project_wiki, page_slug: params[:id]),
102 103 104 105 106 107
      references: {
        users: ext.users.map(&:username)
      }
    }
  end

108
  def git_access
Valery Sizov's avatar
Valery Sizov committed
109
  end
110 111 112

  private

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
113 114
  def load_project_wiki
    @project_wiki = ProjectWiki.new(@project, current_user)
115 116

    # Call #wiki to make sure the Wiki Repo is initialized
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
117
    @project_wiki.wiki
118

119
    @sidebar_wiki_entries = WikiPage.group_by_directory(@project_wiki.pages.first(15))
120
  rescue ProjectWiki::CouldNotCreateWikiError
121
    flash[:notice] = "Could not create Wiki Repository at this time. Please try again later."
122
    redirect_to project_path(@project)
123 124 125 126
    return false
  end

  def wiki_params
127
    params.require(:wiki).permit(:title, :content, :format, :message)
128
  end
Valery Sizov's avatar
Valery Sizov committed
129
end