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

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


The following commit(s) were added to refs/heads/release-v0.21 by this push:
     new 51787a1bd [bug][customize] Import csv issues API handle issues in 
multiple boards (#6978) (#7142)
51787a1bd is described below

commit 51787a1bd3b7b5686cc1cf1593fdebb7e42f62f8
Author: Leric Zhang <[email protected]>
AuthorDate: Fri Mar 8 11:31:52 2024 +0800

    [bug][customize] Import csv issues API handle issues in multiple boards 
(#6978) (#7142)
    
    * fix(customize): csv import should handle issues belong to multiple boards
    
    * fix(customize): use more practical csv file for update test
---
 .../plugins/customize/e2e/import_issues_test.go    | 13 +++-
 .../e2e/raw_tables/issue_repo_commits.csv          | 38 +++++----
 .../customize/e2e/raw_tables/issues_commits.csv    | 38 +++++----
 .../customize/e2e/raw_tables/issues_input.csv      | 12 +--
 .../customize/e2e/raw_tables/issues_input2.csv     |  3 +
 .../snapshot_tables/_tool_customized_fields.csv    |  5 --
 .../customize/e2e/snapshot_tables/board_issues.csv | 12 ++-
 .../e2e/snapshot_tables/issue_commits.csv          | 36 ++++++---
 .../customize/e2e/snapshot_tables/issue_labels.csv |  8 +-
 .../e2e/snapshot_tables/issue_repo_commits.csv     | 36 ++++++---
 .../customize/e2e/snapshot_tables/issues.csv       | 31 --------
 .../customize/e2e/snapshot_tables/issues_csv.csv   |  4 -
 .../e2e/snapshot_tables/issues_output.csv          | 10 ++-
 backend/plugins/customize/service/service.go       | 89 +++++++++++++---------
 14 files changed, 192 insertions(+), 143 deletions(-)

diff --git a/backend/plugins/customize/e2e/import_issues_test.go 
b/backend/plugins/customize/e2e/import_issues_test.go
index 849a0cfe2..8ed878038 100644
--- a/backend/plugins/customize/e2e/import_issues_test.go
+++ b/backend/plugins/customize/e2e/import_issues_test.go
@@ -89,10 +89,21 @@ func TestImportIssueDataFlow(t *testing.T) {
                t.Fatal(err1)
        }
        defer issueFile.Close()
-       err = 
svc.ImportIssue(`{"ConnectionId":1,"Owner":"thenicetgp","Repo":"lake"}`, 
issueFile)
+       err = svc.ImportIssue("csv-board", issueFile)
        if err != nil {
                t.Fatal(err)
        }
+
+       issueFile2, err2 := os.Open("raw_tables/issues_input2.csv")
+       if err2 != nil {
+               t.Fatal(err2)
+       }
+       defer issueFile2.Close()
+       err = svc.ImportIssue("csv-board2", issueFile2)
+       if err != nil {
+               t.Fatal(err)
+       }
+
        dataflowTester.VerifyTableWithRawData(
                ticket.Issue{},
                "snapshot_tables/issues_output.csv",
diff --git a/backend/plugins/customize/e2e/raw_tables/issue_repo_commits.csv 
b/backend/plugins/customize/e2e/raw_tables/issue_repo_commits.csv
index 79f3dcd6e..b8a131460 100644
--- a/backend/plugins/customize/e2e/raw_tables/issue_repo_commits.csv
+++ b/backend/plugins/customize/e2e/raw_tables/issue_repo_commits.csv
@@ -1,13 +1,25 @@
-"created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","issue_id","repo_url","commit_sha","host","namespace","repo_name"
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",1,"","jira:JiraIssue:1:10063","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8748a066cbaf67b15e86f2c636f9931347e987cf","8748a066cbaf67b15e86f2c636f9931347e987cf","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",2,"","jira:JiraIssue:1:10064","https://bitbucket.org/mynamespace/incubator-devlake/commits/abc0892edaee00dd7ee268dbee71620407a29bca","abc0892edaee00dd7ee268dbee71620407a29bca","bitbucket.org","mynamespace","incubator-devlake";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",3,"","jira:JiraIssue:1:10064","https://github.com/apache/incubator-devlake/commit/e6bde456807818c5c78d7b265964d6d48b653af6","e6bde456807818c5c78d7b265964d6d48b653af6","github.com","apache","incubator-devlake";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",4,"","jira:JiraIssue:1:10065","https://gitlab.com/namespace1/namespace2/myrepo/-/commit/8f91020bcf684c6ad07adfafa3d8a2f826686c42","8f91020bcf684c6ad07adfafa3d8a2f826686c42","gitlab.com","namespace1/namespace2","murepo";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",5,"","jira:JiraIssue:1:10066","https://gitlab.com/meri.co/vdev.co/-/commit/0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef","0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef","gitlab.com","meri.co","vdev.co";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",13,"","jira:JiraIssue:1:10139","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423","8993c04249e9d549e8950daec86717548c53c423","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",19,"","jira:JiraIssue:1:10145","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/07aa2ebed68e286dc51a7e0082031196a6135f74","07aa2ebed68e286dc51a7e0082031196a6135f74","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",21,"","jira:JiraIssue:1:10145","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423","ef5ab26111744f65f5191b247767a473c70d6c95","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",20,"","jira:JiraIssue:1:10145","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d70d6687e06304d9b6e0cb32b3f8c0f0928400f7","d70d6687e06304d9b6e0cb32b3f8c0f0928400f7","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",36,"","jira:JiraIssue:1:10159","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d28785ff09229ac9e3c6734f0c97466ab00eb4da","d28785ff09229ac9e3c6734f0c97466ab00eb4da","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",38,"","jira:JiraIssue:1:10202","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/0ab12c4d4064003602edceed900d1456b6209894","0ab12c4d4064003602edceed900d1456b6209894","example.com","PROJECTNAME","ui_jira";
-"2023-03-30 14:06:06.831","2023-03-30 
14:06:06.831","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",39,"","jira:JiraIssue:1:10203","https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/980e9fe7bc3e22a0409f7241a024eaf9c53680dd","980e9fe7bc3e22a0409f7241a024eaf9c53680dd","example.com","PROJECTNAME","ui_jira";
+issue_id,repo_url,commit_sha,host,namespace,repo_name
+csv:1,https://example.com:8080/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8748a066cbaf67b15e86f2c636f9931347e987cf,8748a066cbaf67b15e86f2c636f9931347e987cf,example.com,PROJECTNAME,ui_jira
+csv:10,https://bitbucket.org/mynamespace/incubator-devlake/commits/abc0892edaee00dd7ee268dbee71620407a29bca,abc0892edaee00dd7ee268dbee71620407a29bca,bitbucket.org,mynamespace,incubator-devlake
+csv:11,https://github.com/apache/incubator-devlake/commit/e6bde456807818c5c78d7b265964d6d48b653af6,e6bde456807818c5c78d7b265964d6d48b653af6,github.com,apache,incubator-devlake
+csv:12,https://gitlab.com/namespace1/namespace2/myrepo/-/commit/8f91020bcf684c6ad07adfafa3d8a2f826686c42,8f91020bcf684c6ad07adfafa3d8a2f826686c42,gitlab.com,namespace1/namespace2,murepo
+csv:13,https://gitlab.com/meri.co/vdev.co/-/commit/0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,gitlab.com,meri.co,vdev.co
+csv:13,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,8993c04249e9d549e8950daec86717548c53c423,example.com,PROJECTNAME,ui_jira
+csv:13,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/07aa2ebed68e286dc51a7e0082031196a6135f74,07aa2ebed68e286dc51a7e0082031196a6135f74,example.com,PROJECTNAME,ui_jira
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,ef5ab26111744f65f5191b247767a473c70d6c95,example.com,PROJECTNAME,ui_jira
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,example.com,PROJECTNAME,ui_jira
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d28785ff09229ac9e3c6734f0c97466ab00eb4da,d28785ff09229ac9e3c6734f0c97466ab00eb4da,example.com,PROJECTNAME,ui_jira
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/0ab12c4d4064003602edceed900d1456b6209894,0ab12c4d4064003602edceed900d1456b6209894,example.com,PROJECTNAME,ui_jira
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/980e9fe7bc3e22a0409f7241a024eaf9c53680dd,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10063,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8748a066cbaf67b15e86f2c636f9931347e987cf,8748a066cbaf67b15e86f2c636f9931347e987cf,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10064,https://bitbucket.org/mynamespace/incubator-devlake/commits/abc0892edaee00dd7ee268dbee71620407a29bca,abc0892edaee00dd7ee268dbee71620407a29bca,bitbucket.org,mynamespace,incubator-devlake
+jira:JiraIssue:1:10064,https://github.com/apache/incubator-devlake/commit/e6bde456807818c5c78d7b265964d6d48b653af6,e6bde456807818c5c78d7b265964d6d48b653af6,github.com,apache,incubator-devlake
+jira:JiraIssue:1:10065,https://gitlab.com/namespace1/namespace2/myrepo/-/commit/8f91020bcf684c6ad07adfafa3d8a2f826686c42,8f91020bcf684c6ad07adfafa3d8a2f826686c42,gitlab.com,namespace1/namespace2,murepo
+jira:JiraIssue:1:10066,https://gitlab.com/meri.co/vdev.co/-/commit/0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,gitlab.com,meri.co,vdev.co
+jira:JiraIssue:1:10139,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,8993c04249e9d549e8950daec86717548c53c423,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/07aa2ebed68e286dc51a7e0082031196a6135f74,07aa2ebed68e286dc51a7e0082031196a6135f74,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,ef5ab26111744f65f5191b247767a473c70d6c95,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10159,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d28785ff09229ac9e3c6734f0c97466ab00eb4da,d28785ff09229ac9e3c6734f0c97466ab00eb4da,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10202,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/0ab12c4d4064003602edceed900d1456b6209894,0ab12c4d4064003602edceed900d1456b6209894,example.com,PROJECTNAME,ui_jira
+jira:JiraIssue:1:10203,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/980e9fe7bc3e22a0409f7241a024eaf9c53680dd,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,example.com,PROJECTNAME,ui_jira
diff --git a/backend/plugins/customize/e2e/raw_tables/issues_commits.csv 
b/backend/plugins/customize/e2e/raw_tables/issues_commits.csv
index 11586e3c2..3d9148870 100644
--- a/backend/plugins/customize/e2e/raw_tables/issues_commits.csv
+++ b/backend/plugins/customize/e2e/raw_tables/issues_commits.csv
@@ -1,13 +1,25 @@
-"created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","issue_id","commit_sha"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",1,"","jira:JiraIssue:1:10063","8748a066cbaf67b15e86f2c636f9931347e987cf"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":9}","_raw_jira_api_remotelinks",2,"","jira:JiraIssue:1:10064","abc0892edaee00dd7ee268dbee71620407a29bca"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",3,"","jira:JiraIssue:1:10064","e6bde456807818c5c78d7b265964d6d48b653af6"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",4,"","jira:JiraIssue:1:10065","8f91020bcf684c6ad07adfafa3d8a2f826686c42"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",5,"","jira:JiraIssue:1:10066","0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":2,""BoardId"":8}","_raw_jira_api_remotelinks",13,"","jira:JiraIssue:1:10139","8993c04249e9d549e8950daec86717548c53c423"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",19,"","jira:JiraIssue:1:10145","07aa2ebed68e286dc51a7e0082031196a6135f74"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",20,"","jira:JiraIssue:1:10145","d70d6687e06304d9b6e0cb32b3f8c0f0928400f7"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":11,""BoardId"":18}","_raw_jira_api_remotelinks",21,"","jira:JiraIssue:1:10145","ef5ab26111744f65f5191b247767a473c70d6c95"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",36,"","jira:JiraIssue:1:10159","d28785ff09229ac9e3c6734f0c97466ab00eb4da"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",38,"","jira:JiraIssue:1:10202","0ab12c4d4064003602edceed900d1456b6209894"
-"2022-10-25 08:38:12.588","2022-10-25 
08:38:12.588","{""ConnectionId"":1,""BoardId"":8}","_raw_jira_api_remotelinks",39,"","jira:JiraIssue:1:10203","980e9fe7bc3e22a0409f7241a024eaf9c53680dd"
+issue_id,commit_sha
+csv:1,8748a066cbaf67b15e86f2c636f9931347e987cf
+csv:10,abc0892edaee00dd7ee268dbee71620407a29bca
+csv:11,e6bde456807818c5c78d7b265964d6d48b653af6
+csv:12,8f91020bcf684c6ad07adfafa3d8a2f826686c42
+csv:13,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef
+csv:13,8993c04249e9d549e8950daec86717548c53c423
+csv:13,07aa2ebed68e286dc51a7e0082031196a6135f74
+csv:14,ef5ab26111744f65f5191b247767a473c70d6c95
+csv:14,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7
+csv:14,d28785ff09229ac9e3c6734f0c97466ab00eb4da
+csv:14,0ab12c4d4064003602edceed900d1456b6209894
+csv:14,980e9fe7bc3e22a0409f7241a024eaf9c53680dd
+jira:JiraIssue:1:10063,8748a066cbaf67b15e86f2c636f9931347e987cf
+jira:JiraIssue:1:10064,abc0892edaee00dd7ee268dbee71620407a29bca
+jira:JiraIssue:1:10064,e6bde456807818c5c78d7b265964d6d48b653af6
+jira:JiraIssue:1:10065,8f91020bcf684c6ad07adfafa3d8a2f826686c42
+jira:JiraIssue:1:10066,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef
+jira:JiraIssue:1:10139,8993c04249e9d549e8950daec86717548c53c423
+jira:JiraIssue:1:10145,07aa2ebed68e286dc51a7e0082031196a6135f74
+jira:JiraIssue:1:10145,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7
+jira:JiraIssue:1:10145,ef5ab26111744f65f5191b247767a473c70d6c95
+jira:JiraIssue:1:10159,d28785ff09229ac9e3c6734f0c97466ab00eb4da
+jira:JiraIssue:1:10202,0ab12c4d4064003602edceed900d1456b6209894
+jira:JiraIssue:1:10203,980e9fe7bc3e22a0409f7241a024eaf9c53680dd
diff --git a/backend/plugins/customize/e2e/raw_tables/issues_input.csv 
b/backend/plugins/customize/e2e/raw_tables/issues_input.csv
index c55b0643f..ac05acd76 100644
--- a/backend/plugins/customize/e2e/raw_tables/issues_input.csv
+++ b/backend/plugins/customize/e2e/raw_tables/issues_input.csv
@@ -1,5 +1,7 @@
-"id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","url","icon_url","issue_key","title","description","epic_key","type","status","original_status","story_point","resolution_date","created_date","updated_date","parent_issue_id","priority","original_estimate_minutes","time_spent_minutes","time_remaining_minutes","creator_id","creator_name","assignee_id","assignee_name","severity","component","lead_time_minutes","original_project","original
 [...]
