101 lines
2.6 KiB
Ruby
101 lines
2.6 KiB
Ruby
|
# 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
|