diff options
author | Robert Schilling <rschilling@student.tugraz.at> | 2019-01-06 20:31:37 +0100 |
---|---|---|
committer | Robert Schilling <rschilling@student.tugraz.at> | 2019-01-31 13:49:52 +0100 |
commit | 0ce33f6b4f30ddab14025adb16138f1589d32b6f (patch) | |
tree | 35edfe95e7690aecbcb1e01a6586a43c9b603d7c | |
parent | a9fdc3118a7f9fb55b6f6b243f7bed2abe1ce48f (diff) | |
download | gitlab-ce-0ce33f6b4f30ddab14025adb16138f1589d32b6f.tar.gz |
Factor out common label API
-rw-r--r-- | lib/api/entities.rb | 4 | ||||
-rw-r--r-- | lib/api/group_labels.rb | 55 | ||||
-rw-r--r-- | lib/api/helpers.rb | 7 | ||||
-rw-r--r-- | lib/api/helpers/label_helpers.rb | 94 | ||||
-rw-r--r-- | lib/api/labels.rb | 72 | ||||
-rw-r--r-- | lib/api/subscriptions.rb | 6 |
6 files changed, 129 insertions, 109 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb index e361b419f16..7549173c90f 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -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 @@ -1029,7 +1029,7 @@ module API class ProjectLabel < Label expose :priority do |label, options| - label.priority(options[:project]) + label.priority(options[:parent]) end end diff --git a/lib/api/group_labels.rb b/lib/api/group_labels.rb index 559e6a25f35..3b74dbebb3e 100644 --- a/lib/api/group_labels.rb +++ b/lib/api/group_labels.rb @@ -2,6 +2,7 @@ module API class GroupLabels < Grape::API + include ::API::Helpers::LabelHelpers include PaginationParams before { authenticate! } @@ -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 @@ -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 @@ -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 diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index f769a5f78c0..5fbe9922623 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -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) diff --git a/lib/api/helpers/label_helpers.rb b/lib/api/helpers/label_helpers.rb new file mode 100644 index 00000000000..f444358ebe0 --- /dev/null +++ b/lib/api/helpers/label_helpers.rb @@ -0,0 +1,94 @@ +# 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 diff --git a/lib/api/labels.rb b/lib/api/labels.rb index 53629fc313e..d464754411a 100644 --- a/lib/api/labels.rb +++ b/lib/api/labels.rb @@ -2,6 +2,7 @@ module API class Labels < Grape::API + include ::API::Helpers::LabelHelpers include PaginationParams before { authenticate! } @@ -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 @@ -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 diff --git a/lib/api/subscriptions.rb b/lib/api/subscriptions.rb index 10d747e231e..b219a22f924 100644 --- a/lib/api/subscriptions.rb +++ b/lib/api/subscriptions.rb @@ -2,6 +2,8 @@ module API class Subscriptions < Grape::API + include ::API::Helpers::LabelHelpers + before { authenticate! } subscribables = [ @@ -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 @@ -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 |