This is an automated email from the ASF dual-hosted git repository.

lynwee pushed a commit to branch 10-cp
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git

commit 0ff0799ab793ecfc00613704370132aa36f89591
Author: d4x1 <[email protected]>
AuthorDate: Tue Jul 9 15:30:37 2024 +0800

    feat(jira): collector account from issue changelog items as much as possible
---
 backend/plugins/jira/models/issue_changelog.go     | 20 ++++----
 ...9_add_tmp_account_id_to_issue_changelog_item.go | 49 ++++++++++++++++++++
 .../jira/models/migrationscripts/register.go       |  1 +
 .../plugins/jira/tasks/apiv2models/changelog.go    | 54 ++++++++++++++--------
 .../jira/tasks/issue_changelog_convertor.go        | 26 +++++++++--
 .../jira/tasks/issue_changelog_extractor.go        |  5 +-
 6 files changed, 120 insertions(+), 35 deletions(-)

diff --git a/backend/plugins/jira/models/issue_changelog.go 
b/backend/plugins/jira/models/issue_changelog.go
index e1dbfe871..927c47e67 100644
--- a/backend/plugins/jira/models/issue_changelog.go
+++ b/backend/plugins/jira/models/issue_changelog.go
@@ -40,15 +40,17 @@ type JiraIssueChangelogItems struct {
        common.NoPKModel
 
        // collected fields
-       ConnectionId uint64 `gorm:"primaryKey"`
-       ChangelogId  uint64 `gorm:"primaryKey"`
-       Field        string `gorm:"primaryKey"`
-       FieldType    string
-       FieldId      string
-       FromValue    string
-       FromString   string
-       ToValue      string
-       ToString     string
+       ConnectionId     uint64 `gorm:"primaryKey"`
+       ChangelogId      uint64 `gorm:"primaryKey"`
+       Field            string `gorm:"primaryKey"`
+       FieldType        string
+       FieldId          string
+       FromValue        string
+       FromString       string
+       ToValue          string
+       ToString         string
+       TmpFromAccountId string
+       TmpToAccountId   string
 }
 
 func (JiraIssueChangelogs) TableName() string {
diff --git 
a/backend/plugins/jira/models/migrationscripts/20240709_add_tmp_account_id_to_issue_changelog_item.go
 
b/backend/plugins/jira/models/migrationscripts/20240709_add_tmp_account_id_to_issue_changelog_item.go
new file mode 100644
index 000000000..594ec38f2
--- /dev/null
+++ 
b/backend/plugins/jira/models/migrationscripts/20240709_add_tmp_account_id_to_issue_changelog_item.go
@@ -0,0 +1,49 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package migrationscripts
+
+import (
+       "github.com/apache/incubator-devlake/core/context"
+       "github.com/apache/incubator-devlake/core/errors"
+       "github.com/apache/incubator-devlake/core/plugin"
+)
+
+var _ plugin.MigrationScript = (*addTmpAccountIdToJiraIssueChangelogItem)(nil)
+
+type jiraIssueChangelogItems20240709 struct {
+       TmpFromAccountId string
+       TmpToAccountId   string
+}
+
+func (jiraIssueChangelogItems20240709) TableName() string {
+       return "_tool_jira_issue_changelogs"
+}
+
+type addTmpAccountIdToJiraIssueChangelogItem struct{}
+
+func (script *addTmpAccountIdToJiraIssueChangelogItem) Up(basicRes 
context.BasicRes) errors.Error {
+       return basicRes.GetDal().AutoMigrate(&jiraIssueChangelogItems20240709{})
+}
+
+func (*addTmpAccountIdToJiraIssueChangelogItem) Version() uint64 {
+       return 20240709134200
+}
+
+func (*addTmpAccountIdToJiraIssueChangelogItem) Name() string {
+       return "add TmpFromAccountId and TmpToAccountId to 
_tool_jira_issue_changelogs"
+}
diff --git a/backend/plugins/jira/models/migrationscripts/register.go 
b/backend/plugins/jira/models/migrationscripts/register.go
index be88eda7d..4507c5841 100644
--- a/backend/plugins/jira/models/migrationscripts/register.go
+++ b/backend/plugins/jira/models/migrationscripts/register.go
@@ -49,5 +49,6 @@ func All() []plugin.MigrationScript {
                new(addFilterJQL),
                new(addWorklogToIssue),
                new(addSubtaskToIssue),
+               new(addTmpAccountIdToJiraIssueChangelogItem),
        }
 }
