func ConvertIssueChangelogs()

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()
}