-"bitbucket:BitbucketIssue:1:1","2022-09-15 15:27:56.395","2022-09-15 
15:27:56.395","{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}","_raw_bitbucket_api_issues",60,"","https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1","",1,"issue
 test","bitbucket issues test for 
devlake","","issue","TODO","new",0,NULL,"2022-07-17 
07:15:55.959+00:00","2022-07-17 
09:11:42.656+00:00","","major",0,0,0,"bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf","tgp","bitbucket:
 [...]
-"bitbucket:BitbucketIssue:1:10","2022-09-15 15:27:56.395","2022-09-15 
15:27:56.395","{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}","_raw_bitbucket_api_issues",52,"","https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10","",10,"issue
 test007","issue test007","","issue","TODO","new",0,NULL,"2022-08-12 
13:43:00.783+00:00","2022-08-12 
13:43:00.783+00:00","","trivial",0,0,0,"bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf","tgp","bitbucket:BitbucketAcc
 [...]
-"bitbucket:BitbucketIssue:1:13","2022-09-15 15:27:56.395","2022-09-15 
15:27:56.395","{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}","_raw_bitbucket_api_issues",50,"","https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/13","",13,"issue
 test010","issue test010","","issue","TODO","new",0,NULL,"2022-08-12 
13:44:46.508+00:00","2022-08-12 
13:44:46.508+00:00","","critical",0,0,0,"bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf","tgp","","","","",NULL,NULL,
 [...]
