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 2d41d1cc9 feat: zentao bug commits collector (#5334)
2d41d1cc9 is described below

commit 2d41d1cc96fcb7991f980c281e99791bd4a1fa30
Author: abeizn <[email protected]>
AuthorDate: Wed May 31 21:35:59 2023 +0800

    feat: zentao bug commits collector (#5334)
---
 .../e2e/snapshot_tables/_tool_zentao_bugs.csv      | 10 +--
 .../e2e/snapshot_tables/_tool_zentao_stories.csv   | 16 ++--
 .../e2e/snapshot_tables/_tool_zentao_tasks.csv     |  8 +-
 backend/plugins/zentao/impl/impl.go                |  1 +
 .../register.go => archived/bug_commits.go}        | 22 ++---
 backend/plugins/zentao/models/bug.go               |  3 -
 .../register.go => bug_commits.go}                 | 29 ++++---
 ..._to_issues.go => 20230531_add_issue_commits.go} | 43 ++--------
 .../zentao/models/migrationscripts/register.go     |  2 +-
 backend/plugins/zentao/models/story.go             |  3 -
 backend/plugins/zentao/models/task.go              | 13 ++-
 backend/plugins/zentao/tasks/account_collector.go  |  2 +-
 backend/plugins/zentao/tasks/bug_collector.go      |  2 +-
 ...{task_collector.go => bug_commits_collector.go} | 94 +++++++++++++---------
 backend/plugins/zentao/tasks/bug_extractor.go      |  1 -
 .../plugins/zentao/tasks/department_collector.go   |  2 +-
 backend/plugins/zentao/tasks/story_collector.go    |  2 +-
 backend/plugins/zentao/tasks/story_extractor.go    |  1 -
 backend/plugins/zentao/tasks/task_collector.go     |  2 +-
 backend/plugins/zentao/tasks/task_data.go          |  2 +
 backend/plugins/zentao/tasks/task_extractor.go     |  1 -
 21 files changed, 128 insertions(+), 131 deletions(-)

diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv 
b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
index 17d8b8201..1f49d1a4c 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_bugs.csv
@@ -1,13 +1,13 @@
-connection_id,id,project,product,injection,identify,branch,module,execution,plan,story,story_version,task,to_task,to_story,title,keywords,severity,pri,type,os,browser,hardware,found,steps,status,sub_status,color,confirmed,activated_count,activated_date,feedback_by,notify_email,opened_by_id,opened_by_name,opened_date,opened_build,assigned_to_id,assigned_to_name,assigned_date,deadline,resolved_by_id,resolution,resolved_build,resolved_date,closed_by_id,closed_date,duplicate_bug,link_bug,fee
 [...]
+connection_id,id,project,product,injection,identify,branch,module,execution,plan,story,story_version,task,to_task,to_story,title,keywords,severity,pri,type,os,browser,hardware,found,steps,status,sub_status,color,confirmed,activated_count,activated_date,feedback_by,notify_email,opened_by_id,opened_by_name,opened_date,opened_build,assigned_to_id,assigned_to_name,assigned_date,deadline,resolved_by_id,resolution,resolved_build,resolved_date,closed_by_id,closed_date,duplicate_bug,link_bug,fee
 [...]
 1,1,7,3,0,0,0,8,1,0,1,1,1,0,0,首页页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入首页</p>
 <p>[结果]出现乱码&nbsp;&nbsp;&nbsp;&nbsp;</p>
-<p>[期望]正常显示</p>",active,,,0,0,,,,7,测试甲,2012-06-05T02:56:11.000+00:00,主干,4,开发甲,2012-06-05T02:56:11.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal,
+<p>[期望]正常显示</p>",active,,,0,0,,,,7,测试甲,2012-06-05T02:56:11.000+00:00,主干,4,开发甲,2012-06-05T02:56:11.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal
 
1,2,7,3,0,0,0,9,1,1,2,1,15,0,0,新闻中心页面问题,hh,3,2,codeerror,",windows",",chrome",,,"<p>[步骤]进入新闻中心</p>
 <p>[结果]页面出现乱码</p>
-<p>[期望]正常显示rew</p>",delay,,,1,1,2022-10-05T04:16:44.000+00:00,,[email protected],7,测试甲,2012-06-05T02:57:11.000+00:00,主干,0,,2022-10-05T04:19:22.000+00:00,2022-10-06,0,,,,0,,0,,0,0,0,0,,,,,,,1,1,2022-10-05T04:19:22.000+00:00,0,2,3,0,过期Bug,normal,
+<p>[期望]正常显示rew</p>",delay,,,1,1,2022-10-05T04:16:44.000+00:00,,[email protected],7,测试甲,2012-06-05T02:57:11.000+00:00,主干,0,,2022-10-05T04:19:22.000+00:00,2022-10-06,0,,,,0,,0,,0,0,0,0,,,,,,,1,1,2022-10-05T04:19:22.000+00:00,0,2,3,0,过期Bug,normal
 
