2018-12-05 23:21:45 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
module API
|
|
|
|
class Wikis < Grape::API
|
|
|
|
helpers do
|
2018-11-20 20:47:30 +05:30
|
|
|
def commit_params(attrs)
|
2019-12-04 20:38:33 +05:30
|
|
|
# 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
|
2018-11-20 20:47:30 +05:30
|
|
|
end
|
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
params :common_wiki_page_params do
|
2018-03-17 18:26:18 +05:30
|
|
|
optional :format,
|
|
|
|
type: String,
|
|
|
|
values: ProjectWiki::MARKUPS.values.map(&:to_s),
|
|
|
|
default: 'markdown',
|
2020-03-09 13:42:32 +05:30
|
|
|
desc: 'Format of a wiki page. Available formats are markdown, rdoc, asciidoc and org'
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-02 22:35:43 +05:30
|
|
|
WIKI_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(slug: API::NO_SLASH_URL_PART_REGEX)
|
|
|
|
|
|
|
|
resource :projects, requirements: WIKI_ENDPOINT_REQUIREMENTS do
|
2018-03-17 18:26:18 +05:30
|
|
|
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
|
2019-07-31 22:56:46 +05:30
|
|
|
|
|
|
|
present user_project.wiki.list_pages(load_content: params[:with_content]), with: entity
|
2018-03-17 18:26:18 +05:30
|
|
|
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
|
2019-07-07 11:18:12 +05:30
|
|
|
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
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
post ':id/wikis' do
|
|
|
|
authorize! :create_wiki, user_project
|
|
|
|
|
2020-05-24 23:13:21 +05:30
|
|
|
page = WikiPages::CreateService.new(container: user_project, current_user: current_user, params: params).execute
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
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
|
2019-07-07 11:18:12 +05:30
|
|
|
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
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
put ':id/wikis/:slug' do
|
|
|
|
authorize! :create_wiki, user_project
|
|
|
|
|
2020-05-24 23:13:21 +05:30
|
|
|
page = WikiPages::UpdateService.new(container: user_project, current_user: current_user, params: params).execute(wiki_page)
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
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
|
|
|
|
|
2020-05-24 23:13:21 +05:30
|
|
|
WikiPages::DestroyService.new(container: user_project, current_user: current_user).execute(wiki_page)
|
2020-03-09 13:42:32 +05:30
|
|
|
|
|
|
|
no_content!
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2018-11-20 20:47:30 +05:30
|
|
|
|
|
|
|
desc 'Upload an attachment to the wiki repository' do
|
|
|
|
detail 'This feature was introduced in GitLab 11.3.'
|
|
|
|
success Entities::WikiAttachment
|
|
|
|
end
|
|
|
|
params do
|
2019-12-04 20:38:33 +05:30
|
|
|
requires :file, types: [::API::Validations::Types::SafeFile, ::API::Validations::Types::WorkhorseFile], desc: 'The attachment file to be uploaded'
|
2018-11-20 20:47:30 +05:30
|
|
|
optional :branch, type: String, desc: 'The name of the branch'
|
|
|
|
end
|
2019-03-02 22:35:43 +05:30
|
|
|
post ":id/wikis/attachments" do
|
2018-11-20 20:47:30 +05:30
|
|
|
authorize! :create_wiki, user_project
|
|
|
|
|
2020-05-24 23:13:21 +05:30
|
|
|
result = ::Wikis::CreateAttachmentService.new(
|
|
|
|
container: user_project,
|
|
|
|
current_user: current_user,
|
|
|
|
params: commit_params(declared_params(include_missing: false))
|
|
|
|
).execute
|
2018-11-20 20:47:30 +05:30
|
|
|
|
|
|
|
if result[:status] == :success
|
|
|
|
status(201)
|
|
|
|
present OpenStruct.new(result[:result]), with: Entities::WikiAttachment
|
|
|
|
else
|
|
|
|
render_api_error!(result[:message], 400)
|
|
|
|
end
|
|
|
|
end
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|