2018-09-29 22:34:47 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-03-05 17:51:40 +00:00
|
|
|
module API
|
2020-04-28 03:09:53 +00:00
|
|
|
class Badges < Grape::API
|
2018-03-05 17:51:40 +00:00
|
|
|
include PaginationParams
|
|
|
|
|
|
|
|
before { authenticate_non_get! }
|
|
|
|
|
|
|
|
helpers ::API::Helpers::BadgesHelpers
|
|
|
|
|
|
|
|
helpers do
|
|
|
|
def find_source_if_admin(source_type)
|
|
|
|
source = find_source(source_type, params[:id])
|
|
|
|
|
|
|
|
authorize_admin_source!(source_type, source)
|
|
|
|
|
|
|
|
source
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
%w[group project].each do |source_type|
|
|
|
|
params do
|
|
|
|
requires :id, type: String, desc: "The ID of a #{source_type}"
|
|
|
|
end
|
2018-11-08 12:18:17 +00:00
|
|
|
resource source_type.pluralize, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
2018-03-05 17:51:40 +00:00
|
|
|
desc "Gets a list of #{source_type} badges viewable by the authenticated user." do
|
|
|
|
detail 'This feature was introduced in GitLab 10.6.'
|
|
|
|
success Entities::Badge
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :pagination
|
|
|
|
end
|
|
|
|
get ":id/badges" do
|
|
|
|
source = find_source(source_type, params[:id])
|
|
|
|
|
2019-11-22 09:06:20 +00:00
|
|
|
badges = source.badges
|
|
|
|
name = params[:name]
|
|
|
|
badges = badges.with_name(name) if name
|
|
|
|
|
|
|
|
present_badges(source, paginate(badges))
|
2018-03-05 17:51:40 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
desc "Preview a badge from a #{source_type}." do
|
|
|
|
detail 'This feature was introduced in GitLab 10.6.'
|
|
|
|
success Entities::BasicBadgeDetails
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :link_url, type: String, desc: 'URL of the badge link'
|
|
|
|
requires :image_url, type: String, desc: 'URL of the badge image'
|
|
|
|
end
|
|
|
|
get ":id/badges/render" do
|
|
|
|
authenticate!
|
|
|
|
|
|
|
|
source = find_source_if_admin(source_type)
|
|
|
|
|
|
|
|
badge = ::Badges::BuildService.new(declared_params(include_missing: false))
|
|
|
|
.execute(source)
|
|
|
|
|
|
|
|
if badge.valid?
|
|
|
|
present_badges(source, badge, with: Entities::BasicBadgeDetails)
|
|
|
|
else
|
|
|
|
render_validation_error!(badge)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc "Gets a badge of a #{source_type}." do
|
|
|
|
detail 'This feature was introduced in GitLab 10.6.'
|
|
|
|
success Entities::Badge
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :badge_id, type: Integer, desc: 'The badge ID'
|
|
|
|
end
|
|
|
|
get ":id/badges/:badge_id" do
|
|
|
|
source = find_source(source_type, params[:id])
|
|
|
|
badge = find_badge(source)
|
|
|
|
|
|
|
|
present_badges(source, badge)
|
|
|
|
end
|
|
|
|
|
|
|
|
desc "Adds a badge to a #{source_type}." do
|
|
|
|
detail 'This feature was introduced in GitLab 10.6.'
|
|
|
|
success Entities::Badge
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :link_url, type: String, desc: 'URL of the badge link'
|
|
|
|
requires :image_url, type: String, desc: 'URL of the badge image'
|
2019-11-22 09:06:20 +00:00
|
|
|
optional :name, type: String, desc: 'Name for the badge'
|
2018-03-05 17:51:40 +00:00
|
|
|
end
|
|
|
|
post ":id/badges" do
|
|
|
|
source = find_source_if_admin(source_type)
|
|
|
|
|
|
|
|
badge = ::Badges::CreateService.new(declared_params(include_missing: false)).execute(source)
|
|
|
|
|
|
|
|
if badge.persisted?
|
|
|
|
present_badges(source, badge)
|
|
|
|
else
|
|
|
|
render_validation_error!(badge)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc "Updates a badge of a #{source_type}." do
|
|
|
|
detail 'This feature was introduced in GitLab 10.6.'
|
|
|
|
success Entities::Badge
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
optional :link_url, type: String, desc: 'URL of the badge link'
|
|
|
|
optional :image_url, type: String, desc: 'URL of the badge image'
|
2019-11-22 09:06:20 +00:00
|
|
|
optional :name, type: String, desc: 'Name for the badge'
|
2018-03-05 17:51:40 +00:00
|
|
|
end
|
|
|
|
put ":id/badges/:badge_id" do
|
|
|
|
source = find_source_if_admin(source_type)
|
|
|
|
|
|
|
|
badge = ::Badges::UpdateService.new(declared_params(include_missing: false))
|
|
|
|
.execute(find_badge(source))
|
|
|
|
|
|
|
|
if badge.valid?
|
|
|
|
present_badges(source, badge)
|
|
|
|
else
|
|
|
|
render_validation_error!(badge)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Removes a badge from a project or group.' do
|
|
|
|
detail 'This feature was introduced in GitLab 10.6.'
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :badge_id, type: Integer, desc: 'The badge ID'
|
|
|
|
end
|
|
|
|
delete ":id/badges/:badge_id" do
|
|
|
|
source = find_source_if_admin(source_type)
|
|
|
|
badge = find_badge(source)
|
|
|
|
|
|
|
|
if badge.is_a?(GroupBadge) && source.is_a?(Project)
|
|
|
|
error!('To delete a Group badge please use the Group endpoint', 403)
|
|
|
|
end
|
|
|
|
|
|
|
|
destroy_conditionally!(badge)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|