summaryrefslogtreecommitdiff
path: root/lib/gitlab/jira_import/issue_serializer.rb
blob: cdcb62ac6e9b76a3cd7cf820988e80c821c6c43f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# frozen_string_literal: true

module Gitlab
  module JiraImport
    class IssueSerializer
      attr_reader :jira_issue, :project, :params, :formatter
      attr_accessor :metadata

      def initialize(project, jira_issue, params = {})
        @jira_issue = jira_issue
        @project = project
        @params = params
        @formatter = Gitlab::ImportFormatter.new
        @metadata = []
      end

      def execute
        {
          iid: params[:iid],
          project_id: project.id,
          description: description,
          title: title,
          state_id: map_status(jira_issue.status.statusCategory),
          updated_at: jira_issue.updated,
          created_at: jira_issue.created,
          author_id: project.creator_id # TODO: map actual author: https://gitlab.com/gitlab-org/gitlab/-/issues/210580
        }
      end

      private

      def title
        "[#{jira_issue.key}] #{jira_issue.summary}"
      end

      def description
        body = []
        body << formatter.author_line(jira_issue.reporter.displayName)
        body << formatter.assignee_line(jira_issue.assignee.displayName) if jira_issue.assignee
        body << jira_issue.description
        body << add_metadata

        body.join
      end

      def map_status(jira_status_category)
        case jira_status_category["key"].downcase
        when 'done'
          Issuable::STATE_ID_MAP[:closed]
        else
          Issuable::STATE_ID_MAP[:opened]
        end
      end

      def add_metadata
        add_field(%w(issuetype name), 'Issue type')
        add_field(%w(priority name), 'Priority')
        add_labels
        add_field('environment', 'Environment')
        add_field('duedate', 'Due date')
        add_parent
        add_versions

        return if metadata.empty?

        metadata.join("\n").prepend("\n\n---\n\n**Issue metadata**\n\n")
      end

      def add_field(keys, field_label)
        value = fields.dig(*keys)
        return if value.blank?

        metadata << "- #{field_label}: #{value}"
      end

      def add_labels
        return if fields['labels'].blank?

        metadata << "- Labels: #{fields['labels'].join(', ')}"
      end

      def add_parent
        parent_issue_key = fields.dig('parent', 'key')
        return if parent_issue_key.blank?

        metadata << "- Parent issue: [#{parent_issue_key}] #{fields['parent']['fields']['summary']}"
      end

      def add_versions
        return if fields['fixVersions'].blank?

        metadata << "- Fix versions: #{fields['fixVersions'].map { |version| version['name'] }.join(', ')}"
      end

      def fields
        jira_issue.fields
      end
    end
  end
end