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

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


The following commit(s) were added to refs/heads/release-v0.17 by this push:
     new c59bc0048 fix: tapd status extraction error (#5574) (#5575)
c59bc0048 is described below

commit c59bc00487b8c9ba4d51f81c91c85dd6be557293
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Jun 26 19:12:53 2023 +0800

    fix: tapd status extraction error (#5574) (#5575)
---
 backend/plugins/tapd/tasks/bug_status_extractor.go | 13 ++-----
 backend/plugins/tapd/tasks/shared.go               | 22 +++++++++++
 backend/plugins/tapd/tasks/shared_test.go          | 44 ++++++++++++++++++++++
 .../plugins/tapd/tasks/story_status_extractor.go   | 13 ++-----
 4 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/backend/plugins/tapd/tasks/bug_status_extractor.go 
b/backend/plugins/tapd/tasks/bug_status_extractor.go
index b4d2b60e7..bb72c956c 100644
--- a/backend/plugins/tapd/tasks/bug_status_extractor.go
+++ b/backend/plugins/tapd/tasks/bug_status_extractor.go
@@ -18,7 +18,6 @@ limitations under the License.
 package tasks
 
 import (
-       "encoding/json"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
@@ -40,18 +39,12 @@ func ExtractBugStatus(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       if string(row.Data) == "[]" {
-                               return nil, nil
-                       }
-                       var statusRes struct {
-                               Data map[string]string
-                       }
-                       err := errors.Convert(json.Unmarshal(row.Data, 
&statusRes))
+                       var results []interface{}
+                       status, err := extractStatus(row.Data)
                        if err != nil {
                                return nil, err
                        }
-                       results := make([]interface{}, 0)
-                       for k, v := range statusRes.Data {
+                       for k, v := range status {
                                toolL := &models.TapdBugStatus{
                                        ConnectionId: data.Options.ConnectionId,
                                        WorkspaceId:  data.Options.WorkspaceId,
diff --git a/backend/plugins/tapd/tasks/shared.go 
b/backend/plugins/tapd/tasks/shared.go
index da88880da..9ac4ca015 100644
--- a/backend/plugins/tapd/tasks/shared.go
+++ b/backend/plugins/tapd/tasks/shared.go
@@ -336,3 +336,25 @@ func generateDomainAccountIdForUsers(param string, 
connectionId uint64) string {
        }
        return strings.Join(res, ",")
 }
+
+// extractStatus extracts the status from the given blob and returns a map of 
status names to status values.
+func extractStatus(blob []byte) (map[string]string, errors.Error) {
+       var statusRes struct {
+               Data interface{} `json:"data"`
+       }
+       err := errors.Convert(json.Unmarshal(blob, &statusRes))
+       if err != nil {
+               return nil, err
+       }
+       data, ok := statusRes.Data.(map[string]interface{})
+       if !ok {
+               return nil, nil
+       }
+       results := make(map[string]string)
+       for k, v := range data {
+               if value, ok := v.(string); ok {
+                       results[k] = value
+               }
+       }
+       return results, nil
+}
diff --git a/backend/plugins/tapd/tasks/shared_test.go 
b/backend/plugins/tapd/tasks/shared_test.go
index bdd052940..371b8220d 100644
--- a/backend/plugins/tapd/tasks/shared_test.go
+++ b/backend/plugins/tapd/tasks/shared_test.go
@@ -249,3 +249,47 @@ func TestGenerateDomainAccountIdForUsers(t *testing.T) {
                }
        }
 }
+
+func Test_extractStatus(t *testing.T) {
+       type args struct {
+               blob []byte
+       }
+       tests := []struct {
+               name  string
+               args  args
+               want  map[string]string
+               want1 errors.Error
+       }{
+               {
+                       "non-empty array",
+                       args{
+                               blob: 
[]byte(`{"data":[{"id":1,"name":"已完成","is_last_step":true},{"id":2,"name":"进行中"}],"status":1,"message":"success"}`),
+                       },
+                       nil,
+                       nil,
+               },
+               {
+                       "empty array",
+                       args{
+                               blob: 
[]byte(`{"status":1,"data":[],"info":"success"}`),
+                       },
+                       nil,
+                       nil,
+               },
+               {
+                       "object",
+                       args{
+                               blob: 
[]byte(`{"status":1,"data":{"new":"新建","in_progress":"开发处理"},"info":"success"}`),
+                       },
+                       map[string]string{"new": "新建", "in_progress": "开发处理"},
+                       nil,
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       got, got1 := extractStatus(tt.args.blob)
+                       assert.Equalf(t, tt.want, got, "extractStatus(%v)", 
tt.args.blob)
+                       assert.Equalf(t, tt.want1, got1, "extractStatus(%v)", 
tt.args.blob)
+               })
+       }
+}
diff --git a/backend/plugins/tapd/tasks/story_status_extractor.go 
b/backend/plugins/tapd/tasks/story_status_extractor.go
index 5fc01f7a0..286218bca 100644
--- a/backend/plugins/tapd/tasks/story_status_extractor.go
+++ b/backend/plugins/tapd/tasks/story_status_extractor.go
@@ -18,7 +18,6 @@ limitations under the License.
 package tasks
 
 import (
-       "encoding/json"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
@@ -40,18 +39,12 @@ func ExtractStoryStatus(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       if string(row.Data) == "[]" {
-                               return nil, nil
-                       }
-                       var storyStatusRes struct {
-                               Data map[string]string
-                       }
-                       err := errors.Convert(json.Unmarshal(row.Data, 
&storyStatusRes))
+                       var results []interface{}
+                       status, err := extractStatus(row.Data)
                        if err != nil {
                                return nil, err
                        }
-                       results := make([]interface{}, 0)
-                       for k, v := range storyStatusRes.Data {
+                       for k, v := range status {
                                toolL := &models.TapdStoryStatus{
                                        ConnectionId: data.Options.ConnectionId,
                                        WorkspaceId:  data.Options.WorkspaceId,

Reply via email to