1,3,7,3,0,0,0,10,1,0,3,2,6,0,0,成果展示页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入成果展示&nbsp;&nbsp;&nbsp;&nbsp;</p>
 <p>[结果]乱码</p>
-<p>[期望]正常显示</p>",active,,,0,0,,,,8,测试乙,2012-06-05T02:58:22.000+00:00,主干,4,开发甲,2012-06-05T02:58:22.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal,
+<p>[期望]正常显示</p>",active,,,0,0,,,,8,测试乙,2012-06-05T02:58:22.000+00:00,主干,4,开发甲,2012-06-05T02:58:22.000+00:00,,0,,,,0,,0,,0,0,0,0,,,,,,,0,0,2021-04-28T03:09:08.000+00:00,0,1,3,0,激活,normal
 1,4,7,3,0,0,0,11,1,0,4,1,9,0,0,售后服务页面问题,,3,1,codeerror,,,,,"<p>[步骤]进入售后服务</p>
 <p>[结果]乱码</p>
-<p>[期望]正常显示</p>",resolved,,,1,0,,,,9,测试丙,2012-06-05T03:00:19.000+00:00,主干,9,测试丙,2022-10-05T04:10:08.000+00:00,,1,fixed,主干,2022-10-05T04:09:59.000+00:00,0,,0,,0,0,0,0,,,,,,,0,1,2022-10-05T04:10:08.000+00:00,0,1,3,0,已解决,normal,
+<p>[期望]正常显示</p>",resolved,,,1,0,,,,9,测试丙,2012-06-05T03:00:19.000+00:00,主干,9,测试丙,2022-10-05T04:10:08.000+00:00,,1,fixed,主干,2022-10-05T04:09:59.000+00:00,0,,0,,0,0,0,0,,,,,,,0,1,2022-10-05T04:10:08.000+00:00,0,1,3,0,已解决,normal
diff --git 
a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories.csv 
b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories.csv
index a556afc57..2ece4f19a 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_stories.csv
@@ -1,8 +1,8 @@
-connection_id,id,product,branch,version,order_in,vision,parent,module,plan,source,source_note,from_bug,feedback,title,keywords,type,category,pri,estimate,status,sub_status,color,stage,lib,from_story,from_version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,approved_date,last_edited_id,last_edited_date,changed_date,reviewed_by_id,reviewed_date,closed_id,closed_date,closed_reason,activated_date,to_bug,child_stories,link_stories,link_requirements,dup
 [...]
-1,1,3,0,1,0,rnd,0,1,1,po,,0,0,首页设计和开发,,story,feature,1,1,active,,,developing,0,0,1,2,产品经理,2012-06-05T02:09:49.000+00:00,2,产品经理,,,2,2012-06-05T02:25:19.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
-1,2,3,0,1,0,rnd,0,2,1,po,,0,0,新闻中心的设计和开发。,,story,feature,1,1,active,,,projected,0,0,1,2,产品经理,2012-06-05T02:16:37.000+00:00,2,产品经理,2012-06-05T02:16:37.000+00:00,,2,2012-06-05T02:25:33.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
-1,3,3,0,2,0,rnd,0,3,1,po,,0,0,成果展示的设计和开发,,story,feature,1,0,active,,,developing,0,0,1,2,产品经理,2012-06-05T02:18:10.000+00:00,2,产品经理,2012-06-05T02:18:10.000+00:00,,2,2012-06-05T02:25:38.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
-1,4,3,0,1,0,rnd,0,4,1,po,,0,0,售后服务的设计和开发,,story,feature,1,1,active,,,developed,0,0,1,2,产品经理,2012-06-05T02:20:16.000+00:00,2,产品经理,2012-06-05T02:20:16.000+00:00,,2,2012-06-05T02:25:42.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
-1,5,3,0,1,0,rnd,0,5,1,po,,0,0,诚聘英才的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:21:39.000+00:00,2,产品经理,2012-06-05T02:21:39.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
-1,6,3,0,1,0,rnd,0,6,1,po,,0,0,合作洽谈的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:23:11.000+00:00,2,产品经理,2012-06-05T02:23:11.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
-1,7,3,0,1,0,rnd,0,7,1,po,,0,0,关于我们的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:24:19.000+00:00,2,产品经理,2012-06-05T02:24:19.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 ,
+connection_id,id,product,branch,version,order_in,vision,parent,module,plan,source,source_note,from_bug,feedback,title,keywords,type,category,pri,estimate,status,sub_status,color,stage,lib,from_story,from_version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,approved_date,last_edited_id,last_edited_date,changed_date,reviewed_by_id,reviewed_date,closed_id,closed_date,closed_reason,activated_date,to_bug,child_stories,link_stories,link_requirements,dup
 [...]
