vulnerability_issue_links.rb 2.72 KB
Newer Older
1 2 3
# frozen_string_literal: true

module API
Stan Hu's avatar
Stan Hu committed
4
  class VulnerabilityIssueLinks < Grape::API::Instance
5 6 7 8 9 10 11 12
    include ::API::Helpers::VulnerabilitiesHooks

    helpers ::API::Helpers::VulnerabilitiesHelpers

    helpers do
      def find_vulnerability!
        Vulnerability.find(params[:id])
      end
13 14 15 16 17 18 19 20

      def render_issue_link_response(response)
        if response.success?
          present(response.payload[:record], with: EE::API::Entities::VulnerabilityIssueLink)
        else
          render_api_error!(response.message, response.http_status)
        end
      end
21 22 23 24

      def find_issue_link!
        ::Vulnerabilities::IssueLink.find(params[:issue_link_id])
      end
25 26 27 28 29 30 31 32 33 34 35
    end

    params do
      requires :id, type: Integer, desc: 'The ID of a vulnerability'
    end
    resource :vulnerabilities do
      desc 'Get related issues for a vulnerability' do
        success EE::API::Entities::VulnerabilityRelatedIssue
      end
      get ':id/issue_links' do
        vulnerability = find_and_authorize_vulnerability!(:read_vulnerability)
36 37
        related_issues = vulnerability.related_issues.with_api_entity_associations.with_vulnerability_links
        present Ability.issues_readable_by_user(related_issues, current_user),
38 39
                with: EE::API::Entities::VulnerabilityRelatedIssue
      end
40 41 42 43 44 45

      desc 'Relate an issue to a vulnerability' do
        success EE::API::Entities::VulnerabilityIssueLink
      end
      params do
        requires :target_issue_iid, type: Integer, desc: 'The IID of an issue to relate to'
46
        optional :target_project_id, type: String, desc: 'The ID of the target project'
47 48 49 50
        optional :link_type, type: String, default: 'related', desc: 'Link type'
      end
      post ':id/issue_links' do
        vulnerability = find_and_authorize_vulnerability!(:admin_vulnerability_issue_link)
51
        issue = find_project_issue(params[:target_issue_iid], params[:target_project_id].presence || vulnerability.project_id)
52 53 54 55 56 57

        response = ::VulnerabilityIssueLinks::CreateService.new(
          current_user, vulnerability, issue, link_type: params[:link_type]).execute

        render_issue_link_response(response)
      end
58 59 60 61 62 63 64 65

      desc 'Delete a link between an issue and a vulnerability' do
        success EE::API::Entities::VulnerabilityIssueLink
      end
      params do
        requires :issue_link_id, type: Integer, desc: 'The ID of a vulnerability-issue-link to delete'
      end
      delete ':id/issue_links/:issue_link_id' do
66
        find_and_authorize_vulnerability!(:admin_vulnerability_issue_link)
67 68 69 70 71 72
        issue_link = find_issue_link!

        service_response = ::VulnerabilityIssueLinks::DeleteService.new(current_user, issue_link).execute

        render_issue_link_response(service_response)
      end
73 74 75
    end
  end
end