summaryrefslogtreecommitdiff
path: root/lib/api/wikis.rb
blob: c1bf3a6492326b16f3ea5b6ac41d1a383fa2ac35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# frozen_string_literal: true

module API
  class Wikis < Grape::API
    helpers do
      def commit_params(attrs)
        # In order to avoid service disruption this can work with an old workhorse without the acceleration
        # the first branch of this if must be removed when we drop support for non accelerated uploads
        if attrs[:file].is_a?(Hash)
          {
            file_name: attrs[:file][:filename],
            file_content: attrs[:file][:tempfile].read,
            branch_name: attrs[:branch]
          }
        else
          {
            file_name: attrs[:file].original_filename,
            file_content: attrs[:file].read,
            branch_name: attrs[:branch]
          }
        end
      end

      params :common_wiki_page_params do
        optional :format,
          type: String,
          values: Wiki::MARKUPS.values.map(&:to_s),
          default: 'markdown',
          desc: 'Format of a wiki page. Available formats are markdown, rdoc, asciidoc and org'
      end
    end

    WIKI_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(slug: API::NO_SLASH_URL_PART_REGEX)

    resource :projects, requirements: WIKI_ENDPOINT_REQUIREMENTS do
      desc 'Get a list of wiki pages' do
        success Entities::WikiPageBasic
      end
      params do
        optional :with_content, type: Boolean, default: false, desc: "Include pages' content"
      end
      get ':id/wikis' do
        authorize! :read_wiki, user_project

        entity = params[:with_content] ? Entities::WikiPage : Entities::WikiPageBasic

        present user_project.wiki.list_pages(load_content: params[:with_content]), with: entity
      end

      desc 'Get a wiki page' do
        success Entities::WikiPage
      end
      params do
        requires :slug, type: String, desc: 'The slug of a wiki page'
      end
      get ':id/wikis/:slug' do
        authorize! :read_wiki, user_project

        present wiki_page, with: Entities::WikiPage
      end

      desc 'Create a wiki page' do
        success Entities::WikiPage
      end
      params do
        requires :title, type: String, desc: 'Title of a wiki page'
        requires :content, type: String, desc: 'Content of a wiki page'
        use :common_wiki_page_params
      end
      post ':id/wikis' do
        authorize! :create_wiki, user_project

        page = WikiPages::CreateService.new(container: user_project, current_user: current_user, params: params).execute

        if page.valid?
          present page, with: Entities::WikiPage
        else
          render_validation_error!(page)
        end
      end

      desc 'Update a wiki page' do
        success Entities::WikiPage
      end
      params do
        optional :title, type: String, desc: 'Title of a wiki page'
        optional :content, type: String, desc: 'Content of a wiki page'
        use :common_wiki_page_params
        at_least_one_of :content, :title, :format
      end
      put ':id/wikis/:slug' do
        authorize! :create_wiki, user_project

        page = WikiPages::UpdateService.new(container: user_project, current_user: current_user, params: params).execute(wiki_page)

        if page.valid?
          present page, with: Entities::WikiPage
        else
          render_validation_error!(page)
        end
      end

      desc 'Delete a wiki page'
      params do
        requires :slug, type: String, desc: 'The slug of a wiki page'
      end
      delete ':id/wikis/:slug' do
        authorize! :admin_wiki, user_project

        WikiPages::DestroyService.new(container: user_project, current_user: current_user).execute(wiki_page)

        no_content!
      end

      desc 'Upload an attachment to the wiki repository' do
        detail 'This feature was introduced in GitLab 11.3.'
        success Entities::WikiAttachment
      end
      params do
        requires :file, types: [::API::Validations::Types::SafeFile, ::API::Validations::Types::WorkhorseFile], desc: 'The attachment file to be uploaded'
        optional :branch, type: String, desc: 'The name of the branch'
      end
      post ":id/wikis/attachments" do
        authorize! :create_wiki, user_project

        result = ::Wikis::CreateAttachmentService.new(
          container: user_project,
          current_user: current_user,
          params: commit_params(declared_params(include_missing: false))
        ).execute

        if result[:status] == :success
          status(201)
          present OpenStruct.new(result[:result]), with: Entities::WikiAttachment
        else
          render_api_error!(result[:message], 400)
        end
      end
    end
  end
end