diff --git a/backend/plugins/jira/tasks/apiv2models/changelog.go 
b/backend/plugins/jira/tasks/apiv2models/changelog.go
index d3dee330d..5c5c2c2a6 100644
--- a/backend/plugins/jira/tasks/apiv2models/changelog.go
+++ b/backend/plugins/jira/tasks/apiv2models/changelog.go
@@ -46,38 +46,54 @@ func (c Changelog) ToToolLayer(connectionId, issueId 
uint64, issueUpdated *time.
 }
 
 type ChangelogItem struct {
-       Field      string `json:"field"`
-       Fieldtype  string `json:"fieldtype"`
+       Field     string `json:"field"`
+       Fieldtype string `json:"fieldtype"`
+       FieldId   string `json:"fieldId"`
+
        FromValue  string `json:"from"`
        FromString string `json:"fromString"`
-       ToValue    string `json:"to"`
-       ToString   string `json:"toString"`
+
+       ToValue  string `json:"to"`
+       ToString string `json:"toString"`
+
+       TmpFromAccountId string `json:"tmpFromAccountId,omitempty"`
+       TmpToAccountId   string `json:"tmpToAccountId,omitempty"`
 }
 
 func (c ChangelogItem) ToToolLayer(connectionId, changelogId uint64) 
*models.JiraIssueChangelogItems {
        item := &models.JiraIssueChangelogItems{
-               ConnectionId: connectionId,
-               ChangelogId:  changelogId,
-               Field:        c.Field,
-               FieldType:    c.Fieldtype,
-               FromValue:    c.FromValue,
-               FromString:   c.FromString,
-               ToValue:      c.ToValue,
-               ToString:     c.ToString,
+               ConnectionId:     connectionId,
+               ChangelogId:      changelogId,
+               Field:            c.Field,
+               FieldType:        c.Fieldtype,
+               FromValue:        c.FromValue,
+               FromString:       c.FromString,
+               ToValue:          c.ToValue,
+               ToString:         c.ToString,
+               TmpFromAccountId: c.TmpFromAccountId,
+               TmpToAccountId:   c.TmpToAccountId,
        }
        return item
 }
 
 func (c ChangelogItem) ExtractUser(connectionId uint64) []*models.JiraAccount {
-       if c.Field != "assignee" {
-               return nil
-       }
        var result []*models.JiraAccount
-       if c.FromValue != "" {
-               result = append(result, &models.JiraAccount{ConnectionId: 
connectionId, AccountId: c.FromValue})
+       // if `tmpFromAccountId` or `tmpToAccountId` is not empty, then this 
change log item stands for changes about accounts.
+       if c.TmpFromAccountId != "" {
+               // User `from` firstly
+               if c.FromValue != "" {
+                       result = append(result, 
&models.JiraAccount{ConnectionId: connectionId, AccountId: c.FromValue})
+               } else {
+                       result = append(result, 
&models.JiraAccount{ConnectionId: connectionId, AccountId: c.TmpFromAccountId})
+               }
        }
-       if c.ToValue != "" {
-               result = append(result, &models.JiraAccount{ConnectionId: 
connectionId, AccountId: c.ToValue})
+       if c.TmpToAccountId != "" {
+               // User `to` firstly
+               if c.ToValue != "" {
+                       result = append(result, 
&models.JiraAccount{ConnectionId: connectionId, AccountId: c.ToValue})
+               } else {
+                       result = append(result, 
&models.JiraAccount{ConnectionId: connectionId, AccountId: c.TmpToAccountId})
+               }
        }
        return result
 }
diff --git a/backend/plugins/jira/tasks/issue_changelog_convertor.go 
b/backend/plugins/jira/tasks/issue_changelog_convertor.go
index d1db33467..e575c2356 100644
--- a/backend/plugins/jira/tasks/issue_changelog_convertor.go
+++ b/backend/plugins/jira/tasks/issue_changelog_convertor.go
@@ -119,15 +119,15 @@ func ConvertIssueChangelogs(subtaskCtx 
plugin.SubTaskContext) errors.Error {
                                OriginalToValue:   row.ToString,
                                CreatedDate:       row.Created,
                        }
-                       if row.Field == "assignee" {
+                       switch row.Field {
+                       case "assignee":
                                if row.ToValue != "" {
                                        changelog.OriginalToValue = 
accountIdGen.Generate(connectionId, row.ToValue)
                                }
                                if row.FromValue != "" {
                                        changelog.OriginalFromValue = 
accountIdGen.Generate(connectionId, row.FromValue)
                                }
-                       }
-                       if row.Field == "Sprint" {
+                       case "Sprint":
                                changelog.OriginalFromValue, err = 
convertIds(row.FromValue, connectionId, sprintIdGenerator)
                                if err != nil {
                                        return nil, err
@@ -136,8 +136,7 @@ func ConvertIssueChangelogs(subtaskCtx 
plugin.SubTaskContext) errors.Error {
                                if err != nil {
                                        return nil, err
                                }
-                       }
-                       if row.Field == "status" {
+                       case "status":
                                if fromStatus, ok := statusMap[row.FromValue]; 
ok {
                                        changelog.OriginalFromValue = 
fromStatus.Name
                                        changelog.FromValue = 
getStdStatus(fromStatus.StatusCategory)
@@ -146,7 +145,24 @@ func ConvertIssueChangelogs(subtaskCtx 
plugin.SubTaskContext) errors.Error {
                                        changelog.OriginalToValue = 
toStatus.Name
                                        changelog.ToValue = 
getStdStatus(toStatus.StatusCategory)
                                }
+                       default:
+                               // process other account-like fields
+                               if row.TmpFromAccountId != "" {
+                                       if row.FromValue != "" {
+                                               changelog.OriginalFromValue = 
accountIdGen.Generate(connectionId, row.FromValue)
+                                       } else {
+                                               changelog.OriginalFromValue = 
accountIdGen.Generate(connectionId, row.TmpFromAccountId)
+                                       }
+                               }
+                               if row.TmpToAccountId != "" {
+                                       if row.ToValue != "" {
+                                               changelog.OriginalToValue = 
accountIdGen.Generate(connectionId, row.ToValue)
+                                       } else {
+                                               changelog.OriginalToValue = 
accountIdGen.Generate(connectionId, row.TmpToAccountId)
+                                       }
+                               }
                        }
+
                        return []interface{}{changelog}, nil
 
                },
diff --git a/backend/plugins/jira/tasks/issue_changelog_extractor.go 
b/backend/plugins/jira/tasks/issue_changelog_extractor.go
index 66d9247a6..f333f82c2 100644
--- a/backend/plugins/jira/tasks/issue_changelog_extractor.go
+++ b/backend/plugins/jira/tasks/issue_changelog_extractor.go
@@ -69,7 +69,7 @@ func ExtractIssueChangelogs(subtaskCtx plugin.SubTaskContext) 
errors.Error {
                        cl, user := changelog.ToToolLayer(connectionId, 
input.IssueId, &input.UpdateTime)
                        // this is crucial for incremental update
                        cl.IssueUpdated = &input.UpdateTime
-                       // collect changelog / user inforation
+                       // collect changelog / user information
                        result = append(result, cl)
                        if user != nil {
                                result = append(result, user)
@@ -77,7 +77,8 @@ func ExtractIssueChangelogs(subtaskCtx plugin.SubTaskContext) 
errors.Error {
                        // collect changelog_items
                        for _, item := range changelog.Items {
                                result = append(result, 
item.ToToolLayer(connectionId, changelog.ID))
-                               for _, u := range 
item.ExtractUser(connectionId) {
+                               extractedUsersFromChangelogItem := 
item.ExtractUser(connectionId)
+                               for _, u := range 
extractedUsersFromChangelogItem {
                                        if u != nil && u.AccountId != "" {
                                                result = append(result, u)
                                        }

Reply via email to