-"bitbucket:BitbucketIssue:1:14","2022-09-15 15:27:56.395","2022-09-15 
15:27:56.395","{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}","_raw_bitbucket_api_issues",49,"","https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/14","",14,"issue
 test011","issue test011","","issue","TODO","new",0,NULL,"2022-08-12 
13:45:12.810+00:00","2022-08-12 
13:45:12.810+00:00","","blocker",0,0,0,"bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf","tgp","bitbucket:BitbucketAcc
 [...]
+id,url,issue_key,title,original_type,original_status,created_date,resolution_date,story_point,priority,severity,original_estimate_minutes,time_spent_minutes,component,epic_key,creator_name,assignee_name,x_int,x_time,x_varchar,x_float,labels
+csv:1,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1,1,issue
 test,BUG,new,2022-07-17 
07:15:55.959+00:00,NULL,0,major,,0,0,,,tgp,tgp,10,2022-09-15 
15:27:56,world,8,NULL
+csv:10,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10,10,issue
 test007,BUG,new,2022-08-12 
13:43:00.783+00:00,NULL,0,trivial,,0,0,,,tgp,tgp,30,2022-09-15 
15:27:56,abc,24590,hello worlds
+csv:11,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/11,11,issue
 test011,REQUIREMENT,new,2022-08-10 
13:44:46.508+00:00,NULL,0,major,,0,0,,,tgp,,1,2022-09-15 
15:27:56,NULL,0.00014,NULL
+csv:12,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/12,12,issue
 test012,REQUIREMENT,new,2022-08-11 
13:44:46.508+00:00,NULL,0,major,,0,0,,,tgp,,1,2022-09-15 
15:27:56,NULL,0.00014,NULL
+csv:13,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/13,13,issue
 test013,REQUIREMENT,new,2022-08-12 
13:44:46.508+00:00,NULL,0,critical,,0,0,,,tgp,,1,2022-09-15 
15:27:56,NULL,0.00014,NULL
+csv:14,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/14,14,issue
 test014,INCIDENT,new,2022-08-12 
