You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2023/06/26 07:49:25 UTC

[incubator-devlake] branch main updated: fix: tapd status extraction error (#5574)

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

klesh 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 90c2e1d7c fix: tapd status extraction error (#5574)
90c2e1d7c is described below

commit 90c2e1d7cba29c452cf338f51010fcb3f2c40442
Author: Liang Zhang <li...@merico.dev>
AuthorDate: Mon Jun 26 15:49:20 2023 +0800

    fix: tapd status extraction error (#5574)
---
 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 d69cd0ba8..fe05d32a6 100644
--- a/backend/plugins/tapd/tasks/shared.go
+++ b/backend/plugins/tapd/tasks/shared.go
@@ -334,3 +334,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 764f4f421..96835069f 100644
--- a/backend/plugins/tapd/tasks/shared_test.go
+++ b/backend/plugins/tapd/tasks/shared_test.go
@@ -250,3 +250,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,