Skip to content
Snippets Groups Projects
Commit 0ce33f6b authored by Robert Schilling's avatar Robert Schilling
Browse files

Factor out common label API

parent a9fdc311
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -1020,7 +1020,7 @@ module API
end
 
expose :subscribed do |label, options|
label.subscribed?(options[:current_user], options[:project])
label.subscribed?(options[:current_user], options[:parent])
end
end
 
Loading
Loading
@@ -1029,7 +1029,7 @@ module API
 
class ProjectLabel < Label
expose :priority do |label, options|
label.priority(options[:project])
label.priority(options[:parent])
end
end
 
Loading
Loading
Loading
Loading
@@ -2,6 +2,7 @@
 
module API
class GroupLabels < Grape::API
include ::API::Helpers::LabelHelpers
include PaginationParams
 
before { authenticate! }
Loading
Loading
@@ -18,9 +19,7 @@ module API
use :pagination
end
get ':id/labels' do
group_labels = available_labels_for(user_group)
present paginate(group_labels), with: Entities::GroupLabel, current_user: current_user, parent: user_group
get_labels(user_group, Entities::GroupLabel)
end
 
desc 'Create a new label' do
Loading
Loading
@@ -28,38 +27,10 @@ module API
success Entities::GroupLabel
end
params do
requires :name, type: String, desc: 'The name of the label to be created'
requires :color, type: String, desc: "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the allowed CSS color names"
optional :description, type: String, desc: 'The description of label to be created'
use :label_create_params
end
post ':id/labels' do
authorize! :admin_label, user_group
label = available_labels_for(user_group).find_by_title(params[:name])
conflict!('Label already exists') if label
label = ::Labels::CreateService.new(declared_params(include_missing: false)).execute(group: user_group)
if label.persisted?
present label, with: Entities::GroupLabel, current_user: current_user, parent: user_group
else
render_validation_error!(label)
end
end
desc 'Delete an existing label' do
detail 'This feature was added in GitLab 11.7'
success Entities::GroupLabel
end
params do
requires :name, type: String, desc: 'The name of the label to be deleted'
end
delete ':id/labels' do
authorize! :admin_label, user_group
label = find_label(user_group, params[:name], include_ancestor_groups: false)
destroy_conditionally!(label)
create_label(user_group, Entities::GroupLabel)
end
 
desc 'Update an existing label. At least one optional parameter is required.' do
Loading
Loading
@@ -74,14 +45,18 @@ module API
at_least_one_of :new_name, :color, :description
end
put ':id/labels' do
authorize! :admin_label, user_group
label = find_label(user_group, params[:name], include_ancestor_groups: false)
label = ::Labels::UpdateService.new(declared_params(include_missing: false)).execute(label)
render_validation_error!(label) unless label.valid?
update_label(user_group, Entities::GroupLabel)
end
 
present label, with: Entities::GroupLabel, current_user: current_user, parent: user_group
desc 'Delete an existing label' do
detail 'This feature was added in GitLab 11.7'
success Entities::GroupLabel
end
params do
requires :name, type: String, desc: 'The name of the label to be deleted'
end
delete ':id/labels' do
delete_label(user_group)
end
end
end
Loading
Loading
Loading
Loading
@@ -170,13 +170,6 @@ module API
end
end
 
def find_label(parent, id, include_ancestor_groups: true)
labels = available_labels_for(parent, include_ancestor_groups: include_ancestor_groups)
label = labels.find_by_id(id) || labels.find_by_title(id)
label || not_found!('Label')
end
# rubocop: disable CodeReuse/ActiveRecord
def find_project_issue(iid)
IssuesFinder.new(current_user, project_id: user_project.id).find_by!(iid: iid)
Loading
Loading
# frozen_string_literal: true
module API
module Helpers
module LabelHelpers
extend ActiveSupport::Concern
included do
helpers do
params :label_create_params do
requires :name, type: String, desc: 'The name of the label to be created'
requires :color, type: String, desc: "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the allowed CSS color names"
optional :description, type: String, desc: 'The description of label to be created'
end
params :label_update_params do
requires :name, type: String, desc: 'The name of the label to be updated'
optional :new_name, type: String, desc: 'The new name of the label'
optional :color, type: String, desc: "The new color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the allowed CSS color names"
optional :description, type: String, desc: 'The new description of label'
at_least_one_of :new_name, :color, :description
end
def find_label(parent, id, include_ancestor_groups: true)
labels = available_labels_for(parent, include_ancestor_groups: include_ancestor_groups)
label = labels.find_by_id(id) || labels.find_by_title(id)
label || not_found!('Label')
end
def get_labels(parent, entity)
present paginate(available_labels_for(parent)), with: entity, current_user: current_user, parent: parent
end
def create_label(parent, entity)
authorize! :admin_label, parent
label = available_labels_for(parent).find_by_title(params[:name])
conflict!('Label already exists') if label
priority = params.delete(:priority)
label_params = declared_params(include_missing: false)
label =
if parent.is_a?(Project)
::Labels::CreateService.new(label_params).execute(project: parent)
else
::Labels::CreateService.new(label_params).execute(group: parent)
end
if label.persisted?
if parent.is_a?(Project)
label.prioritize!(parent, priority) if priority
end
present label, with: entity, current_user: current_user, parent: parent
else
render_validation_error!(label)
end
end
def update_label(parent, entity)
authorize! :admin_label, parent
label = find_label(parent, params[:name], include_ancestor_groups: false)
update_priority = params.key?(:priority)
priority = params.delete(:priority)
label = ::Labels::UpdateService.new(declared_params(include_missing: false)).execute(label)
render_validation_error!(label) unless label.valid?
if parent.is_a?(Project) && update_priority
if priority.nil?
label.unprioritize!(parent)
else
label.prioritize!(parent, priority)
end
end
present label, with: entity, current_user: current_user, parent: parent
end
def delete_label(parent)
authorize! :admin_label, parent
label = find_label(parent, params[:name], include_ancestor_groups: false)
destroy_conditionally!(label)
end
end
end
end
end
end
Loading
Loading
@@ -2,6 +2,7 @@
 
