wikis_controller.rb 3.43 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 48
    @page = @project_wiki.find_page(params[:id])

49
    if @page = WikiPages::UpdateService.new(@project, current_user, wiki_params).execute(@page)
50 51 52 53
      redirect_to(
        namespace_project_wiki_path(@project.namespace, @project, @page),
        notice: 'Wiki was successfully updated.'
      )
54 55 56
    else
      render 'edit'
    end
Valery Sizov's avatar
Valery Sizov committed
57 58 59
  end

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

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

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

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

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

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

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

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

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

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

  private

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

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

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

  def wiki_params
    params[:wiki].slice(:title, :content, :format, :message)
  end
Valery Sizov's avatar
Valery Sizov committed
128
end