13:45:12.810+00:00,NULL,0,blocker,,0,0,,,tgp,tgp,41534568464351,2022-09-15 
15:27:56,NULL,NULL,"label1,label2,label3"
diff --git a/backend/plugins/customize/e2e/raw_tables/issues_input2.csv 
b/backend/plugins/customize/e2e/raw_tables/issues_input2.csv
new file mode 100644
index 000000000..215bc651d
--- /dev/null
+++ b/backend/plugins/customize/e2e/raw_tables/issues_input2.csv
@@ -0,0 +1,3 @@
+id,url,issue_key,title,original_type,original_status,created_date,resolution_date,story_point,priority,severity,original_estimate_minutes,time_spent_minutes,component,epic_key,creator_name,assignee_name,x_int,x_time,x_varchar,x_float,labels
+csv:1,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1,1,issue
 test,BUG,new,2022-07-17 
07:15:55.959+00:00,NULL,0,major,,0,0,,,tgp,tgp,10,2022-09-15 
15:27:56,world,8,NULL
+csv:10,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10,10,issue
 test007,BUG,new,2022-08-12 
13:43:00.783+00:00,NULL,0,trivial,,0,0,,,tgp,tgp,30,2022-09-15 
15:27:56,abc,24590,hello worlds
diff --git 
a/backend/plugins/customize/e2e/snapshot_tables/_tool_customized_fields.csv 
b/backend/plugins/customize/e2e/snapshot_tables/_tool_customized_fields.csv
deleted file mode 100644
index 6d8ab78ad..000000000
--- a/backend/plugins/customize/e2e/snapshot_tables/_tool_customized_fields.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-tb_name,column_name,display_name,data_type
-issues,x_float,test column x_float,float
-issues,x_int,test column x_int,bigint
-issues,x_text,test column x_text,text
-issues,x_time,test column x_time,timestamp
diff --git a/backend/plugins/customize/e2e/snapshot_tables/board_issues.csv 
b/backend/plugins/customize/e2e/snapshot_tables/board_issues.csv
index 5c1c86d1a..dac06627b 100644
--- a/backend/plugins/customize/e2e/snapshot_tables/board_issues.csv
+++ b/backend/plugins/customize/e2e/snapshot_tables/board_issues.csv
@@ -1,5 +1,9 @@
 
board_id,issue_id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",bitbucket:BitbucketIssue:1:1,,,0,
-"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",bitbucket:BitbucketIssue:1:10,,,0,
-"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",bitbucket:BitbucketIssue:1:13,,,0,
-"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",bitbucket:BitbucketIssue:1:14,,,0,
+csv-board,csv:1,,,0,
+csv-board,csv:10,,,0,
+csv-board,csv:11,,,0,
+csv-board,csv:12,,,0,
+csv-board,csv:13,,,0,
+csv-board,csv:14,,,0,
+csv-board2,csv:1,,,0,
+csv-board2,csv:10,,,0,
diff --git a/backend/plugins/customize/e2e/snapshot_tables/issue_commits.csv 
b/backend/plugins/customize/e2e/snapshot_tables/issue_commits.csv
index 98b01ac99..97b875af1 100644
--- a/backend/plugins/customize/e2e/snapshot_tables/issue_commits.csv
+++ b/backend/plugins/customize/e2e/snapshot_tables/issue_commits.csv
@@ -1,13 +1,25 @@
 
issue_id,commit_sha,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-jira:JiraIssue:1:10063,8748a066cbaf67b15e86f2c636f9931347e987cf,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,1,
-jira:JiraIssue:1:10064,abc0892edaee00dd7ee268dbee71620407a29bca,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,2,
-jira:JiraIssue:1:10064,e6bde456807818c5c78d7b265964d6d48b653af6,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,3,
-jira:JiraIssue:1:10065,8f91020bcf684c6ad07adfafa3d8a2f826686c42,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,4,
-jira:JiraIssue:1:10066,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,5,
-jira:JiraIssue:1:10139,8993c04249e9d549e8950daec86717548c53c423,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,13,
-jira:JiraIssue:1:10145,07aa2ebed68e286dc51a7e0082031196a6135f74,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,19,
-jira:JiraIssue:1:10145,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,20,
-jira:JiraIssue:1:10145,ef5ab26111744f65f5191b247767a473c70d6c95,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,21,
-jira:JiraIssue:1:10159,d28785ff09229ac9e3c6734f0c97466ab00eb4da,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,36,
-jira:JiraIssue:1:10202,0ab12c4d4064003602edceed900d1456b6209894,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,38,
-jira:JiraIssue:1:10203,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,39,
+csv:1,8748a066cbaf67b15e86f2c636f9931347e987cf,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:10,abc0892edaee00dd7ee268dbee71620407a29bca,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:11,e6bde456807818c5c78d7b265964d6d48b653af6,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:12,8f91020bcf684c6ad07adfafa3d8a2f826686c42,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:13,07aa2ebed68e286dc51a7e0082031196a6135f74,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:13,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:13,8993c04249e9d549e8950daec86717548c53c423,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:14,0ab12c4d4064003602edceed900d1456b6209894,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:14,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:14,d28785ff09229ac9e3c6734f0c97466ab00eb4da,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:14,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,"{""ConnectionId"":1,""BoardId"":8}",,,
+csv:14,ef5ab26111744f65f5191b247767a473c70d6c95,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10063,8748a066cbaf67b15e86f2c636f9931347e987cf,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10064,abc0892edaee00dd7ee268dbee71620407a29bca,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10064,e6bde456807818c5c78d7b265964d6d48b653af6,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10065,8f91020bcf684c6ad07adfafa3d8a2f826686c42,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10066,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10139,8993c04249e9d549e8950daec86717548c53c423,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10145,07aa2ebed68e286dc51a7e0082031196a6135f74,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10145,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10145,ef5ab26111744f65f5191b247767a473c70d6c95,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10159,d28785ff09229ac9e3c6734f0c97466ab00eb4da,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10202,0ab12c4d4064003602edceed900d1456b6209894,"{""ConnectionId"":1,""BoardId"":8}",,,
+jira:JiraIssue:1:10203,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,"{""ConnectionId"":1,""BoardId"":8}",,,
diff --git a/backend/plugins/customize/e2e/snapshot_tables/issue_labels.csv 
b/backend/plugins/customize/e2e/snapshot_tables/issue_labels.csv
index 7b7191daa..d7523c026 100644
--- a/backend/plugins/customize/e2e/snapshot_tables/issue_labels.csv
+++ b/backend/plugins/customize/e2e/snapshot_tables/issue_labels.csv
@@ -1,5 +1,5 @@
 
issue_id,label_name,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-bitbucket:BitbucketIssue:1:10,hello 
worlds,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",,0,
-bitbucket:BitbucketIssue:1:14,label1,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",,0,
-bitbucket:BitbucketIssue:1:14,label2,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",,0,
-bitbucket:BitbucketIssue:1:14,label3,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",,0,
+csv:10,hello worlds,csv-board2,,0,
+csv:14,label1,csv-board,,0,
+csv:14,label2,csv-board,,0,
+csv:14,label3,csv-board,,0,
diff --git 
a/backend/plugins/customize/e2e/snapshot_tables/issue_repo_commits.csv 
b/backend/plugins/customize/e2e/snapshot_tables/issue_repo_commits.csv
index e8719548d..311a93678 100644
--- a/backend/plugins/customize/e2e/snapshot_tables/issue_repo_commits.csv
+++ b/backend/plugins/customize/e2e/snapshot_tables/issue_repo_commits.csv
@@ -1,13 +1,25 @@
 
issue_id,repo_url,commit_sha,host,namespace,repo_name,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-jira:JiraIssue:1:10063,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8748a066cbaf67b15e86f2c636f9931347e987cf,8748a066cbaf67b15e86f2c636f9931347e987cf,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,1,
-jira:JiraIssue:1:10064,https://bitbucket.org/mynamespace/incubator-devlake/commits/abc0892edaee00dd7ee268dbee71620407a29bca,abc0892edaee00dd7ee268dbee71620407a29bca,bitbucket.org,mynamespace,incubator-devlake,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,2,
-jira:JiraIssue:1:10064,https://github.com/apache/incubator-devlake/commit/e6bde456807818c5c78d7b265964d6d48b653af6,e6bde456807818c5c78d7b265964d6d48b653af6,github.com,apache,incubator-devlake,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,3,
-jira:JiraIssue:1:10065,https://gitlab.com/namespace1/namespace2/myrepo/-/commit/8f91020bcf684c6ad07adfafa3d8a2f826686c42,8f91020bcf684c6ad07adfafa3d8a2f826686c42,gitlab.com,namespace1/namespace2,murepo,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,4,
-jira:JiraIssue:1:10066,https://gitlab.com/meri.co/vdev.co/-/commit/0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,gitlab.com,meri.co,vdev.co,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,5,
-jira:JiraIssue:1:10139,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,8993c04249e9d549e8950daec86717548c53c423,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,13,
-jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/07aa2ebed68e286dc51a7e0082031196a6135f74,07aa2ebed68e286dc51a7e0082031196a6135f74,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,19,
-jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,ef5ab26111744f65f5191b247767a473c70d6c95,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,21,
-jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,20,
-jira:JiraIssue:1:10159,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d28785ff09229ac9e3c6734f0c97466ab00eb4da,d28785ff09229ac9e3c6734f0c97466ab00eb4da,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,36,
-jira:JiraIssue:1:10202,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/0ab12c4d4064003602edceed900d1456b6209894,0ab12c4d4064003602edceed900d1456b6209894,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,38,
-jira:JiraIssue:1:10203,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/980e9fe7bc3e22a0409f7241a024eaf9c53680dd,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_remotelinks,39,
+csv:1,https://example.com:8080/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8748a066cbaf67b15e86f2c636f9931347e987cf,8748a066cbaf67b15e86f2c636f9931347e987cf,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:10,https://bitbucket.org/mynamespace/incubator-devlake/commits/abc0892edaee00dd7ee268dbee71620407a29bca,abc0892edaee00dd7ee268dbee71620407a29bca,bitbucket.org,mynamespace,incubator-devlake,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:11,https://github.com/apache/incubator-devlake/commit/e6bde456807818c5c78d7b265964d6d48b653af6,e6bde456807818c5c78d7b265964d6d48b653af6,github.com,apache,incubator-devlake,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:12,https://gitlab.com/namespace1/namespace2/myrepo/-/commit/8f91020bcf684c6ad07adfafa3d8a2f826686c42,8f91020bcf684c6ad07adfafa3d8a2f826686c42,gitlab.com,namespace1/namespace2,murepo,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:13,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/07aa2ebed68e286dc51a7e0082031196a6135f74,07aa2ebed68e286dc51a7e0082031196a6135f74,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:13,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,8993c04249e9d549e8950daec86717548c53c423,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:13,https://gitlab.com/meri.co/vdev.co/-/commit/0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,gitlab.com,meri.co,vdev.co,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/0ab12c4d4064003602edceed900d1456b6209894,0ab12c4d4064003602edceed900d1456b6209894,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,ef5ab26111744f65f5191b247767a473c70d6c95,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/980e9fe7bc3e22a0409f7241a024eaf9c53680dd,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d28785ff09229ac9e3c6734f0c97466ab00eb4da,d28785ff09229ac9e3c6734f0c97466ab00eb4da,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+csv:14,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10063,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8748a066cbaf67b15e86f2c636f9931347e987cf,8748a066cbaf67b15e86f2c636f9931347e987cf,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10064,https://bitbucket.org/mynamespace/incubator-devlake/commits/abc0892edaee00dd7ee268dbee71620407a29bca,abc0892edaee00dd7ee268dbee71620407a29bca,bitbucket.org,mynamespace,incubator-devlake,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10064,https://github.com/apache/incubator-devlake/commit/e6bde456807818c5c78d7b265964d6d48b653af6,e6bde456807818c5c78d7b265964d6d48b653af6,github.com,apache,incubator-devlake,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10065,https://gitlab.com/namespace1/namespace2/myrepo/-/commit/8f91020bcf684c6ad07adfafa3d8a2f826686c42,8f91020bcf684c6ad07adfafa3d8a2f826686c42,gitlab.com,namespace1/namespace2,murepo,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10066,https://gitlab.com/meri.co/vdev.co/-/commit/0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef,gitlab.com,meri.co,vdev.co,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10139,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,8993c04249e9d549e8950daec86717548c53c423,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/07aa2ebed68e286dc51a7e0082031196a6135f74,07aa2ebed68e286dc51a7e0082031196a6135f74,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/8993c04249e9d549e8950daec86717548c53c423,ef5ab26111744f65f5191b247767a473c70d6c95,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10145,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,d70d6687e06304d9b6e0cb32b3f8c0f0928400f7,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10159,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/d28785ff09229ac9e3c6734f0c97466ab00eb4da,d28785ff09229ac9e3c6734f0c97466ab00eb4da,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10202,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/0ab12c4d4064003602edceed900d1456b6209894,0ab12c4d4064003602edceed900d1456b6209894,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
+jira:JiraIssue:1:10203,https://example.com/bitbucket/projects/PROJECTNAME/repos/ui_jira/commits/980e9fe7bc3e22a0409f7241a024eaf9c53680dd,980e9fe7bc3e22a0409f7241a024eaf9c53680dd,example.com,PROJECTNAME,ui_jira,"{""ConnectionId"":1,""BoardId"":8}";,,,
diff --git a/backend/plugins/customize/e2e/snapshot_tables/issues.csv 
b/backend/plugins/customize/e2e/snapshot_tables/issues.csv
deleted file mode 100644
index 954eb2102..000000000
--- a/backend/plugins/customize/e2e/snapshot_tables/issues.csv
+++ /dev/null
@@ -1,31 +0,0 @@
-id,x_test,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-jira:JiraIssue:1:10063,2020-06-12T08:13:13.360+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1701,
-jira:JiraIssue:1:10064,2020-06-12T08:15:36.123+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1702,
-jira:JiraIssue:1:10065,2020-06-12T08:15:41.600+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1703,
-jira:JiraIssue:1:10066,2020-06-12T08:15:46.144+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1704,
-jira:JiraIssue:1:10067,2020-06-12T08:16:44.157+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1705,
-jira:JiraIssue:1:10068,2020-06-12T08:17:26.986+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1706,
-jira:JiraIssue:1:10070,2020-06-12T08:18:58.050+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1707,
-jira:JiraIssue:1:10071,2020-06-12T08:19:17.336+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1708,
-jira:JiraIssue:1:10072,2020-06-12T08:19:24.637+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1709,
-jira:JiraIssue:1:10076,2020-06-12T08:24:25.922+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1710,
-jira:JiraIssue:1:10077,2020-06-12T08:24:39.624+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1711,
-jira:JiraIssue:1:10078,2020-06-12T08:24:49.017+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1712,
-jira:JiraIssue:1:10079,2020-06-12T08:24:56.048+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1713,
-jira:JiraIssue:1:10081,2020-06-12T08:28:00.241+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1714,
-jira:JiraIssue:1:10082,2020-06-12T08:29:43.677+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1715,
-jira:JiraIssue:1:10085,2020-06-12T08:33:57.204+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1716,
-jira:JiraIssue:1:10086,2020-06-12T08:35:15.489+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1717,
-jira:JiraIssue:1:10087,2020-06-12T08:40:54.210+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1718,
-jira:JiraIssue:1:10088,2020-06-12T08:41:01.683+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1719,
-jira:JiraIssue:1:10089,2020-06-12T08:41:16.622+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1720,
-jira:JiraIssue:1:10090,2020-06-12T08:41:36.317+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1721,
-jira:JiraIssue:1:10091,2020-06-12T08:48:29.035+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1722,
-jira:JiraIssue:1:10092,2020-06-12T08:48:39.803+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1723,
-jira:JiraIssue:1:10093,2020-06-12T08:48:46.751+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1724,
-jira:JiraIssue:1:10094,2020-06-12T08:48:53.279+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1725,
-jira:JiraIssue:1:10095,2020-06-12T08:50:45.674+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1726,
-jira:JiraIssue:1:10096,2020-06-12T08:51:57.807+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1727,
-jira:JiraIssue:1:10097,2020-06-12T08:52:04.767+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1728,
-jira:JiraIssue:1:10098,2020-06-12T08:52:12.678+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1729,
-jira:JiraIssue:1:10099,2020-06-12T08:52:23.456+0800,"{""ConnectionId"":1,""BoardId"":8}",_raw_jira_api_issues,1730,
diff --git a/backend/plugins/customize/e2e/snapshot_tables/issues_csv.csv 
b/backend/plugins/customize/e2e/snapshot_tables/issues_csv.csv
deleted file mode 100644
index 4f930ee29..000000000
--- a/backend/plugins/customize/e2e/snapshot_tables/issues_csv.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-"id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","url","icon_url","issue_key","title","description","epic_key","type","status","original_status","story_point","resolution_date","created_date","updated_date","parent_issue_id","priority","original_estimate_minutes","time_spent_minutes","time_remaining_minutes","creator_id","creator_name","assignee_id","assignee_name","severity","component","lead_time_minutes","original_project","original
 [...]
