Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-08-21 12:10:08 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-08-21 12:10:08 +0300
commit202268ad93e9a1556f5700326be5ec89bd641a97 (patch)
treedb1faf51de8859ccd812e4a6ed61284cc3bb6a9a /lib
parent3c63ea4631f629f83c7d35e65963ffc1acf83161 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib')
-rw-r--r--lib/api/api.rb1
-rw-r--r--lib/api/entities/issue_link.rb11
-rw-r--r--lib/api/entities/related_issue.rb10
-rw-r--r--lib/api/helpers/services_helpers.rb12
-rw-r--r--lib/api/issue_links.rb82
5 files changed, 104 insertions, 12 deletions
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 2be6792af5f..cf367438ff4 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -167,6 +167,7 @@ module API
mount ::API::GroupVariables
mount ::API::ImportBitbucketServer
mount ::API::ImportGithub
+ mount ::API::IssueLinks
mount ::API::Issues
mount ::API::JobArtifacts
mount ::API::Jobs
diff --git a/lib/api/entities/issue_link.rb b/lib/api/entities/issue_link.rb
new file mode 100644
index 00000000000..8e24b046325
--- /dev/null
+++ b/lib/api/entities/issue_link.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class IssueLink < Grape::Entity
+ expose :source, as: :source_issue, using: ::API::Entities::IssueBasic
+ expose :target, as: :target_issue, using: ::API::Entities::IssueBasic
+ expose :link_type
+ end
+ end
+end
diff --git a/lib/api/entities/related_issue.rb b/lib/api/entities/related_issue.rb
new file mode 100644
index 00000000000..491c606bd49
--- /dev/null
+++ b/lib/api/entities/related_issue.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class RelatedIssue < ::API::Entities::Issue
+ expose :issue_link_id
+ expose :issue_link_type, as: :link_type
+ end
+ end
+end
diff --git a/lib/api/helpers/services_helpers.rb b/lib/api/helpers/services_helpers.rb
index ff938358439..94d773367a8 100644
--- a/lib/api/helpers/services_helpers.rb
+++ b/lib/api/helpers/services_helpers.rb
@@ -631,12 +631,6 @@ module API
name: :issues_url,
type: String,
desc: 'The issues URL'
- },
- {
- required: false,
- name: :description,
- type: String,
- desc: 'The description of the tracker'
}
],
'youtrack' => [
@@ -651,12 +645,6 @@ module API
name: :issues_url,
type: String,
desc: 'The issues URL'
- },
- {
- required: false,
- name: :description,
- type: String,
- desc: 'The description of the tracker'
}
],
'slack' => [
diff --git a/lib/api/issue_links.rb b/lib/api/issue_links.rb
new file mode 100644
index 00000000000..6cc5b344f47
--- /dev/null
+++ b/lib/api/issue_links.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+module API
+ class IssueLinks < Grape::API::Instance
+ include PaginationParams
+
+ before { authenticate! }
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ requires :issue_iid, type: Integer, desc: 'The internal ID of a project issue'
+ end
+ resource :projects, requirements: { id: %r{[^/]+} } do
+ desc 'Get related issues' do
+ success Entities::RelatedIssue
+ end
+ get ':id/issues/:issue_iid/links' do
+ source_issue = find_project_issue(params[:issue_iid])
+ related_issues = source_issue.related_issues(current_user)
+
+ present related_issues,
+ with: Entities::RelatedIssue,
+ current_user: current_user,
+ project: user_project
+ end
+
+ desc 'Relate issues' do
+ success Entities::IssueLink
+ end
+ params do
+ requires :target_project_id, type: String, desc: 'The ID of the target project'
+ requires :target_issue_iid, type: Integer, desc: 'The IID of the target issue'
+ optional :link_type, type: String, values: IssueLink.link_types.keys,
+ desc: 'The type of the relation'
+ end
+ # rubocop: disable CodeReuse/ActiveRecord
+ post ':id/issues/:issue_iid/links' do
+ source_issue = find_project_issue(params[:issue_iid])
+ target_issue = find_project_issue(declared_params[:target_issue_iid],
+ declared_params[:target_project_id])
+
+ create_params = { target_issuable: target_issue, link_type: declared_params[:link_type] }
+
+ result = ::IssueLinks::CreateService
+ .new(source_issue, current_user, create_params)
+ .execute
+
+ if result[:status] == :success
+ issue_link = IssueLink.find_by!(source: source_issue, target: target_issue)
+
+ present issue_link, with: Entities::IssueLink
+ else
+ render_api_error!(result[:message], result[:http_status])
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ desc 'Remove issues relation' do
+ success Entities::IssueLink
+ end
+ params do
+ requires :issue_link_id, type: Integer, desc: 'The ID of an issue link'
+ end
+ delete ':id/issues/:issue_iid/links/:issue_link_id' do
+ issue_link = IssueLink.find(declared_params[:issue_link_id])
+
+ find_project_issue(params[:issue_iid])
+ find_project_issue(issue_link.target.iid.to_s, issue_link.target.project_id.to_s)
+
+ result = ::IssueLinks::DestroyService
+ .new(issue_link, current_user)
+ .execute
+
+ if result[:status] == :success
+ present issue_link, with: Entities::IssueLink
+ else
+ render_api_error!(result[:message], result[:http_status])
+ end
+ end
+ end
+ end
+end