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,