+1,1,3,0,1,0,rnd,0,1,1,po,,0,0,首页设计和开发,,story,feature,1,1,active,,,developing,0,0,1,2,产品经理,2012-06-05T02:09:49.000+00:00,2,产品经理,,,2,2012-06-05T02:25:19.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
+1,2,3,0,1,0,rnd,0,2,1,po,,0,0,新闻中心的设计和开发。,,story,feature,1,1,active,,,projected,0,0,1,2,产品经理,2012-06-05T02:16:37.000+00:00,2,产品经理,2012-06-05T02:16:37.000+00:00,,2,2012-06-05T02:25:33.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
+1,3,3,0,2,0,rnd,0,3,1,po,,0,0,成果展示的设计和开发,,story,feature,1,0,active,,,developing,0,0,1,2,产品经理,2012-06-05T02:18:10.000+00:00,2,产品经理,2012-06-05T02:18:10.000+00:00,,2,2012-06-05T02:25:38.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
+1,4,3,0,1,0,rnd,0,4,1,po,,0,0,售后服务的设计和开发,,story,feature,1,1,active,,,developed,0,0,1,2,产品经理,2012-06-05T02:20:16.000+00:00,2,产品经理,2012-06-05T02:20:16.000+00:00,,2,2012-06-05T02:25:42.000+00:00,,0,2012-06-04T16:00:00.000+00:00,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
+1,5,3,0,1,0,rnd,0,5,1,po,,0,0,诚聘英才的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:21:39.000+00:00,2,产品经理,2012-06-05T02:21:39.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
+1,6,3,0,1,0,rnd,0,6,1,po,,0,0,合作洽谈的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:23:11.000+00:00,2,产品经理,2012-06-05T02:23:11.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
+1,7,3,0,1,0,rnd,0,7,1,po,,0,0,关于我们的设计和开发,,story,feature,1,1,reviewing,,,planned,0,0,1,2,产品经理,2012-06-05T02:24:19.000+00:00,2,产品经理,2012-06-05T02:24:19.000+00:00,,0,,,0,,0,,,,0,,,,0,0,,,0,0,1,1.0版本
 
diff --git a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv 
b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv
index 5ba09d842..40337d85f 100644
--- a/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv
+++ b/backend/plugins/zentao/e2e/snapshot_tables/_tool_zentao_tasks.csv
@@ -1,4 +1,4 @@
-connection_id,id,project,parent,execution,module,design,story,story_version,design_version,from_bug,feedback,from_issue,name,type,mode,pri,estimate,consumed,deadline,status,sub_status,color,description,version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,est_started,real_started,finished_id,finished_date,finished_list,canceled_id,canceled_date,closed_by_id,closed_date,plan_duration,real_duration,closed_reason,last_edited_id,last_edited_date,activa
 [...]
-1,1,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,0,0,2022-10-01,wait,,,任务描述<span> 
</span><br /><div><br 
/></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,21.11,
-1,2,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,12.1,2.1,2022-10-01,wait,,,任务描述<span> 
</span><br /><div><br 
/></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,3,
-1,3,1,-1,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,11.2,0,2022-10-01,wait,,,任务描述<span> 
</span><br /><div><br 
/></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,43.22121,
+connection_id,id,project,parent,execution,module,design,story,story_version,design_version,from_bug,feedback,from_issue,name,type,mode,pri,estimate,consumed,deadline,status,sub_status,color,description,version,opened_by_id,opened_by_name,opened_date,assigned_to_id,assigned_to_name,assigned_date,est_started,real_started,finished_id,finished_date,finished_list,canceled_id,canceled_date,closed_by_id,closed_date,plan_duration,real_duration,closed_reason,last_edited_id,last_edited_date,activa
 [...]
+1,1,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,0,0,2022-10-01,wait,,,任务描述<span> 
</span><br /><div><br 
/></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,21.11
+1,2,1,0,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,12.1,2.1,2022-10-01,wait,,,任务描述<span> 
</span><br /><div><br 
/></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,3
+1,3,1,-1,1,0,0,0,1,0,0,0,0,任务名称,devel,,3,11.2,0,2022-10-01,wait,,,任务描述<span> 
</span><br /><div><br 
/></div>,1,1,devlake,2022-09-19T01:50:37.000+00:00,5,开发乙,2022-09-19T01:50:37.000+00:00,2022-09-20,,0,,,0,,0,,0,0,,0,,,0,0,0,,,,,0,rnd,0,,0,0,,开发乙,3,0,43.22121
diff --git a/backend/plugins/zentao/impl/impl.go 
b/backend/plugins/zentao/impl/impl.go
index 9433d0919..1a725aebb 100644
--- a/backend/plugins/zentao/impl/impl.go
+++ b/backend/plugins/zentao/impl/impl.go
@@ -76,6 +76,7 @@ func (p Zentao) SubTaskMetas() []plugin.SubTaskMeta {
                tasks.CollectDepartmentMeta,
                tasks.ExtractDepartmentMeta,
                tasks.ConvertDepartmentMeta,
+               tasks.CollectBugCommitsMeta,
        }
 }
 
