This is an automated email from the ASF dual-hosted git repository.
lynwee pushed a commit to branch dev-1
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/dev-1 by this push:
new daffbd35c feat(jira): collector account from issue changelog items as
much as possible
daffbd35c is described below
commit daffbd35c250b65c101da5f0254cb58e403e747c
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)
}