module API
class Labels < Grape::API
include ::API::Helpers::LabelHelpers
include PaginationParams
 
before { authenticate! }
Loading
Loading
@@ -17,53 +18,19 @@ module API
use :pagination
end
get ':id/labels' do
present paginate(available_labels_for(user_project)), with: Entities::ProjectLabel, current_user: current_user, project: user_project
get_labels(user_project, Entities::ProjectLabel)
end
 
desc 'Create a new label' do
success Entities::ProjectLabel
end
params do
requires :name, type: String, desc: 'The name of the label to be created'
requires :color, type: String, desc: "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the allowed CSS color names"
optional :description, type: String, desc: 'The description of label to be created'
use :label_create_params
optional :priority, type: Integer, desc: 'The priority of the label', allow_blank: true
end
# rubocop: disable CodeReuse/ActiveRecord
post ':id/labels' do
authorize! :admin_label, user_project
label = available_labels_for(user_project).find_by(title: params[:name])
conflict!('Label already exists') if label
priority = params.delete(:priority)
label = ::Labels::CreateService.new(declared_params(include_missing: false)).execute(project: user_project)
if label.valid?
label.prioritize!(user_project, priority) if priority
present label, with: Entities::ProjectLabel, current_user: current_user, project: user_project
else
render_validation_error!(label)
end
end
# rubocop: enable CodeReuse/ActiveRecord
desc 'Delete an existing label' do
success Entities::ProjectLabel
end
params do
requires :name, type: String, desc: 'The name of the label to be deleted'
end
# rubocop: disable CodeReuse/ActiveRecord
delete ':id/labels' do
authorize! :admin_label, user_project
label = user_project.labels.find_by(title: params[:name])
not_found!('Label') unless label
destroy_conditionally!(label)
create_label(user_project, Entities::ProjectLabel)
end
# rubocop: enable CodeReuse/ActiveRecord
 
desc 'Update an existing label. At least one optional parameter is required.' do
success Entities::ProjectLabel
Loading
Loading
@@ -76,30 +43,19 @@ module API
optional :priority, type: Integer, desc: 'The priority of the label', allow_blank: true
at_least_one_of :new_name, :color, :description, :priority
end
# rubocop: disable CodeReuse/ActiveRecord
put ':id/labels' do
authorize! :admin_label, user_project
label = user_project.labels.find_by(title: params[:name])
not_found!('Label not found') unless label
update_priority = params.key?(:priority)
priority = params.delete(:priority)
label = ::Labels::UpdateService.new(declared_params(include_missing: false)).execute(label)
render_validation_error!(label) unless label.valid?
if update_priority
if priority.nil?
label.unprioritize!(user_project)
else
label.prioritize!(user_project, priority)
end
end
update_label(user_project, Entities::ProjectLabel)
end
 
present label, with: Entities::ProjectLabel, current_user: current_user, project: user_project
desc 'Delete an existing label' do
success Entities::ProjectLabel
end
params do
requires :name, type: String, desc: 'The name of the label to be deleted'
end
delete ':id/labels' do
delete_label(user_project)
end
# rubocop: enable CodeReuse/ActiveRecord
end
end
end
Loading
Loading
@@ -2,6 +2,8 @@
 
module API
class Subscriptions < Grape::API
include ::API::Helpers::LabelHelpers
before { authenticate! }
 
subscribables = [
Loading
Loading
@@ -50,7 +52,7 @@ module API
not_modified!
else
resource.subscribe(current_user, parent)
present resource, with: subscribable[:entity], current_user: current_user, project: parent
present resource, with: subscribable[:entity], current_user: current_user, project: parent, parent: parent
end
end
 
Loading
Loading
@@ -65,7 +67,7 @@ module API
not_modified!
else
resource.unsubscribe(current_user, parent)
present resource, with: subscribable[:entity], current_user: current_user, project: parent
present resource, with: subscribable[:entity], current_user: current_user, project: parent, parent: parent
end
end
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment