Merge pull request #1691 from merico-dev/fix#1690

fix: missing users for plugin jira
diff --git a/plugins/jira/jira.go b/plugins/jira/jira.go
index 5003ace..465eb5c 100644
--- a/plugins/jira/jira.go
+++ b/plugins/jira/jira.go
@@ -69,7 +69,10 @@
 		{Name: "convertSprints", EntryPoint: tasks.ConvertSprints, EnabledByDefault: true, Description: "convert Jira sprints"},
 
 		{Name: "convertIssueCommits", EntryPoint: tasks.ConvertIssueCommits, EnabledByDefault: true, Description: "convert Jira issue commits"},
-		{Name: "convertIssueRepoCommits", EntryPoint: tasks.ConvertIssueRepoCommits, EnabledByDefault: false, Description: "convert Jira issue repo commits"}}
+		{Name: "convertIssueRepoCommits", EntryPoint: tasks.ConvertIssueRepoCommits, EnabledByDefault: false, Description: "convert Jira issue repo commits"},
+
+		{Name: "ConvertUsers", EntryPoint: tasks.ConvertUsers, EnabledByDefault: true, Description: "convert Jira users"},
+	}
 }
 
 func (plugin Jira) PrepareTaskData(taskCtx core.TaskContext, options map[string]interface{}) (interface{}, error) {
diff --git a/plugins/jira/tasks/apiv2models/changelog.go b/plugins/jira/tasks/apiv2models/changelog.go
index a6806a9..c811e3b 100644
--- a/plugins/jira/tasks/apiv2models/changelog.go
+++ b/plugins/jira/tasks/apiv2models/changelog.go
@@ -7,27 +7,13 @@
 )
 
 type Changelog struct {
-	ID     uint64 `json:"id,string"`
-	Author struct {
-		Self         string `json:"self"`
-		Name         string `json:"name"`
-		Key          string `json:"key"`
-		EmailAddress string `json:"emailAddress"`
-		AvatarUrls   struct {
-			Four8X48  string `json:"48x48"`
-			Two4X24   string `json:"24x24"`
-			One6X16   string `json:"16x16"`
-			Three2X32 string `json:"32x32"`
-		} `json:"avatarUrls"`
-		DisplayName string `json:"displayName"`
-		Active      bool   `json:"active"`
-		TimeZone    string `json:"timeZone"`
-	} `json:"author"`
+	ID      uint64           `json:"id,string"`
+	Author  User             `json:"author"`
 	Created core.Iso8601Time `json:"created"`
 	Items   []ChangelogItem  `json:"items"`
 }
 