diff --git a/backend/plugins/zentao/models/migrationscripts/register.go 
b/backend/plugins/zentao/models/archived/bug_commits.go
similarity index 57%
copy from backend/plugins/zentao/models/migrationscripts/register.go
copy to backend/plugins/zentao/models/archived/bug_commits.go
index 8eedfe788..21a2ad090 100644
--- a/backend/plugins/zentao/models/migrationscripts/register.go
+++ b/backend/plugins/zentao/models/archived/bug_commits.go
@@ -15,17 +15,21 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package migrationscripts
+package archived
 
 import (
-       "github.com/apache/incubator-devlake/core/plugin"
+       
"github.com/apache/incubator-devlake/core/models/migrationscripts/archived"
 )
 
-// All return all the migration scripts
-func All() []plugin.MigrationScript {
-       return []plugin.MigrationScript{
-               new(addInitTables),
-               new(addInitChangelogTables),
-               new(addActionsToIssues),
-       }
+type ZentaoBugCommits struct {
+       archived.NoPKModel
+       ConnectionId uint64   `gorm:"primaryKey;type:BIGINT  NOT NULL"`
+       ID           int64    `json:"id" gorm:"primaryKey;type:BIGINT  NOT 
NULL;autoIncrement:false"`
+       Project      int64    `json:"project"`
+       Product      int64    `json:"product"`
+       Actions      []string `gorm:"type:json;serializer:json" json:"actions" 
mapstructure:"actions"`
+}
+
+func (ZentaoBugCommits) TableName() string {
+       return "_tool_zentao_bug_commits"
 }
diff --git a/backend/plugins/zentao/models/bug.go 
b/backend/plugins/zentao/models/bug.go
index e728152ec..664910121 100644
--- a/backend/plugins/zentao/models/bug.go
+++ b/backend/plugins/zentao/models/bug.go
@@ -20,7 +20,6 @@ package models
 import (
        "github.com/apache/incubator-devlake/core/models/common"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "gorm.io/datatypes"
 )
 
 type ZentaoBugRes struct {
@@ -89,7 +88,6 @@ type ZentaoBugRes struct {
        Needconfirm    bool                `json:"needconfirm"`
        StatusName     string              `json:"statusName"`
        ProductStatus  string              `json:"productStatus"`
-       Actions        datatypes.JSON      `json:"actions"`
 }
 
 type ZentaoBug struct {
@@ -162,7 +160,6 @@ type ZentaoBug struct {
        Needconfirm    bool                `json:"needconfirm"`
        StatusName     string              `json:"statusName"`
        ProductStatus  string              `json:"productStatus"`
-       Actions        datatypes.JSON      `json:"actions"`
 }
 
 func (ZentaoBug) TableName() string {
diff --git a/backend/plugins/zentao/models/migrationscripts/register.go 
b/backend/plugins/zentao/models/bug_commits.go
similarity index 50%
copy from backend/plugins/zentao/models/migrationscripts/register.go
copy to backend/plugins/zentao/models/bug_commits.go
index 8eedfe788..918b8fe06 100644
--- a/backend/plugins/zentao/models/migrationscripts/register.go
+++ b/backend/plugins/zentao/models/bug_commits.go
@@ -15,17 +15,28 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package migrationscripts
+package models
 
 import (
-       "github.com/apache/incubator-devlake/core/plugin"
+       "github.com/apache/incubator-devlake/core/models/common"
 )
 
-// All return all the migration scripts
-func All() []plugin.MigrationScript {
-       return []plugin.MigrationScript{
-               new(addInitTables),
-               new(addInitChangelogTables),
-               new(addActionsToIssues),
-       }
+type ZentaoBugCommitsRes struct {
+       ID      int64    `json:"id"`
+       Project int64    `json:"project"`
+       Product int64    `json:"product"`
+       Actions []string `gorm:"type:json;serializer:json" json:"actions" 
mapstructure:"actions"`
+}
+
+type ZentaoBugCommits struct {
+       common.NoPKModel
+       ConnectionId uint64   `gorm:"primaryKey;type:BIGINT  NOT NULL"`
+       ID           int64    `json:"id" gorm:"primaryKey;type:BIGINT  NOT 
NULL;autoIncrement:false"`
+       Project      int64    `json:"project"`
+       Product      int64    `json:"product"`
+       Actions      []string `gorm:"type:json;serializer:json" json:"actions" 
mapstructure:"actions"`
+}
+
+func (ZentaoBugCommits) TableName() string {
+       return "_tool_zentao_bug_commits"
 }
diff --git 
a/backend/plugins/zentao/models/migrationscripts/20230531_add_actions_to_issues.go
 b/backend/plugins/zentao/models/migrationscripts/20230531_add_issue_commits.go
similarity index 54%
rename from 
backend/plugins/zentao/models/migrationscripts/20230531_add_actions_to_issues.go
rename to 
backend/plugins/zentao/models/migrationscripts/20230531_add_issue_commits.go
index a9d8626fd..75b6cb606 100644
--- 
a/backend/plugins/zentao/models/migrationscripts/20230531_add_actions_to_issues.go
+++ 
b/backend/plugins/zentao/models/migrationscripts/20230531_add_issue_commits.go
@@ -20,53 +20,24 @@ package migrationscripts
 import (
        "github.com/apache/incubator-devlake/core/context"
        "github.com/apache/incubator-devlake/core/errors"
-       "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/migrationhelper"
-       "gorm.io/datatypes"
+       "github.com/apache/incubator-devlake/plugins/zentao/models/archived"
 )
 
-var _ plugin.MigrationScript = (*addActionsToIssues)(nil)
+type addIssueCommitsTables struct{}
 
-type Bug20230531 struct {
-       Actions datatypes.JSON `json:"actions"`
-}
-
-func (Bug20230531) TableName() string {
-       return "_tool_zentao_bugs"
-}
-
-type Task20230531 struct {
-       Actions datatypes.JSON `json:"actions"`
-}
-
-func (Task20230531) TableName() string {
-       return "_tool_zentao_tasks"
-}
-
-type Story20230531 struct {
-       Actions datatypes.JSON `json:"actions"`
-}
-
-func (Story20230531) TableName() string {
-       return "_tool_zentao_stories"
-}
-
-type addActionsToIssues struct{}
-
-func (script *addActionsToIssues) Up(basicRes context.BasicRes) errors.Error {
+func (*addIssueCommitsTables) Up(basicRes context.BasicRes) errors.Error {
 
        return migrationhelper.AutoMigrateTables(
                basicRes,
-               &Bug20230531{},
-               &Task20230531{},
-               &Story20230531{},
+               &archived.ZentaoBugCommits{},
        )
 }
 
-func (*addActionsToIssues) Version() uint64 {
+func (*addIssueCommitsTables) Version() uint64 {
        return 20230531000001
 }
 
-func (*addActionsToIssues) Name() string {
-       return "add actions to bugs, stories and tasks"
+func (*addIssueCommitsTables) Name() string {
+       return "zentao add issue commits tables"
 }
diff --git a/backend/plugins/zentao/models/migrationscripts/register.go 
b/backend/plugins/zentao/models/migrationscripts/register.go
index 8eedfe788..e71dac9f4 100644
--- a/backend/plugins/zentao/models/migrationscripts/register.go
+++ b/backend/plugins/zentao/models/migrationscripts/register.go
@@ -26,6 +26,6 @@ func All() []plugin.MigrationScript {
        return []plugin.MigrationScript{
                new(addInitTables),
                new(addInitChangelogTables),
-               new(addActionsToIssues),
+               new(addIssueCommitsTables),
        }
 }
diff --git a/backend/plugins/zentao/models/story.go 
b/backend/plugins/zentao/models/story.go
index e10caf88e..274fec596 100644
--- a/backend/plugins/zentao/models/story.go
+++ b/backend/plugins/zentao/models/story.go
@@ -20,7 +20,6 @@ package models
 import (
        "github.com/apache/incubator-devlake/core/models/common"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "gorm.io/datatypes"
 )
 
 type ZentaoStoryRes struct {
@@ -78,7 +77,6 @@ type ZentaoStoryRes struct {
        PriOrder         string              `json:"priOrder"`
        PlanTitle        string              `json:"planTitle"`
        ProductStatus    string              `json:"productStatus"`
-       Actions          datatypes.JSON      `json:"actions"`
 }
 
 type ZentaoStory struct {
@@ -139,7 +137,6 @@ type ZentaoStory struct {
        Deleted          bool                `json:"deleted"`
        PriOrder         string              `json:"priOrder"`
        PlanTitle        string              `json:"planTitle"`
-       Actions          datatypes.JSON      `json:"actions"`
 }
 
 func (ZentaoStory) TableName() string {
diff --git a/backend/plugins/zentao/models/task.go 
b/backend/plugins/zentao/models/task.go
index b0a637bee..43a20be93 100644
--- a/backend/plugins/zentao/models/task.go
+++ b/backend/plugins/zentao/models/task.go
@@ -20,7 +20,6 @@ package models
 import (
        "github.com/apache/incubator-devlake/core/models/common"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "gorm.io/datatypes"
 )
 
 type ZentaoTaskRes struct {
@@ -85,12 +84,11 @@ type ZentaoTaskRes struct {
        } `json:"latestStoryVersion"`
        StoryStatus interface {
        } `json:"storyStatus"`
-       AssignedToRealName string         `json:"assignedToRealName"`
-       PriOrder           string         `json:"priOrder"`
-       Delay              int            `json:"delay"`
-       NeedConfirm        bool           `json:"needConfirm"`
-       Progress           float64        `json:"progress"`
-       Actions            datatypes.JSON `json:"actions"`
+       AssignedToRealName string  `json:"assignedToRealName"`
+       PriOrder           string  `json:"priOrder"`
+       Delay              int     `json:"delay"`
+       NeedConfirm        bool    `json:"needConfirm"`
+       Progress           float64 `json:"progress"`
 }
 
 type ZentaoTask struct {
@@ -160,7 +158,6 @@ type ZentaoTask struct {
        PriOrder           string              `json:"priOrder"`
        NeedConfirm        bool                `json:"needConfirm"`
        Progress           float64             `json:"progress"`
-       Actions            datatypes.JSON      `json:"actions"`
 }
 
 func (ZentaoTask) TableName() string {
diff --git a/backend/plugins/zentao/tasks/account_collector.go 
b/backend/plugins/zentao/tasks/account_collector.go
index 7294f449f..dd027cfa1 100644
--- a/backend/plugins/zentao/tasks/account_collector.go
+++ b/backend/plugins/zentao/tasks/account_collector.go
@@ -72,7 +72,7 @@ func CollectAccount(taskCtx plugin.SubTaskContext) 
errors.Error {
 }
 
 var CollectAccountMeta = plugin.SubTaskMeta{
-       Name:             "CollectAccount",
+       Name:             "collectAccount",
        EntryPoint:       CollectAccount,
        EnabledByDefault: true,
        Description:      "Collect Account data from Zentao api",
diff --git a/backend/plugins/zentao/tasks/bug_collector.go 
b/backend/plugins/zentao/tasks/bug_collector.go
index 16ffda670..7692cb596 100644
--- a/backend/plugins/zentao/tasks/bug_collector.go
+++ b/backend/plugins/zentao/tasks/bug_collector.go
@@ -79,7 +79,7 @@ func CollectBug(taskCtx plugin.SubTaskContext) errors.Error {
 }
 
 var CollectBugMeta = plugin.SubTaskMeta{
-       Name:             "CollectBug",
+       Name:             "collectBug",
        EntryPoint:       CollectBug,
        EnabledByDefault: true,
        Description:      "Collect Bug data from Zentao api",
diff --git a/backend/plugins/zentao/tasks/task_collector.go 
b/backend/plugins/zentao/tasks/bug_commits_collector.go
similarity index 52%
copy from backend/plugins/zentao/tasks/task_collector.go
copy to backend/plugins/zentao/tasks/bug_commits_collector.go
index 427569c11..639885f29 100644
--- a/backend/plugins/zentao/tasks/task_collector.go
+++ b/backend/plugins/zentao/tasks/bug_commits_collector.go
@@ -20,6 +20,7 @@ package tasks
 import (
        "encoding/json"
        "fmt"
+       "io"
        "net/http"
        "net/url"
        "reflect"
@@ -31,79 +32,98 @@ import (
        "github.com/apache/incubator-devlake/plugins/zentao/models"
 )
 
-const RAW_TASK_TABLE = "zentao_api_tasks"
+const RAW_BUG_COMMITS_TABLE = "zentao_api_bug_commits"
 
-type ExecuteInput struct {
-       Id int64
-}
+var _ plugin.SubTaskEntryPoint = CollectBugCommits
 
-var _ plugin.SubTaskEntryPoint = CollectTask
+var CollectBugCommitsMeta = plugin.SubTaskMeta{
+       Name:             "collectBugCommits",
+       EntryPoint:       CollectBugCommits,
+       EnabledByDefault: true,
+       Description:      "Collect Bug Commits data from Zentao api",
+       DomainTypes:      []string{plugin.DOMAIN_TYPE_TICKET},
+}
 
-func CollectTask(taskCtx plugin.SubTaskContext) errors.Error {
+func CollectBugCommits(taskCtx plugin.SubTaskContext) errors.Error {
+       db := taskCtx.GetDal()
        data := taskCtx.GetData().(*ZentaoTaskData)
 
-       // this collect only work for project
-       if data.Options.ProjectId == 0 {
-               return nil
+       // state manager
+       collectorWithState, err := 
api.NewStatefulApiCollector(api.RawDataSubTaskArgs{
+               Ctx: taskCtx,
+               Params: ZentaoApiParams{
+                       ConnectionId: data.Options.ConnectionId,
+                       ProductId:    data.Options.ProductId,
+               },
+               Table: RAW_BUG_COMMITS_TABLE,
+       }, data.TimeAfter)
+       if err != nil {
+               return err
        }
 
-       cursor, err := taskCtx.GetDal().Cursor(
-               dal.Select(`id`),
-               dal.From(&models.ZentaoExecution{}),
-               dal.Where(`project_id = ? and connection_id = ?`, 
data.Options.ProjectId, data.Options.ConnectionId),
-       )
+       // load bugs id from db
+       clauses := []dal.Clause{
+               dal.Select("id"),
+               dal.From(&models.ZentaoBug{}),
+               dal.Where(
+                       "product = ? AND connection_id = ?",
+                       data.Options.ProductId, data.Options.ConnectionId,
+               ),
+       }
+       // incremental collection
+       incremental := collectorWithState.IsIncremental()
+       if incremental {
+               clauses = append(
+                       clauses,
+                       dal.Where("updated_at > ?", 
collectorWithState.LatestState.LatestSuccessStart),
+               )
+       }
+       cursor, err := db.Cursor(clauses...)
        if err != nil {
                return err
        }
-       defer cursor.Close()
-
-       iterator, err := api.NewDalCursorIterator(taskCtx.GetDal(), cursor, 
reflect.TypeOf(ExecuteInput{}))
+       iterator, err := api.NewDalCursorIterator(db, cursor, 
reflect.TypeOf(SimpleZentaoBug{}))
        if err != nil {
                return err
        }
-
-       collector, err := api.NewApiCollector(api.ApiCollectorArgs{
+       // collect bug commits
+       err = collectorWithState.InitCollector(api.ApiCollectorArgs{
                RawDataSubTaskArgs: api.RawDataSubTaskArgs{
                        Ctx: taskCtx,
                        Params: ZentaoApiParams{
                                ConnectionId: data.Options.ConnectionId,
                                ProductId:    data.Options.ProductId,
-                               ProjectId:    data.Options.ProjectId,
                        },
-                       Table: RAW_TASK_TABLE,
+                       Table: RAW_BUG_COMMITS_TABLE,
                },
-               Input:       iterator,
                ApiClient:   data.ApiClient,
                PageSize:    100,
-               UrlTemplate: "/executions/{{ .Input.Id }}/tasks",
+               Input:       iterator,
+               Incremental: incremental,
+               UrlTemplate: "bugs/{{ .Input.ID }}",
                Query: func(reqData *api.RequestData) (url.Values, 
errors.Error) {
                        query := url.Values{}
                        query.Set("page", fmt.Sprintf("%v", reqData.Pager.Page))
-                       query.Set("limit", fmt.Sprintf("%v", 
reqData.Pager.Size))
+                       query.Set("per_page", fmt.Sprintf("%v", 
reqData.Pager.Size))
                        return query, nil
                },
                GetTotalPages: GetTotalPagesFromResponse,
                ResponseParser: func(res *http.Response) ([]json.RawMessage, 
errors.Error) {
-                       var data struct {
-                               Task []json.RawMessage `json:"tasks"`
-                       }
-                       err := api.UnmarshalResponse(res, &data)
+                       body, err := io.ReadAll(res.Body)
                        if err != nil {
-                               return nil, errors.Default.Wrap(err, "error 
reading endpoint response by Zentao bug collector")
+                               return nil, errors.Convert(err)
                        }
-                       return data.Task, nil
+                       res.Body.Close()
+                       return []json.RawMessage{body}, nil
                },
        })
        if err != nil {
                return err
        }
-       return collector.Execute()
+
+       return collectorWithState.Execute()
 }
 
-var CollectTaskMeta = plugin.SubTaskMeta{
-       Name:             "CollectTask",
-       EntryPoint:       CollectTask,
-       EnabledByDefault: true,
-       Description:      "Collect Task data from Zentao api",
-       DomainTypes:      []string{plugin.DOMAIN_TYPE_TICKET},
+type SimpleZentaoBug struct {
+       ID int64 `json:"id"`
 }
diff --git a/backend/plugins/zentao/tasks/bug_extractor.go 
b/backend/plugins/zentao/tasks/bug_extractor.go
index 52ac50c63..eff39b734 100644
--- a/backend/plugins/zentao/tasks/bug_extractor.go
+++ b/backend/plugins/zentao/tasks/bug_extractor.go
@@ -129,7 +129,6 @@ func ExtractBug(taskCtx plugin.SubTaskContext) errors.Error 
{
                                Needconfirm:    res.Needconfirm,
                                StatusName:     res.StatusName,
                                ProductStatus:  res.ProductStatus,
-                               Actions:        res.Actions,
                        }
                        results := make([]interface{}, 0)
                        results = append(results, bug)
diff --git a/backend/plugins/zentao/tasks/department_collector.go 
b/backend/plugins/zentao/tasks/department_collector.go
index aa2fc103a..12879a41f 100644
--- a/backend/plugins/zentao/tasks/department_collector.go
+++ b/backend/plugins/zentao/tasks/department_collector.go
@@ -71,7 +71,7 @@ func CollectDepartment(taskCtx plugin.SubTaskContext) 
errors.Error {
 }
 
 var CollectDepartmentMeta = plugin.SubTaskMeta{
-       Name:             "CollectDepartment",
+       Name:             "collectDepartment",
        EntryPoint:       CollectDepartment,
        EnabledByDefault: true,
        Description:      "Collect Department data from Zentao api",
diff --git a/backend/plugins/zentao/tasks/story_collector.go 
b/backend/plugins/zentao/tasks/story_collector.go
index 9da194064..f11918ad8 100644
--- a/backend/plugins/zentao/tasks/story_collector.go
+++ b/backend/plugins/zentao/tasks/story_collector.go
@@ -80,7 +80,7 @@ func CollectStory(taskCtx plugin.SubTaskContext) errors.Error 
{
 }
 
 var CollectStoryMeta = plugin.SubTaskMeta{
-       Name:             "CollectStory",
+       Name:             "collectStory",
        EntryPoint:       CollectStory,
        EnabledByDefault: true,
        Description:      "Collect Story data from Zentao api",
diff --git a/backend/plugins/zentao/tasks/story_extractor.go 
b/backend/plugins/zentao/tasks/story_extractor.go
index 4312f90dc..e4e633fb5 100644
--- a/backend/plugins/zentao/tasks/story_extractor.go
+++ b/backend/plugins/zentao/tasks/story_extractor.go
@@ -116,7 +116,6 @@ func ExtractStory(taskCtx plugin.SubTaskContext) 
errors.Error {
                                Deleted:          res.Deleted,
                                PriOrder:         res.PriOrder,
                                PlanTitle:        res.PlanTitle,
-                               Actions:          res.Actions,
                        }
                        results := make([]interface{}, 0)
                        results = append(results, story)
diff --git a/backend/plugins/zentao/tasks/task_collector.go 
b/backend/plugins/zentao/tasks/task_collector.go
index 427569c11..ace55d330 100644
--- a/backend/plugins/zentao/tasks/task_collector.go
+++ b/backend/plugins/zentao/tasks/task_collector.go
@@ -101,7 +101,7 @@ func CollectTask(taskCtx plugin.SubTaskContext) 
errors.Error {
 }
 
 var CollectTaskMeta = plugin.SubTaskMeta{
-       Name:             "CollectTask",
+       Name:             "collectTask",
        EntryPoint:       CollectTask,
        EnabledByDefault: true,
        Description:      "Collect Task data from Zentao api",
diff --git a/backend/plugins/zentao/tasks/task_data.go 
b/backend/plugins/zentao/tasks/task_data.go
index 406276f2e..9632e94f6 100644
--- a/backend/plugins/zentao/tasks/task_data.go
+++ b/backend/plugins/zentao/tasks/task_data.go
@@ -19,6 +19,7 @@ package tasks
 
 import (
        "fmt"
+       "time"
 
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
@@ -49,6 +50,7 @@ type ZentaoOptions struct {
 type ZentaoTaskData struct {
        Options   *ZentaoOptions
        RemoteDb  dal.Dal
+       TimeAfter *time.Time
        ApiClient *helper.ApiAsyncClient
 }
 
diff --git a/backend/plugins/zentao/tasks/task_extractor.go 
b/backend/plugins/zentao/tasks/task_extractor.go
index 79c0e16c4..7d6efc18a 100644
--- a/backend/plugins/zentao/tasks/task_extractor.go
+++ b/backend/plugins/zentao/tasks/task_extractor.go
@@ -128,7 +128,6 @@ func ExtractTask(taskCtx plugin.SubTaskContext) 
errors.Error {
                                NeedConfirm:        res.NeedConfirm,
                                //ProductType:        res.ProductType,
                                Progress: res.Progress,
-                               Actions:  res.Actions,
                        }
                        results := make([]interface{}, 0)
                        results = append(results, task)

Reply via email to