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

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


The following commit(s) were added to refs/heads/main by this push:
     new 70819298 feat: collect jira status (#2182)
70819298 is described below

commit 70819298b2df729c6a48347d123372befec808ea
Author: NaRro <[email protected]>
AuthorDate: Wed Jun 15 10:48:29 2022 +0800

    feat: collect jira status (#2182)
    
    * feat: collect jira status
    
    * feat: add license header
    
    * feat: register migrations
    
    * fix: jira connection table name
    
    * feat: convert changelogs' standard status
    
    #2181
    
    * fix: sql error
    
    * fix: review request
    
    * fix: apache license
    
    * feat: update ticket.changelogs
    
    #2181
    
    * fix: changelog migration
---
 models/domainlayer/ticket/changelog.go             | 18 +++---
 models/migrationscripts/register.go                |  1 +
 models/migrationscripts/updateSchemas2022061402.go | 56 +++++++++++++++++
 plugins/jira/jira.go                               |  4 ++
 plugins/jira/models/connection.go                  | 12 +++-
 .../migrationscripts/updateSchemas20220614.go      | 45 ++++++++++----
 plugins/jira/{tasks/shared.go => models/status.go} | 28 ++++-----
 .../jira/tasks/apiv2models/status.go               | 40 ++++++------
 plugins/jira/tasks/changelog_convertor.go          | 41 ++++++++----
 plugins/jira/tasks/issue_collector.go              |  6 --
 plugins/jira/tasks/issue_convertor.go              |  2 +-
 plugins/jira/tasks/issue_extractor.go              | 14 +----
 plugins/jira/tasks/remotelink_collector.go         |  4 +-
 plugins/jira/tasks/shared.go                       | 26 ++++++++
 .../jira/tasks/{shared.go => status_collector.go}  | 38 +++++++++---
 plugins/jira/tasks/status_extractor.go             | 72 ++++++++++++++++++++++
 plugins/tapd/tasks/bug_changelog_converter.go      | 21 ++++---
 plugins/tapd/tasks/story_changelog_converter.go    | 16 ++---
 plugins/tapd/tasks/task_changelog_converter.go     | 16 ++---
 19 files changed, 335 insertions(+), 125 deletions(-)

diff --git a/models/domainlayer/ticket/changelog.go 
b/models/domainlayer/ticket/changelog.go
index 8ad5bd7e..70499ac3 100644
--- a/models/domainlayer/ticket/changelog.go
+++ b/models/domainlayer/ticket/changelog.go
@@ -27,12 +27,14 @@ type Changelog struct {
        domainlayer.DomainEntity
 
        // collected fields
-       IssueId     string `gorm:"index;type:varchar(255)"`
-       AuthorId    string `gorm:"type:varchar(255)"`
-       AuthorName  string `gorm:"type:varchar(255)"`
-       FieldId     string `gorm:"type:varchar(255)"`
-       FieldName   string `gorm:"type:varchar(255)"`
-       FromValue   string
-       ToValue     string
-       CreatedDate time.Time
+       IssueId           string `gorm:"index;type:varchar(255)"`
+       AuthorId          string `gorm:"type:varchar(255)"`
+       AuthorName        string `gorm:"type:varchar(255)"`
+       FieldId           string `gorm:"type:varchar(255)"`
+       FieldName         string `gorm:"type:varchar(255)"`
+       OriginalFromValue string
+       OriginalToValue   string
+       FromValue         string
+       ToValue           string
+       CreatedDate       time.Time
 }
diff --git a/models/migrationscripts/register.go 
b/models/migrationscripts/register.go
index aaa1beec..78fe8d13 100644
--- a/models/migrationscripts/register.go
+++ b/models/migrationscripts/register.go
@@ -27,5 +27,6 @@ func All() []migration.Script {
                new(updateSchemas20220513), new(updateSchemas20220524), 
new(updateSchemas20220526),
                new(updateSchemas20220527), new(updateSchemas20220528), 
new(updateSchemas20220601),
                new(updateSchemas20220602), new(updateSchemas20220613), 
new(updateSchemas20220614),
+               new(updateSchemas2022061402),
        }
 }
diff --git a/models/migrationscripts/updateSchemas2022061402.go 
b/models/migrationscripts/updateSchemas2022061402.go
new file mode 100644
index 00000000..928f23f5
--- /dev/null
+++ b/models/migrationscripts/updateSchemas2022061402.go
@@ -0,0 +1,56 @@
+/*
+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 (
+       "context"
+       "time"
+
+       "github.com/apache/incubator-devlake/models/migrationscripts/archived"
+       "gorm.io/gorm"
+)
+
+type Changelog20220614 struct {
+       archived.DomainEntity
+
+       // collected fields
+       IssueId           string `gorm:"index;type:varchar(255)"`
+       AuthorId          string `gorm:"type:varchar(255)"`
+       AuthorName        string `gorm:"type:varchar(255)"`
+       FieldId           string `gorm:"type:varchar(255)"`
+       FieldName         string `gorm:"type:varchar(255)"`
+       OriginalFromValue string
+       OriginalToValue   string
+       FromValue         string
+       ToValue           string
+       CreatedDate       time.Time
+}
+
+type updateSchemas2022061402 struct{}
+
+func (*updateSchemas2022061402) Up(ctx context.Context, db *gorm.DB) error {
+       return db.Migrator().AutoMigrate(&Changelog20220614{})
+}
+
+func (*updateSchemas2022061402) Version() uint64 {
+       return 20220614091600
+}
+
+func (*updateSchemas2022061402) Name() string {
+       return "update table: changelogs, add standard_from, standard_to"
+}
diff --git a/plugins/jira/jira.go b/plugins/jira/jira.go
index 0dc791ff..dd3ab769 100644
--- a/plugins/jira/jira.go
+++ b/plugins/jira/jira.go
@@ -55,6 +55,9 @@ func (plugin Jira) Description() string {
 
 func (plugin Jira) SubTaskMetas() []core.SubTaskMeta {
        return []core.SubTaskMeta{
+               {Name: "collectStatus", EntryPoint: tasks.CollectStatus, 
EnabledByDefault: true, Description: "collect Jira status"},
+               {Name: "extractStatus", EntryPoint: tasks.ExtractStatus, 
EnabledByDefault: true, Description: "extract Jira status"},
+
                {Name: "collectProjects", EntryPoint: tasks.CollectProjects, 
EnabledByDefault: true, Description: "collect Jira projects"},
                {Name: "extractProjects", EntryPoint: tasks.ExtractProjects, 
EnabledByDefault: true, Description: "extract Jira projects"},
 
@@ -164,6 +167,7 @@ func (plugin Jira) MigrationScripts() []migration.Script {
                new(migrationscripts.UpdateSchemas20220526),
                new(migrationscripts.UpdateSchemas20220527),
                new(migrationscripts.UpdateSchemas20220601),
+               new(migrationscripts.UpdateSchemas20220614),
        }
 }
 
diff --git a/plugins/jira/models/connection.go 
b/plugins/jira/models/connection.go
index fa0664f6..1a4b7a14 100644
--- a/plugins/jira/models/connection.go
+++ b/plugins/jira/models/connection.go
@@ -45,12 +45,20 @@ type JiraConnection struct {
        RemotelinkCommitShaPattern string 
`gorm:"type:varchar(255);comment='golang regexp, the first group will be 
recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" 
json:"remotelinkCommitShaPattern"`
 }
 
+func (JiraConnection) TableName() string {
+       return "_tool_jira_connections"
+}
+
 type JiraIssueTypeMapping struct {
        ConnectionID uint64 `gorm:"primaryKey" json:"jiraConnectionId" 
validate:"required"`
        UserType     string `gorm:"type:varchar(50);primaryKey" json:"userType" 
validate:"required"`
        StandardType string `gorm:"type:varchar(50)" json:"standardType" 
validate:"required"`
 }
 
+func (JiraIssueTypeMapping) TableName() string {
+       return "_tool_jira_issue_type_mappings"
+}
+
 type JiraIssueStatusMapping struct {
        ConnectionID   uint64 `gorm:"primaryKey" json:"jiraConnectionId" 
validate:"required"`
        UserType       string `gorm:"type:varchar(50);primaryKey" 
json:"userType" validate:"required"`
@@ -58,6 +66,6 @@ type JiraIssueStatusMapping struct {
        StandardStatus string `gorm:"type:varchar(50)" json:"standardStatus" 
validate:"required"`
 }
 
-func (JiraConnection) TableName() string {
-       return "_tool_jira_connections"
+func (JiraIssueStatusMapping) TableName() string {
+       return "_tool_jira_issue_status_mappings"
 }
diff --git a/models/migrationscripts/register.go 
b/plugins/jira/models/migrationscripts/updateSchemas20220614.go
similarity index 52%
copy from models/migrationscripts/register.go
copy to plugins/jira/models/migrationscripts/updateSchemas20220614.go
index aaa1beec..7d64d376 100644
--- a/models/migrationscripts/register.go
+++ b/plugins/jira/models/migrationscripts/updateSchemas20220614.go
@@ -17,15 +17,38 @@ limitations under the License.
 
 package migrationscripts
 
-import "github.com/apache/incubator-devlake/migration"
-
-// RegisterAll register all the migration scripts of framework
-func All() []migration.Script {
-       return []migration.Script{
-               new(initSchemas),
-               new(updateSchemas20220505), new(updateSchemas20220507), 
new(updateSchemas20220510),
-               new(updateSchemas20220513), new(updateSchemas20220524), 
new(updateSchemas20220526),
-               new(updateSchemas20220527), new(updateSchemas20220528), 
new(updateSchemas20220601),
-               new(updateSchemas20220602), new(updateSchemas20220613), 
new(updateSchemas20220614),
-       }
+import (
+       "context"
+
+       "github.com/apache/incubator-devlake/models/migrationscripts/archived"
+       "gorm.io/gorm"
+)
+
+type JiraStatus struct {
+       archived.NoPKModel
+       ConnectionId   uint64 `gorm:"primaryKey"`
+       ID             string `gorm:"primaryKey"`
+       Name           string
+       Self           string
+       StatusCategory string
+}
+
+func (JiraStatus) TableName() string {
+       return "_tool_jira_statuses"
+}
+
+type UpdateSchemas20220614 struct{}
+
+func (*UpdateSchemas20220614) Up(ctx context.Context, db *gorm.DB) error {
+       return db.Migrator().AutoMigrate(
+               &JiraStatus{},
+       )
+}
+
+func (*UpdateSchemas20220614) Version() uint64 {
+       return 20220614112900
+}
+
+func (*UpdateSchemas20220614) Name() string {
+       return "add jira status"
 }
diff --git a/plugins/jira/tasks/shared.go b/plugins/jira/models/status.go
similarity index 65%
copy from plugins/jira/tasks/shared.go
copy to plugins/jira/models/status.go
index 236b9387..0791b100 100644
--- a/plugins/jira/tasks/shared.go
+++ b/plugins/jira/models/status.go
@@ -15,23 +15,19 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package tasks
+package models
 
-import (
-       "net/http"
+import "github.com/apache/incubator-devlake/models/common"
 
-       "github.com/apache/incubator-devlake/plugins/helper"
-)
+type JiraStatus struct {
+       common.NoPKModel
+       ConnectionId   uint64 `gorm:"primaryKey"`
+       ID             string `gorm:"primaryKey"`
+       Name           string
+       Self           string
+       StatusCategory string
+}
 
-func GetTotalPagesFromResponse(res *http.Response, args 
*helper.ApiCollectorArgs) (int, error) {
-       body := &JiraPagination{}
-       err := helper.UnmarshalResponse(res, body)
-       if err != nil {
-               return 0, err
-       }
-       pages := body.Total / args.PageSize
-       if body.Total%args.PageSize > 0 {
-               pages++
-       }
-       return pages, nil
+func (JiraStatus) TableName() string {
+       return "_tool_jira_statuses"
 }
diff --git a/models/domainlayer/ticket/changelog.go 
b/plugins/jira/tasks/apiv2models/status.go
similarity index 54%
copy from models/domainlayer/ticket/changelog.go
copy to plugins/jira/tasks/apiv2models/status.go
index 8ad5bd7e..7dd00a41 100644
--- a/models/domainlayer/ticket/changelog.go
+++ b/plugins/jira/tasks/apiv2models/status.go
@@ -15,24 +15,26 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package ticket
+package apiv2models
 
-import (
-       "time"
-
-       "github.com/apache/incubator-devlake/models/domainlayer"
-)
-
-type Changelog struct {
-       domainlayer.DomainEntity
-
-       // collected fields
-       IssueId     string `gorm:"index;type:varchar(255)"`
-       AuthorId    string `gorm:"type:varchar(255)"`
-       AuthorName  string `gorm:"type:varchar(255)"`
-       FieldId     string `gorm:"type:varchar(255)"`
-       FieldName   string `gorm:"type:varchar(255)"`
-       FromValue   string
-       ToValue     string
-       CreatedDate time.Time
+type Status struct {
+       Description string `json:"description"`
+       IconURL     string `json:"iconUrl"`
+       ID          string `json:"id"`
+       Name        string `json:"name"`
+       Scope       *struct {
+               Type    string `json:"type"`
+               Project struct {
+                       ID string `json:"id"`
+               } `json:"project"`
+       } `json:"scope"`
+       Self           string `json:"self"`
+       StatusCategory struct {
+               ColorName string `json:"colorName"`
+               ID        int    `json:"id"`
+               Key       string `json:"key"`
+               Name      string `json:"name"`
+               Self      string `json:"self"`
+       } `json:"statusCategory"`
+       UntranslatedName string `json:"untranslatedName"`
 }
diff --git a/plugins/jira/tasks/changelog_convertor.go 
b/plugins/jira/tasks/changelog_convertor.go
index 31e9f9ea..92eee676 100644
--- a/plugins/jira/tasks/changelog_convertor.go
+++ b/plugins/jira/tasks/changelog_convertor.go
@@ -46,6 +46,11 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
        logger := taskCtx.GetLogger()
        db := taskCtx.GetDb()
        logger.Info("covert changelog")
+       statusMap, err := GetStatusInfo(db)
+       if err != nil {
+               logger.Error(err.Error())
+               return err
+       }
        // select all changelogs belongs to the board
        cursor, err := db.Table("_tool_jira_changelog_items").
                Joins(`left join _tool_jira_changelogs on (
@@ -60,7 +65,7 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
                Where("_tool_jira_changelog_items.connection_id = ? AND 
_tool_jira_board_issues.board_id = ?", connectionId, boardId).
                Rows()
        if err != nil {
-               logger.Info(err.Error())
+               logger.Error(err.Error())
                return err
        }
        defer cursor.Close()
@@ -87,33 +92,43 @@ func ConvertChangelogs(taskCtx core.SubTaskContext) error {
                                        row.ChangelogId,
                                        row.Field,
                                )},
-                               IssueId:     
issueIdGenerator.Generate(row.ConnectionId, row.IssueId),
-                               AuthorId:    userIdGen.Generate(connectionId, 
row.AuthorAccountId),
-                               AuthorName:  row.AuthorDisplayName,
-                               FieldId:     row.FieldId,
-                               FieldName:   row.Field,
-                               FromValue:   row.FromString,
-                               ToValue:     row.ToString,
-                               CreatedDate: row.Created,
+                               IssueId:           
issueIdGenerator.Generate(row.ConnectionId, row.IssueId),
+                               AuthorId:          
userIdGen.Generate(connectionId, row.AuthorAccountId),
+                               AuthorName:        row.AuthorDisplayName,
+                               FieldId:           row.FieldId,
+                               FieldName:         row.Field,
+                               OriginalFromValue: row.FromString,
+                               OriginalToValue:   row.ToString,
+                               CreatedDate:       row.Created,
                        }
                        if row.Field == "assignee" {
                                if row.ToValue != "" {
-                                       changelog.ToValue = 
userIdGen.Generate(connectionId, row.ToValue)
+                                       changelog.OriginalToValue = 
userIdGen.Generate(connectionId, row.ToValue)
                                }
                                if row.FromValue != "" {
-                                       changelog.FromValue = 
userIdGen.Generate(connectionId, row.FromValue)
+                                       changelog.OriginalFromValue = 
userIdGen.Generate(connectionId, row.FromValue)
                                }
                        }
                        if row.Field == "Sprint" {
-                               changelog.FromValue, err = 
convertIds(row.FromValue, connectionId, sprintIdGenerator)
+                               changelog.OriginalFromValue, err = 
convertIds(row.FromValue, connectionId, sprintIdGenerator)
                                if err != nil {
                                        return nil, err
                                }
-                               changelog.ToValue, err = 
convertIds(row.ToValue, connectionId, sprintIdGenerator)
+                               changelog.OriginalToValue, err = 
convertIds(row.ToValue, connectionId, sprintIdGenerator)
                                if err != nil {
                                        return nil, err
                                }
                        }
+                       if row.Field == "status" {
+                               fromStatus, ok := statusMap[changelog.FromValue]
+                               if ok {
+                                       changelog.FromValue = 
GetStdStatus(fromStatus.StatusCategory)
+                               }
+                               toStatus, ok := statusMap[changelog.ToValue]
+                               if ok {
+                                       changelog.ToValue = 
GetStdStatus(toStatus.StatusCategory)
+                               }
+                       }
                        return []interface{}{changelog}, nil
                },
        })
diff --git a/plugins/jira/tasks/issue_collector.go 
b/plugins/jira/tasks/issue_collector.go
index b7850420..40be8c11 100644
--- a/plugins/jira/tasks/issue_collector.go
+++ b/plugins/jira/tasks/issue_collector.go
@@ -27,7 +27,6 @@ import (
        "github.com/apache/incubator-devlake/plugins/core"
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/jira/models"
-       "github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models"
 )
 
 const RAW_ISSUE_TABLE = "jira_api_issues"
@@ -138,11 +137,6 @@ func CollectIssues(taskCtx core.SubTaskContext) error {
                        if err != nil {
                                return nil, err
                        }
-                       var issue apiv2models.Issue
-                       err = json.Unmarshal(blob, &issue)
-                       if err != nil {
-                               return nil, err
-                       }
                        return data.Issues, nil
                },
        })
diff --git a/plugins/jira/tasks/issue_convertor.go 
b/plugins/jira/tasks/issue_convertor.go
index 95a52d40..3f21cf7c 100644
--- a/plugins/jira/tasks/issue_convertor.go
+++ b/plugins/jira/tasks/issue_convertor.go
@@ -79,7 +79,7 @@ func ConvertIssues(taskCtx core.SubTaskContext) error {
                                EpicKey:                 jiraIssue.EpicKey,
                                Type:                    jiraIssue.StdType,
                                Status:                  jiraIssue.StdStatus,
-                               OriginalStatus:          jiraIssue.StatusKey,
+                               OriginalStatus:          jiraIssue.StatusName,
                                StoryPoint:              
jiraIssue.StdStoryPoint,
                                OriginalEstimateMinutes: 
jiraIssue.OriginalEstimateMinutes,
                                ResolutionDate:          
jiraIssue.ResolutionDate,
diff --git a/plugins/jira/tasks/issue_extractor.go 
b/plugins/jira/tasks/issue_extractor.go
index 7db87b0e..f9b2a15d 100644
--- a/plugins/jira/tasks/issue_extractor.go
+++ b/plugins/jira/tasks/issue_extractor.go
@@ -22,8 +22,6 @@ import (
        "fmt"
        "strings"
 
-       "github.com/apache/incubator-devlake/models/domainlayer/ticket"
-
        "github.com/apache/incubator-devlake/plugins/core"
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/jira/models"
@@ -57,6 +55,7 @@ func ExtractIssues(taskCtx core.SubTaskContext) error {
                return strings.ToUpper(stdType)
        }
        // prepare getStdStatus function
+       // TODO: status mapping is now not used
        var statusMappingRows []*models.JiraIssueStatusMapping
        err = db.Find(&statusMappingRows, "connection_id = ?", 
connectionId).Error
        if err != nil {
@@ -70,15 +69,6 @@ func ExtractIssues(taskCtx core.SubTaskContext) error {
                k := makeStatusMappingKey(statusMappingRow.UserType, 
statusMappingRow.UserStatus)
                statusMappings[k] = statusMappingRow.StandardStatus
        }
-       getStdStatus := func(statusKey string) string {
-               if statusKey == "done" {
-                       return ticket.DONE
-               } else if statusKey == "new" {
-                       return ticket.TODO
-               } else {
-                       return ticket.IN_PROGRESS
-               }
-       }
 
        extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
                RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
@@ -123,7 +113,7 @@ func ExtractIssues(taskCtx core.SubTaskContext) error {
                        }
                        issue.StdStoryPoint = uint(issue.StoryPoint)
                        issue.StdType = getStdType(issue.Type)
-                       issue.StdStatus = getStdStatus(issue.StatusKey)
+                       issue.StdStatus = GetStdStatus(issue.StatusKey)
                        if len(changelogs) < 100 {
                                issue.ChangelogUpdated = &row.CreatedAt
                        }
diff --git a/plugins/jira/tasks/remotelink_collector.go 
b/plugins/jira/tasks/remotelink_collector.go
index 3c6ac045..ac8067e1 100644
--- a/plugins/jira/tasks/remotelink_collector.go
+++ b/plugins/jira/tasks/remotelink_collector.go
@@ -46,8 +46,8 @@ func CollectRemotelinks(taskCtx core.SubTaskContext) error {
        */
        cursor, err := db.Cursor(
                Select("i.issue_id, NOW() AS update_time"),
-               From("_tool_jira_remotelinks"),
-               Join(`LEFT JOIN bi ON (
+               From("_tool_jira_remotelinks i"),
+               Join(`LEFT JOIN _tool_jira_board_issues bi ON (
                        bi.connection_id = i.connection_id AND
                        bi.issue_id = i.issue_id
                )`),
diff --git a/plugins/jira/tasks/shared.go b/plugins/jira/tasks/shared.go
index 236b9387..9f6dfc99 100644
--- a/plugins/jira/tasks/shared.go
+++ b/plugins/jira/tasks/shared.go
@@ -20,7 +20,10 @@ package tasks
 import (
        "net/http"
 
+       "github.com/apache/incubator-devlake/models/domainlayer/ticket"
        "github.com/apache/incubator-devlake/plugins/helper"
+       "github.com/apache/incubator-devlake/plugins/jira/models"
+       "gorm.io/gorm"
 )
 
 func GetTotalPagesFromResponse(res *http.Response, args 
*helper.ApiCollectorArgs) (int, error) {
@@ -35,3 +38,26 @@ func GetTotalPagesFromResponse(res *http.Response, args 
*helper.ApiCollectorArgs
        }
        return pages, nil
 }
+
+func GetStdStatus(statusKey string) string {
+       if statusKey == "done" {
+               return ticket.DONE
+       } else if statusKey == "new" {
+               return ticket.TODO
+       } else {
+               return ticket.IN_PROGRESS
+       }
+}
+
+func GetStatusInfo(db *gorm.DB) (map[string]models.JiraStatus, error) {
+       data := make([]models.JiraStatus, 0)
+       err := db.Model(&models.JiraStatus{}).Scan(&data).Error
+       if err != nil {
+               return nil, err
+       }
+       statusMap := make(map[string]models.JiraStatus)
+       for _, v := range data {
+               statusMap[v.Name] = v
+       }
+       return statusMap, nil
+}
diff --git a/plugins/jira/tasks/shared.go 
b/plugins/jira/tasks/status_collector.go
similarity index 51%
copy from plugins/jira/tasks/shared.go
copy to plugins/jira/tasks/status_collector.go
index 236b9387..7ea12793 100644
--- a/plugins/jira/tasks/shared.go
+++ b/plugins/jira/tasks/status_collector.go
@@ -18,20 +18,40 @@ limitations under the License.
 package tasks
 
 import (
+       "encoding/json"
        "net/http"
 
+       "github.com/apache/incubator-devlake/plugins/core"
        "github.com/apache/incubator-devlake/plugins/helper"
 )
 
-func GetTotalPagesFromResponse(res *http.Response, args 
*helper.ApiCollectorArgs) (int, error) {
-       body := &JiraPagination{}
-       err := helper.UnmarshalResponse(res, body)
+const RAW_STATUS_TABLE = "jira_api_status"
+
+func CollectStatus(taskCtx core.SubTaskContext) error {
+       data := taskCtx.GetData().(*JiraTaskData)
+
+       collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
+               RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
+                       Ctx: taskCtx,
+                       Params: JiraApiParams{
+                               ConnectionId: data.Connection.ID,
+                               BoardId:      data.Options.BoardId,
+                       },
+                       Table: RAW_STATUS_TABLE,
+               },
+               ApiClient:     data.ApiClient,
+               UrlTemplate:   "api/2/status",
+               GetTotalPages: GetTotalPagesFromResponse,
+               ResponseParser: func(res *http.Response) ([]json.RawMessage, 
error) {
+                       var data []json.RawMessage
+                       err := helper.UnmarshalResponse(res, &data)
+                       return data, err
+               },
+       })
+
        if err != nil {
-               return 0, err
+               return err
        }
-       pages := body.Total / args.PageSize
-       if body.Total%args.PageSize > 0 {
-               pages++
-       }
-       return pages, nil
+
+       return collector.Execute()
 }
diff --git a/plugins/jira/tasks/status_extractor.go 
b/plugins/jira/tasks/status_extractor.go
new file mode 100644
index 00000000..9e92b22f
--- /dev/null
+++ b/plugins/jira/tasks/status_extractor.go
@@ -0,0 +1,72 @@
+/*
+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 tasks
+
+import (
+       "encoding/json"
+
+       "github.com/apache/incubator-devlake/plugins/core"
+       "github.com/apache/incubator-devlake/plugins/helper"
+       "github.com/apache/incubator-devlake/plugins/jira/models"
+       "github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models"
+)
+
+func ExtractStatus(taskCtx core.SubTaskContext) error {
+       data := taskCtx.GetData().(*JiraTaskData)
+       connectionId := data.Connection.ID
+       boardId := data.Options.BoardId
+       logger := taskCtx.GetLogger()
+       logger.Info("extract Status, connection_id=%d, board_id=%d", 
connectionId, boardId)
+       extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
+               RawDataSubTaskArgs: helper.RawDataSubTaskArgs{
+                       Ctx: taskCtx,
+                       Params: JiraApiParams{
+                               ConnectionId: connectionId,
+                               BoardId:      boardId,
+                       },
+                       Table: RAW_STATUS_TABLE,
+               },
+               Extract: func(row *helper.RawData) ([]interface{}, error) {
+                       var apiStatus apiv2models.Status
+                       err := json.Unmarshal(row.Data, &apiStatus)
+                       if err != nil {
+                               return nil, err
+                       }
+                       if apiStatus.Scope != nil {
+                               // FIXME: skip scope status
+                               return nil, nil
+                       }
+                       var jiraStatus = &models.JiraStatus{
+                               ConnectionId:   connectionId,
+                               ID:             apiStatus.ID,
+                               Name:           apiStatus.Name,
+                               Self:           apiStatus.Self,
+                               StatusCategory: apiStatus.StatusCategory.Key,
+                       }
+                       var result []interface{}
+                       result = append(result, jiraStatus)
+                       return result, nil
+               },
+       })
+
+       if err != nil {
+               return err
+       }
+
+       return extractor.Execute()
+}
diff --git a/plugins/tapd/tasks/bug_changelog_converter.go 
b/plugins/tapd/tasks/bug_changelog_converter.go
index 8f430262..4aabd2e5 100644
--- a/plugins/tapd/tasks/bug_changelog_converter.go
+++ b/plugins/tapd/tasks/bug_changelog_converter.go
@@ -18,6 +18,9 @@ limitations under the License.
 package tasks
 
 import (
+       "reflect"
+       "time"
+
        "github.com/apache/incubator-devlake/models/common"
        "github.com/apache/incubator-devlake/models/domainlayer"
        "github.com/apache/incubator-devlake/models/domainlayer/didgen"
@@ -25,8 +28,6 @@ import (
        "github.com/apache/incubator-devlake/plugins/core"
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/tapd/models"
-       "reflect"
-       "time"
 )
 
 type BugChangelogItemResult struct {
@@ -82,14 +83,14 @@ func ConvertBugChangelog(taskCtx core.SubTaskContext) error 
{
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: 
clIdGen.Generate(data.Connection.ID, cl.ID, cl.Field),
                                },
-                               IssueId:     
IssueIdGen.Generate(data.Connection.ID, cl.BugID),
-                               AuthorId:    
UserIdGen.Generate(data.Connection.ID, data.Options.WorkspaceID, cl.Author),
-                               AuthorName:  cl.Author,
-                               FieldId:     cl.Field,
-                               FieldName:   cl.Field,
-                               FromValue:   cl.ValueBeforeParsed,
-                               ToValue:     cl.ValueAfterParsed,
-                               CreatedDate: cl.Created,
+                               IssueId:           
IssueIdGen.Generate(data.Connection.ID, cl.BugID),
+                               AuthorId:          
UserIdGen.Generate(data.Connection.ID, data.Options.WorkspaceID, cl.Author),
+                               AuthorName:        cl.Author,
+                               FieldId:           cl.Field,
+                               FieldName:         cl.Field,
+                               OriginalFromValue: cl.ValueBeforeParsed,
+                               OriginalToValue:   cl.ValueAfterParsed,
+                               CreatedDate:       cl.Created,
                        }
 
                        return []interface{}{
diff --git a/plugins/tapd/tasks/story_changelog_converter.go 
b/plugins/tapd/tasks/story_changelog_converter.go
index cca20956..ddf19297 100644
--- a/plugins/tapd/tasks/story_changelog_converter.go
+++ b/plugins/tapd/tasks/story_changelog_converter.go
@@ -86,14 +86,14 @@ func ConvertStoryChangelog(taskCtx core.SubTaskContext) 
error {
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: fmt.Sprintf("%s:%s", 
clIdGen.Generate(data.Connection.ID, cl.ID), cl.Field),
                                },
-                               IssueId:     
IssueIdGen.Generate(data.Connection.ID, cl.StoryID),
-                               AuthorId:    
UserIdGen.Generate(data.Connection.ID, data.Options.WorkspaceID, cl.Creator),
-                               AuthorName:  cl.Creator,
-                               FieldId:     cl.Field,
-                               FieldName:   cl.Field,
-                               FromValue:   cl.ValueBeforeParsed,
-                               ToValue:     cl.ValueAfterParsed,
-                               CreatedDate: cl.Created,
+                               IssueId:           
IssueIdGen.Generate(data.Connection.ID, cl.StoryID),
+                               AuthorId:          
UserIdGen.Generate(data.Connection.ID, data.Options.WorkspaceID, cl.Creator),
+                               AuthorName:        cl.Creator,
+                               FieldId:           cl.Field,
+                               FieldName:         cl.Field,
+                               OriginalFromValue: cl.ValueBeforeParsed,
+                               OriginalToValue:   cl.ValueAfterParsed,
+                               CreatedDate:       cl.Created,
                        }
 
                        return []interface{}{
diff --git a/plugins/tapd/tasks/task_changelog_converter.go 
b/plugins/tapd/tasks/task_changelog_converter.go
index 9ce44fb7..ced0ae82 100644
--- a/plugins/tapd/tasks/task_changelog_converter.go
+++ b/plugins/tapd/tasks/task_changelog_converter.go
@@ -87,14 +87,14 @@ func ConvertTaskChangelog(taskCtx core.SubTaskContext) 
error {
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: fmt.Sprintf("%s:%s", 
clIdGen.Generate(data.Connection.ID, cl.ID), cl.Field),
                                },
-                               IssueId:     
IssueIdGen.Generate(data.Connection.ID, cl.TaskID),
-                               AuthorId:    
UserIdGen.Generate(data.Connection.ID, data.Options.WorkspaceID, cl.Creator),
-                               AuthorName:  cl.Creator,
-                               FieldId:     cl.Field,
-                               FieldName:   cl.Field,
-                               FromValue:   cl.ValueBeforeParsed,
-                               ToValue:     cl.ValueAfterParsed,
-                               CreatedDate: cl.Created,
+                               IssueId:           
IssueIdGen.Generate(data.Connection.ID, cl.TaskID),
+                               AuthorId:          
UserIdGen.Generate(data.Connection.ID, data.Options.WorkspaceID, cl.Creator),
+                               AuthorName:        cl.Creator,
+                               FieldId:           cl.Field,
+                               FieldName:         cl.Field,
+                               OriginalFromValue: cl.ValueBeforeParsed,
+                               OriginalToValue:   cl.ValueAfterParsed,
+                               CreatedDate:       cl.Created,
                        }
 
                        return []interface{}{

Reply via email to