-func (c Changelog) ToToolLayer(sourceId, issueId uint64) *models.JiraChangelog {
+func (c Changelog) ToToolLayer(sourceId, issueId uint64) (*models.JiraChangelog, *models.JiraUser) {
 	return &models.JiraChangelog{
 		SourceId:          sourceId,
 		ChangelogId:       c.ID,
@@ -36,7 +22,7 @@
 		AuthorDisplayName: c.Author.DisplayName,
 		AuthorActive:      c.Author.Active,
 		Created:           c.Created.ToTime(),
-	}
+	}, c.Author.ToToolLayer(sourceId)
 }
 
 type ChangelogItem struct {
diff --git a/plugins/jira/tasks/apiv2models/issue.go b/plugins/jira/tasks/apiv2models/issue.go
index ba93c6c..8dd79a4 100644
--- a/plugins/jira/tasks/apiv2models/issue.go
+++ b/plugins/jira/tasks/apiv2models/issue.go
@@ -106,22 +106,8 @@
 		Summary               string        `json:"summary"`
 		Creator               User          `json:"creator"`
 		Subtasks              []interface{} `json:"subtasks"`
-		Reporter              struct {
-			Self         string `json:"self"`
-			Name         string `json:"name"`
-			Key          string `json:"key"`
-			EmailAddress string `json:"emailAddress"`
-			AvatarUrls   struct {
-				Four8X48  string `json:"48x48"`
-				Two4X24   string `json:"24x24"`
-				One6X16   string `json:"16x16"`
-				Three2X32 string `json:"32x32"`
-			} `json:"avatarUrls"`
-			DisplayName string `json:"displayName"`
-			Active      bool   `json:"active"`
-			TimeZone    string `json:"timeZone"`
-		} `json:"reporter"`
-		Aggregateprogress struct {
+		Reporter              User          `json:"reporter"`
+		Aggregateprogress     struct {
 			Progress int `json:"progress"`
 			Total    int `json:"total"`
 		} `json:"aggregateprogress"`
@@ -248,11 +234,12 @@
 	return resp.Issues, nil
 }
 
-func (i Issue) ExtractEntities(sourceId uint64, epicField, storyPointField string) ([]uint64, *models.JiraIssue, bool, []*models.JiraWorklog, []*models.JiraChangelog, []*models.JiraChangelogItem) {
+func (i Issue) ExtractEntities(sourceId uint64, epicField, storyPointField string) ([]uint64, *models.JiraIssue, bool, []*models.JiraWorklog, []*models.JiraChangelog, []*models.JiraChangelogItem, []*models.JiraUser) {
 	issue := i.toToolLayer(sourceId, epicField, storyPointField)
 	var worklogs []*models.JiraWorklog
 	var changelogs []*models.JiraChangelog
 	var changelogItems []*models.JiraChangelogItem
+	var users []*models.JiraUser
 	var needCollectWorklog bool
 	var sprints []uint64
 	if i.Fields.Worklog != nil {
@@ -266,7 +253,9 @@
 	}
 	if i.Changelog != nil {
 		for _, changelog := range i.Changelog.Histories {
-			changelogs = append(changelogs, changelog.ToToolLayer(sourceId, i.ID))
+			cl, user := changelog.ToToolLayer(sourceId, i.ID)
+			changelogs = append(changelogs, cl)
+			users = append(users, user)
 			for _, item := range changelog.Items {
 				changelogItems = append(changelogItems, item.ToToolLayer(sourceId, changelog.ID))
 			}
@@ -278,5 +267,9 @@
 	for _, sprint := range i.Fields.ClosedSprints {
 		sprints = append(sprints, sprint.ID)
 	}
-	return sprints, issue, needCollectWorklog, worklogs, changelogs, changelogItems
+	users = append(users, i.Fields.Creator.ToToolLayer(sourceId), i.Fields.Reporter.ToToolLayer(sourceId))
+	if i.Fields.Assignee != nil {
+		users = append(users, i.Fields.Assignee.ToToolLayer(sourceId))
+	}
+	return sprints, issue, needCollectWorklog, worklogs, changelogs, changelogItems, users
 }
diff --git a/plugins/jira/tasks/changelog_extractor.go b/plugins/jira/tasks/changelog_extractor.go
index 594a90e..b5fd7da 100644
--- a/plugins/jira/tasks/changelog_extractor.go
+++ b/plugins/jira/tasks/changelog_extractor.go
@@ -44,7 +44,8 @@
 			if err != nil {
 				return nil, err
 			}
-			result = append(result, changelog.ToToolLayer(sourceId, input.IssueId))
+			cl, user := changelog.ToToolLayer(sourceId, input.IssueId)
+			result = append(result, cl, user)
 			for _, item := range changelog.Items {
 				result = append(result, item.ToToolLayer(sourceId, changelog.ID))
 			}
diff --git a/plugins/jira/tasks/issues_extractor.go b/plugins/jira/tasks/issues_extractor.go
index f8bd08f..d0d2739 100644
--- a/plugins/jira/tasks/issues_extractor.go
+++ b/plugins/jira/tasks/issues_extractor.go
@@ -85,7 +85,7 @@
 				return nil, err
 			}
 			var results []interface{}
-			sprints, issue, _, worklogs, changelogs, changelogItems := apiIssue.ExtractEntities(data.Source.ID, data.Source.EpicKeyField, data.Source.StoryPointField)
+			sprints, issue, _, worklogs, changelogs, changelogItems, users := apiIssue.ExtractEntities(data.Source.ID, data.Source.EpicKeyField, data.Source.StoryPointField)
 			for _, sprintId := range sprints {
 				sprintIssue := &models.JiraSprintIssue{
 					SourceId: data.Source.ID,
@@ -111,6 +111,9 @@
 			for _, changelogItem := range changelogItems {
 				results = append(results, changelogItem)
 			}
+			for _, user := range users {
+				results = append(results, user)
+			}
 			results = append(results, &models.JiraBoardIssue{
 				SourceId: sourceId,
 				BoardId:  boardId,