in backend/plugins/jira/tasks/issue_changelog_convertor.go [54:174]
func ConvertIssueChangelogs(subtaskCtx plugin.SubTaskContext) errors.Error {
data := subtaskCtx.GetData().(*JiraTaskData)
db := subtaskCtx.GetDal()
logger := subtaskCtx.GetLogger()
connectionId := data.Options.ConnectionId
boardId := data.Options.BoardId
var allStatus []models.JiraStatus
err := db.All(&allStatus, dal.Where("connection_id = ?", connectionId))
if err != nil {
return err
}
statusMap := make(map[string]models.JiraStatus)
for _, v := range allStatus {
statusMap[v.ID] = v
}
issueFieldMap, err := getIssueFieldMap(db, connectionId, logger)
if err != nil {
return err
}
issueIdGenerator := didgen.NewDomainIdGenerator(&models.JiraIssue{})
sprintIdGenerator := didgen.NewDomainIdGenerator(&models.JiraSprint{})
changelogIdGenerator := didgen.NewDomainIdGenerator(&models.JiraIssueChangelogItems{})
accountIdGen := didgen.NewDomainIdGenerator(&models.JiraAccount{})
converter, err := api.NewStatefulDataConverter(&api.StatefulDataConverterArgs[IssueChangelogItemResult]{
SubtaskCommonArgs: &api.SubtaskCommonArgs{
SubTaskContext: subtaskCtx,
Table: RAW_ISSUE_TABLE,
Params: JiraApiParams{
ConnectionId: data.Options.ConnectionId,
BoardId: data.Options.BoardId,
},
},
Input: func(stateManager *api.SubtaskStateManager) (dal.Rows, errors.Error) {
clauses := []dal.Clause{
dal.Select("_tool_jira_issue_changelog_items.*, _tool_jira_issue_changelogs.issue_id, author_account_id, author_display_name, created"),
dal.From("_tool_jira_issue_changelog_items"),
dal.Join(`left join _tool_jira_issue_changelogs on (
_tool_jira_issue_changelogs.connection_id = _tool_jira_issue_changelog_items.connection_id
AND _tool_jira_issue_changelogs.changelog_id = _tool_jira_issue_changelog_items.changelog_id
)`),
dal.Join(`left join _tool_jira_board_issues on (
_tool_jira_board_issues.connection_id = _tool_jira_issue_changelogs.connection_id
AND _tool_jira_board_issues.issue_id = _tool_jira_issue_changelogs.issue_id
)`),
dal.Where("_tool_jira_issue_changelog_items.connection_id = ? AND _tool_jira_board_issues.board_id = ?", connectionId, boardId),
}
if stateManager.IsIncremental() {
since := stateManager.GetSince()
if since != nil {
clauses = append(clauses, dal.Where("_tool_jira_issue_changelog_items.created_at >= ? ", since))
}
}
return db.Cursor(clauses...)
},
Convert: func(row *IssueChangelogItemResult) ([]interface{}, errors.Error) {
changelog := &ticket.IssueChangelogs{
DomainEntity: domainlayer.DomainEntity{Id: changelogIdGenerator.Generate(
row.ConnectionId,
row.ChangelogId,
row.Field,
)},
IssueId: issueIdGenerator.Generate(row.ConnectionId, row.IssueId),
AuthorId: accountIdGen.Generate(connectionId, row.AuthorAccountId),
AuthorName: row.AuthorDisplayName,
FieldId: row.FieldId,
FieldName: row.Field,
OriginalFromValue: row.FromString,
OriginalToValue: row.ToString,
CreatedDate: row.Created,
}
switch row.Field {
case "assignee", "reporter":
if row.FromValue != "" {
changelog.OriginalFromValue = accountIdGen.Generate(connectionId, row.FromValue)
}
if row.ToValue != "" {
changelog.OriginalToValue = accountIdGen.Generate(connectionId, row.ToValue)
}
case "Sprint":
changelog.OriginalFromValue, err = convertIds(row.FromValue, connectionId, sprintIdGenerator)
if err != nil {
return nil, err
}
changelog.OriginalToValue, err = convertIds(row.ToValue, connectionId, sprintIdGenerator)
if err != nil {
return nil, err
}
case "status":
if fromStatus, ok := statusMap[row.FromValue]; ok {
changelog.OriginalFromValue = fromStatus.Name
changelog.FromValue = getStdStatus(fromStatus.StatusCategory)
}
if toStatus, ok := statusMap[row.ToValue]; ok {
changelog.OriginalToValue = toStatus.Name
changelog.ToValue = getStdStatus(toStatus.StatusCategory)
}
default:
if v, ok := issueFieldMap[row.Field]; ok && v.SchemaType == "user" {
if row.FromValue != "" {
changelog.OriginalFromValue = accountIdGen.Generate(connectionId, row.FromValue)
}
if row.ToValue != "" {
changelog.OriginalToValue = accountIdGen.Generate(connectionId, row.ToValue)
}
}
}
return []interface{}{changelog}, nil
},
})
if err != nil {
return err
}
return converter.Execute()
}