-"abc","2023-02-07 14:55:19.650","2023-02-07 
14:55:19.650","","",0,"","","","","","","","","","",0,NULL,NULL,NULL,"","",0,0,0,"","","","","","",0,"","",20,"2022-09-15
 15:27:56","hello",123.5
-"bitbucket:BitbucketIssue:1:1","2022-09-15 15:27:56.395","2022-09-15 
15:27:56.395","{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}","_raw_bitbucket_api_issues",60,"","https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1","",1,"issue
 test","bitbucket issues test for 
devlake","","issue","TODO","new",0,NULL,"2022-07-17 07:15:55.959","2022-07-17 
09:11:42.656","","major",0,0,0,"bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf","tgp","bitbucket:BitbucketAcc
 [...]
-"bitbucket:BitbucketIssue:1:10","2022-09-15 15:27:56.395","2022-09-15 
15:27:56.395","{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}","_raw_bitbucket_api_issues",52,"","https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10","",10,"issue
 test007","issue test007","","issue","TODO","new",0,NULL,"2022-08-12 
13:43:00.783","2022-08-12 
13:43:00.783","","trivial",0,0,0,"bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf","tgp","bitbucket:BitbucketAccount:1:62abf
 [...]
diff --git a/backend/plugins/customize/e2e/snapshot_tables/issues_output.csv 
b/backend/plugins/customize/e2e/snapshot_tables/issues_output.csv
index d64c1e8c1..4e3528e1a 100644
--- a/backend/plugins/customize/e2e/snapshot_tables/issues_output.csv
+++ b/backend/plugins/customize/e2e/snapshot_tables/issues_output.csv
@@ -1,5 +1,7 @@
 
id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,parent_issue_id,priority,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,severity,component,original_project,x_varchar,x_text,x_time,x_float,x_int,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-bitbucket:BitbucketIssue:1:1,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1,,1,issue
 test,bitbucket issues test for 
devlake,,issue,,TODO,new,0,,2022-07-17T07:15:55.959+00:00,2022-07-17T09:11:42.656+00:00,,,major,0,0,0,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,,,,world,,2022-09-15T15:27:56.000+00:00,8,10,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",_raw_bitbucket_api_issues,60,
-bitbucket:BitbucketIssue:1:10,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10,,10,issue
 test007,issue 
test007,,issue,,TODO,new,0,,2022-08-12T13:43:00.783+00:00,2022-08-12T13:43:00.783+00:00,,,trivial,0,0,0,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,,,,abc,,2022-09-15T15:27:56.000+00:00,2.45679e+06,30,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",_raw_bitbucket_api_issues,52,
-bitbucket:BitbucketIssue:1:13,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/13,,13,issue
 test010,issue 
test010,,issue,,TODO,new,0,,2022-08-12T13:44:46.508+00:00,2022-08-12T13:44:46.508+00:00,,,critical,0,0,0,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,,,,,,,,2022-09-15T15:27:56.000+00:00,0.00014,1,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",_raw_bitbucket_api_issues,50,
-bitbucket:BitbucketIssue:1:14,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/14,,14,issue
 test011,issue 
test011,,issue,,TODO,new,0,,2022-08-12T13:45:12.810+00:00,2022-08-12T13:45:12.810+00:00,,,blocker,0,0,0,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf,tgp,,,,,,2022-09-15T15:27:56.000+00:00,,41534568464351,"{""ConnectionId"":1,""Owner"":""thenicetgp"",""Repo"":""lake""}",_raw_bitbucket_api_issues,49,
+csv:1,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1,,1,issue
 
test,,,,BUG,,new,0,,2022-07-17T07:15:55.959+00:00,,,,major,0,0,,,tgp,,tgp,,,,world,,2022-09-15T15:27:56.000+00:00,8,10,csv-board2,,,
+csv:10,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10,,10,issue
 
test007,,,,BUG,,new,0,,2022-08-12T13:43:00.783+00:00,,,,trivial,0,0,,,tgp,,tgp,,,,abc,,2022-09-15T15:27:56.000+00:00,24590,30,csv-board2,,,
+csv:11,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/11,,11,issue
 
test011,,,,REQUIREMENT,,new,0,,2022-08-10T13:44:46.508+00:00,,,,major,0,0,,,tgp,,,,,,,,2022-09-15T15:27:56.000+00:00,0.00014,1,csv-board,,,
+csv:12,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/12,,12,issue
 
test012,,,,REQUIREMENT,,new,0,,2022-08-11T13:44:46.508+00:00,,,,major,0,0,,,tgp,,,,,,,,2022-09-15T15:27:56.000+00:00,0.00014,1,csv-board,,,
+csv:13,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/13,,13,issue
 
test013,,,,REQUIREMENT,,new,0,,2022-08-12T13:44:46.508+00:00,,,,critical,0,0,,,tgp,,,,,,,,2022-09-15T15:27:56.000+00:00,0.00014,1,csv-board,,,
+csv:14,https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/14,,14,issue
 
test014,,,,INCIDENT,,new,0,,2022-08-12T13:45:12.810+00:00,,,,blocker,0,0,,,tgp,,tgp,,,,,,2022-09-15T15:27:56.000+00:00,,41534568464351,csv-board,,,
diff --git a/backend/plugins/customize/service/service.go 
b/backend/plugins/customize/service/service.go
index 911c93928..a5187c28f 100644
--- a/backend/plugins/customize/service/service.go
+++ b/backend/plugins/customize/service/service.go
@@ -85,6 +85,8 @@ func (s *Service) GetFields(table string) 
([]models.CustomizedField, errors.Erro
        }
        return result, nil
 }
+
+// checkField checks if the field exist in table
 func (s *Service) checkField(table, field string) (bool, errors.Error) {
        if table == "" {
                return false, errors.Default.New("empty table name")
@@ -143,24 +145,44 @@ func (s *Service) DeleteField(table, field string) 
errors.Error {
        return s.dal.Delete(&models.CustomizedField{}, dal.Where("tb_name = ? 
AND column_name = ?", table, field))
 }
 
+// getCustomizedFields returns all the customized fields definitions of the 
table
 func (s *Service) getCustomizedFields(table string) ([]models.CustomizedField, 
errors.Error) {
        var result []models.CustomizedField
        err := s.dal.All(&result, dal.Where("tb_name = ?", table))
        return result, err
 }
 
+// ImportIssue import csv file to the table `issues`, and create relations to 
boards
+// issue could exist in multiple boards, so we should only delete an old 
records when it doesn't belong to another board
 func (s *Service) ImportIssue(boardId string, file io.ReadCloser) errors.Error 
{
-       err := s.dal.Delete(&ticket.Issue{}, dal.Where("_raw_data_params = ?", 
boardId))
+       err := s.dal.Delete(
+               &ticket.Issue{},
+               dal.Where("id IN (SELECT issue_id FROM board_issues WHERE 
board_id=? AND issue_id NOT IN (SELECT issue_id FROM board_issues WHERE 
board_id!=?))", boardId, boardId),
+       )
+       if err != nil {
+               return err
+       }
+
+       err = s.dal.Delete(
+               &ticket.IssueLabel{},
+               dal.Where("issue_id IN (SELECT issue_id FROM board_issues WHERE 
board_id=? AND issue_id NOT IN (SELECT issue_id FROM board_issues WHERE 
board_id!=?))", boardId, boardId),
+       )
        if err != nil {
                return err
        }
-       err = s.dal.Delete(&ticket.BoardIssue{}, dal.Where("board_id = ?", 
boardId))
+
+       err = s.dal.Delete(
+               &ticket.BoardIssue{},
+               dal.Where("board_id = ?", boardId),
+       )
        if err != nil {
                return err
        }
+
        return s.importCSV(file, boardId, s.issueHandlerFactory(boardId))
 }
 
+// SaveBoard make sure the board exists in table `boards`
 func (s *Service) SaveBoard(boardId, boardName string) errors.Error {
        return s.dal.CreateOrUpdate(&ticket.Board{
                DomainEntity: domainlayer.DomainEntity{
@@ -171,40 +193,39 @@ func (s *Service) SaveBoard(boardId, boardName string) 
errors.Error {
        })
 }
 
-func (s *Service) ImportIssueCommit(rawDataParams string, file io.ReadCloser) 
errors.Error {
-       err := s.dal.Delete(&crossdomain.IssueCommit{}, 
dal.Where("_raw_data_params = ?", rawDataParams))
+// ImportIssueCommit imports csv file into the table `issue_commits`
+func (s *Service) ImportIssueCommit(boardId string, file io.ReadCloser) 
errors.Error {
+       err := s.dal.Delete(
+               &crossdomain.IssueCommit{},
+               dal.Where("issue_id IN (SELECT issue_id FROM board_issues WHERE 
board_id=? AND issue_id NOT IN (SELECT issue_id FROM board_issues WHERE 
board_id!=?))", boardId, boardId),
+       )
        if err != nil {
                return err
        }
-       return s.importCSV(file, rawDataParams, s.issueCommitHandler)
+       return s.importCSV(file, boardId, s.issueCommitHandler)
 }
 
 // ImportIssueRepoCommit imports data to the table `issue_repo_commits` and 
`issue_commits`
-func (s *Service) ImportIssueRepoCommit(rawDataParams string, file 
io.ReadCloser) errors.Error {
-       fields := make(map[string]struct{})
-       // get all fields of the table `issue_repo_commit`
-       columns, err := s.dal.GetColumns(&crossdomain.IssueCommit{}, 
func(columnMeta dal.ColumnMeta) bool {
-               return true
-       })
-       if err != nil {
-               return err
-       }
-       for _, column := range columns {
-               fields[column.Name()] = struct{}{}
-       }
+func (s *Service) ImportIssueRepoCommit(boardId string, file io.ReadCloser) 
errors.Error {
        // delete old records of the table `issue_repo_commit` and 
`issue_commit`
-       err = s.dal.Delete(&crossdomain.IssueRepoCommit{}, 
dal.Where("_raw_data_params = ?", rawDataParams))
+       err := s.dal.Delete(
+               &crossdomain.IssueRepoCommit{},
+               dal.Where("issue_id IN (SELECT issue_id FROM board_issues WHERE 
board_id=? AND issue_id NOT IN (SELECT issue_id FROM board_issues WHERE 
board_id!=?))", boardId, boardId),
+       )
        if err != nil {
                return err
        }
-       err = s.dal.Delete(&crossdomain.IssueCommit{}, 
dal.Where("_raw_data_params = ?", rawDataParams))
+       err = s.dal.Delete(
+               &crossdomain.IssueCommit{},
+               dal.Where("issue_id IN (SELECT issue_id FROM board_issues WHERE 
board_id=? AND issue_id NOT IN (SELECT issue_id FROM board_issues WHERE 
board_id!=?))", boardId, boardId),
+       )
        if err != nil {
                return err
        }
-       return s.importCSV(file, rawDataParams, 
s.issueRepoCommitHandlerFactory(fields))
+       return s.importCSV(file, boardId, s.issueRepoCommitHandler)
 }
 
-// importCSV imports the csv file to the database,
+// importCSV extract records from csv file, and save them to DB using 
recordHandler
 // the rawDataParams is used to identify the data source,
 // the recordHandler is used to handle the record, it should return an error 
if the record is invalid
 // the `created_at` and `updated_at` will be set to the current time
@@ -238,6 +259,7 @@ func (s *Service) importCSV(file io.ReadCloser, 
rawDataParams string, recordHand
        }
 }
 
+// issueHandlerFactory returns a handler that save record into `issues`, 
`board_issues` and `issue_labels` table
 func (s *Service) issueHandlerFactory(boardId string) func(record 
map[string]interface{}) errors.Error {
        return func(record map[string]interface{}) errors.Error {
                var err errors.Error
@@ -294,25 +316,22 @@ func (s *Service) issueHandlerFactory(boardId string) 
func(record map[string]int
        }
 }
 
+// issueCommitHandler save record into `issue_commits` table
 func (s *Service) issueCommitHandler(record map[string]interface{}) 
errors.Error {
        return s.dal.CreateWithMap(&crossdomain.IssueCommit{}, record)
 }
 
 // issueRepoCommitHandlerFactory returns a handler that will populate the 
`issue_commits` and `issue_repo_commits` table
 // ths issueCommitsFields is used to filter the fields that should be inserted 
into the `issue_commits` table
-func (s *Service) issueRepoCommitHandlerFactory(issueCommitsFields 
map[string]struct{}) func(record map[string]interface{}) errors.Error {
-       return func(record map[string]interface{}) errors.Error {
-               err := s.dal.CreateWithMap(&crossdomain.IssueRepoCommit{}, 
record)
-               if err != nil {
-                       return err
-               }
-               for head := range record {
-                       if _, exists := issueCommitsFields[head]; exists {
-                               continue
-                       } else {
-                               delete(record, head)
-                       }
-               }
-               return s.dal.CreateWithMap(&crossdomain.IssueCommit{}, record)
+func (s *Service) issueRepoCommitHandler(record map[string]interface{}) 
errors.Error {
+       err := s.dal.CreateWithMap(&crossdomain.IssueRepoCommit{}, record)
+       if err != nil {
+               return err
        }
+       // remove fields that not in table `issue_commits`
+       delete(record, "host")
+       delete(record, "namespace")
+       delete(record, "repo_name")
+       delete(record, "repo_url")
+       return s.dal.CreateWithMap(&crossdomain.IssueCommit{}, record)
 }

Reply via email to