You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2022/07/28 15:02:14 UTC

[incubator-devlake] branch main updated: feat: project_mapping for org plugin (#2616)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 66c0f9d3 feat: project_mapping for org plugin (#2616)
66c0f9d3 is described below

commit 66c0f9d3e1e8c5e99ddf78b048d9c2ee1da76359
Author: mindlesscloud <li...@merico.dev>
AuthorDate: Thu Jul 28 23:02:09 2022 +0800

    feat: project_mapping for org plugin (#2616)
    
    * feat: project_mapping for org plugin
    
    * fix: improve doc
---
 .../crossdomain/project_mapping.go}                | 26 +++++------
 ...er.go => 20220725_add_project_mapping_table.go} | 37 +++++++++------
 .../{register.go => archived/project_mapping.go}   | 24 ++++------
 models/migrationscripts/register.go                |  1 +
 plugins/org/api/{team.go => project_mapping.go}    | 42 ++++++++---------
 plugins/org/api/store.go                           | 11 +++++
 plugins/org/api/team.go                            |  4 +-
 plugins/org/api/types.go                           | 52 ++++++++++++++++++++++
 plugins/org/api/user.go                            |  4 +-
 plugins/org/api/user_account_mapping.go            |  4 +-
 plugins/org/impl/impl.go                           |  4 ++
 11 files changed, 135 insertions(+), 74 deletions(-)

diff --git a/models/migrationscripts/register.go b/models/domainlayer/crossdomain/project_mapping.go
similarity index 64%
copy from models/migrationscripts/register.go
copy to models/domainlayer/crossdomain/project_mapping.go
index 332a8d01..e1b0c9b5 100644
--- a/models/migrationscripts/register.go
+++ b/models/domainlayer/crossdomain/project_mapping.go
@@ -15,21 +15,17 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package migrationscripts
+package crossdomain
 
-import "github.com/apache/incubator-devlake/migration"
+import "github.com/apache/incubator-devlake/models/common"
 
-// All return all the migration scripts of framework
-func All() []migration.Script {
-	return []migration.Script{
-		new(addFrameTables),
-		new(renameStepToStage),
-		new(addSubtasksField),
-		new(updateBlueprintMode),
-		new(renameTasksToPlan),
-		new(addDomainTables),
-		new(addTypeField),
-		new(commitfileComponent),
-		new(removeNotes),
-	}
+type ProjectMapping struct {
+	ProjectName string `gorm:"primaryKey;type:varchar(255)"`
+	Table       string `gorm:"primaryKey;type:varchar(255)"`
+	RowId       string `gorm:"primaryKey;type:varchar(255)"`
+	common.NoPKModel
+}
+
+func (ProjectMapping) TableName() string {
+	return "project_mapping"
 }
diff --git a/models/migrationscripts/register.go b/models/migrationscripts/20220725_add_project_mapping_table.go
similarity index 61%
copy from models/migrationscripts/register.go
copy to models/migrationscripts/20220725_add_project_mapping_table.go
index 332a8d01..52c2a8db 100644
--- a/models/migrationscripts/register.go
+++ b/models/migrationscripts/20220725_add_project_mapping_table.go
@@ -17,19 +17,28 @@ limitations under the License.
 
 package migrationscripts
 
-import "github.com/apache/incubator-devlake/migration"
-
-// All return all the migration scripts of framework
-func All() []migration.Script {
-	return []migration.Script{
-		new(addFrameTables),
-		new(renameStepToStage),
-		new(addSubtasksField),
-		new(updateBlueprintMode),
-		new(renameTasksToPlan),
-		new(addDomainTables),
-		new(addTypeField),
-		new(commitfileComponent),
-		new(removeNotes),
+import (
+	"context"
+	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
+	"gorm.io/gorm"
+)
+
+type addProjectMapping struct{}
+
+func (*addProjectMapping) Up(ctx context.Context, db *gorm.DB) error {
+
+	err := db.Migrator().AutoMigrate(&archived.ProjectMapping{})
+	if err != nil {
+		return err
 	}
+
+	return nil
+}
+
+func (*addProjectMapping) Version() uint64 {
+	return 20220725152355
+}
+
+func (*addProjectMapping) Name() string {
+	return "add project_mapping table to domain layer"
 }
diff --git a/models/migrationscripts/register.go b/models/migrationscripts/archived/project_mapping.go
similarity index 64%
copy from models/migrationscripts/register.go
copy to models/migrationscripts/archived/project_mapping.go
index 332a8d01..4b1973c3 100644
--- a/models/migrationscripts/register.go
+++ b/models/migrationscripts/archived/project_mapping.go
@@ -15,21 +15,15 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package migrationscripts
+package archived
 
-import "github.com/apache/incubator-devlake/migration"
+type ProjectMapping struct {
+	ProjectName string `gorm:"primaryKey;type:varchar(255)"`
+	Table       string `gorm:"primaryKey;type:varchar(255)"`
+	RowId       string `gorm:"primaryKey;type:varchar(255)"`
+	NoPKModel
+}
 
-// All return all the migration scripts of framework
-func All() []migration.Script {
-	return []migration.Script{
-		new(addFrameTables),
-		new(renameStepToStage),
-		new(addSubtasksField),
-		new(updateBlueprintMode),
-		new(renameTasksToPlan),
-		new(addDomainTables),
-		new(addTypeField),
-		new(commitfileComponent),
-		new(removeNotes),
-	}
+func (ProjectMapping) TableName() string {
+	return "project_mapping"
 }
diff --git a/models/migrationscripts/register.go b/models/migrationscripts/register.go
index 332a8d01..1ddc29de 100644
--- a/models/migrationscripts/register.go
+++ b/models/migrationscripts/register.go
@@ -31,5 +31,6 @@ func All() []migration.Script {
 		new(addTypeField),
 		new(commitfileComponent),
 		new(removeNotes),
+		new(addProjectMapping),
 	}
 }
diff --git a/plugins/org/api/team.go b/plugins/org/api/project_mapping.go
similarity index 67%
copy from plugins/org/api/team.go
copy to plugins/org/api/project_mapping.go
index 17a055d4..1608742d 100644
--- a/plugins/org/api/team.go
+++ b/plugins/org/api/project_mapping.go
@@ -21,34 +21,32 @@ import (
 	"github.com/apache/incubator-devlake/plugins/core"
 	"net/http"
 
-	"github.com/apache/incubator-devlake/models/domainlayer/crossdomain"
 	"github.com/gocarina/gocsv"
 )
 
-// GetTeam godoc
-// @Summary      Get teams.csv file
-// @Description  get teams.csv file
+// GetProjectMapping returns all project mapping in csv format
+// @Summary      Get project_mapping.csv file
+// @Description  get project_mapping.csv file
 // @Tags 		 plugins/org
 // @Produce      text/csv
 // @Param        fake_data    query     bool  false  "return fake data or not"
 // @Success      200
 // @Failure 400  {object} shared.ApiBody "Bad Request"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
-// @Router       /plugins/org/teams.csv [get]
-func (h *Handlers) GetTeam(input *core.ApiResourceInput) (*core.ApiResourceOutput, error) {
+// @Router       /plugins/org/project_mapping.csv [get]
+func (h *Handlers) GetProjectMapping(input *core.ApiResourceInput) (*core.ApiResourceOutput, error) {
 	input.Query.Get("fake_data")
-	var teams []team
-	var t *team
+	var mapping []projectMapping
 	var err error
 	if input.Query.Get("fake_data") == "true" {
-		teams = t.fakeData()
+		mapping = fakeProjectMapping
 	} else {
-		teams, err = h.store.findAllTeams()
+		mapping, err = h.store.findAllProjectMapping()
 		if err != nil {
 			return nil, err
 		}
 	}
-	blob, err := gocsv.MarshalBytes(teams)
+	blob, err := gocsv.MarshalBytes(mapping)
 	if err != nil {
 		return nil, err
 	}
@@ -62,9 +60,9 @@ func (h *Handlers) GetTeam(input *core.ApiResourceInput) (*core.ApiResourceOutpu
 	}, nil
 }
 
-// CreateTeam godoc
-// @Summary      Upload teams.csv file
-// @Description  upload teams.csv file
+// CreateProjectMapping accepts a CSV file containing project mapping and saves it to the database
+// @Summary      Upload project_mapping.csv file
+// @Description  upload project_mapping.csv file
 // @Tags 		 plugins/org
 // @Accept       multipart/form-data
 // @Param        file formData file true "select file to upload"
@@ -72,22 +70,18 @@ func (h *Handlers) GetTeam(input *core.ApiResourceInput) (*core.ApiResourceOutpu
 // @Success      200
 // @Failure 400  {object} shared.ApiBody "Bad Request"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
-// @Router       /plugins/org/teams.csv [put]
-func (h *Handlers) CreateTeam(input *core.ApiResourceInput) (*core.ApiResourceOutput, error) {
-	var tt []team
-	err := h.unmarshal(input.Request, &tt)
+// @Router       /plugins/org/project_mapping.csv [put]
+func (h *Handlers) CreateProjectMapping(input *core.ApiResourceInput) (*core.ApiResourceOutput, error) {
+	var mapping []projectMapping
+	err := h.unmarshal(input.Request, &mapping)
 	if err != nil {
 		return nil, err
 	}
-	var t *team
+	var pm *projectMapping
 	var items []interface{}
-	for _, tm := range t.toDomainLayer(tt) {
+	for _, tm := range pm.toDomainLayer(mapping) {
 		items = append(items, tm)
 	}
-	err = h.store.deleteAll(&crossdomain.Team{})
-	if err != nil {
-		return nil, err
-	}
 	err = h.store.save(items)
 	if err != nil {
 		return nil, err
diff --git a/plugins/org/api/store.go b/plugins/org/api/store.go
index 903b45b9..2f56ff57 100644
--- a/plugins/org/api/store.go
+++ b/plugins/org/api/store.go
@@ -31,6 +31,7 @@ type store interface {
 	findAllTeams() ([]team, error)
 	findAllAccounts() ([]account, error)
 	findAllUserAccounts() ([]userAccount, error)
+	findAllProjectMapping() ([]projectMapping, error)
 	deleteAll(i interface{}) error
 	save(items []interface{}) error
 }
@@ -93,6 +94,16 @@ func (d *dbStore) findAllUserAccounts() ([]userAccount, error) {
 	var au *userAccount
 	return au.fromDomainLayer(uas), nil
 }
+
+func (d *dbStore) findAllProjectMapping() ([]projectMapping, error) {
+	var mapping []crossdomain.ProjectMapping
+	err := d.db.All(&mapping)
+	if err != nil {
+		return nil, err
+	}
+	var pm *projectMapping
+	return pm.fromDomainLayer(mapping), nil
+}
 func (d *dbStore) deleteAll(i interface{}) error {
 	return d.db.Delete(i, dal.Where("1=1"))
 }
diff --git a/plugins/org/api/team.go b/plugins/org/api/team.go
index 17a055d4..3896170f 100644
--- a/plugins/org/api/team.go
+++ b/plugins/org/api/team.go
@@ -25,7 +25,7 @@ import (
 	"github.com/gocarina/gocsv"
 )
 
-// GetTeam godoc
+// GetTeam returns all team in csv format
 // @Summary      Get teams.csv file
 // @Description  get teams.csv file
 // @Tags 		 plugins/org
@@ -62,7 +62,7 @@ func (h *Handlers) GetTeam(input *core.ApiResourceInput) (*core.ApiResourceOutpu
 	}, nil
 }
 
-// CreateTeam godoc
+// CreateTeam accepts a CSV file containing team information and saves it to the database
 // @Summary      Upload teams.csv file
 // @Description  upload teams.csv file
 // @Tags 		 plugins/org
diff --git a/plugins/org/api/types.go b/plugins/org/api/types.go
index 98d7be9a..d0559001 100644
--- a/plugins/org/api/types.go
+++ b/plugins/org/api/types.go
@@ -57,6 +57,24 @@ var fakeTeams = []team{{
 	SortingIndex: 2,
 }}
 
+var fakeProjectMapping = []projectMapping{
+	{
+		ProjectName: "Apache DevLake",
+		Table:       "repos",
+		RowId:       "github:GithubRepo:1:1",
+	},
+	{
+		ProjectName: "Apache DevLake",
+		Table:       "repos",
+		RowId:       "github:GithubRepo:1:2",
+	},
+	{
+		ProjectName: "Apache DevLake",
+		Table:       "jobs",
+		RowId:       "jenkins:JenkinsJob:1:3",
+	},
+}
+
 type user struct {
 	Id      string
 	Name    string
@@ -223,3 +241,37 @@ func (*team) toDomainLayer(tt []team) []*crossdomain.Team {
 func (*team) fakeData() []team {
 	return fakeTeams
 }
+
+type projectMapping struct {
+	ProjectName string
+	Table       string
+	RowId       string
+}
+
+func (*projectMapping) fromDomainLayer(tt []crossdomain.ProjectMapping) []projectMapping {
+	var result []projectMapping
+	for _, t := range tt {
+		result = append(result, projectMapping{
+			ProjectName: t.ProjectName,
+			Table:       t.Table,
+			RowId:       t.RowId,
+		})
+	}
+	return result
+}
+
+func (*projectMapping) toDomainLayer(tt []projectMapping) []*crossdomain.ProjectMapping {
+	var result []*crossdomain.ProjectMapping
+	for _, t := range tt {
+		result = append(result, &crossdomain.ProjectMapping{
+			ProjectName: t.ProjectName,
+			Table:       t.Table,
+			RowId:       t.RowId,
+		})
+	}
+	return result
+}
+
+func (m *projectMapping) fakeData() []projectMapping {
+	return fakeProjectMapping
+}
diff --git a/plugins/org/api/user.go b/plugins/org/api/user.go
index bc14e1ae..6f9d49f5 100644
--- a/plugins/org/api/user.go
+++ b/plugins/org/api/user.go
@@ -25,7 +25,7 @@ import (
 	"github.com/gocarina/gocsv"
 )
 
-// GetUser godoc
+// GetUser returns all user in csv format
 // @Summary      Get users.csv file
 // @Description  get users.csv file
 // @Tags 		 plugins/org
@@ -61,7 +61,7 @@ func (h *Handlers) GetUser(input *core.ApiResourceInput) (*core.ApiResourceOutpu
 	}, nil
 }
 
-// CreateUser godoc
+// CreateUser accepts a CSV file containing user information mapping and saves it to the database
 // @Summary      Upload users.csv file
 // @Description  upload users.csv file
 // @Tags 		 plugins/org
diff --git a/plugins/org/api/user_account_mapping.go b/plugins/org/api/user_account_mapping.go
index 077e3144..12a2d689 100644
--- a/plugins/org/api/user_account_mapping.go
+++ b/plugins/org/api/user_account_mapping.go
@@ -25,7 +25,7 @@ import (
 	"github.com/gocarina/gocsv"
 )
 
-// GetUserAccountMapping godoc
+// GetUserAccountMapping returns all user/account mapping in csv format
 // @Summary      Get user_account_mapping.csv.csv file
 // @Description  get user_account_mapping.csv.csv file
 // @Tags 		 plugins/org
@@ -53,7 +53,7 @@ func (h *Handlers) GetUserAccountMapping(input *core.ApiResourceInput) (*core.Ap
 	}, nil
 }
 
-// CreateUserAccountMapping godoc
+// CreateUserAccountMapping accepts a CSV file containing user/account mapping and saves it to the database
 // @Summary      Upload user_account_mapping.csv.csv file
 // @Description  upload user_account_mapping.csv.csv file
 // @Tags 		 plugins/org
diff --git a/plugins/org/impl/impl.go b/plugins/org/impl/impl.go
index 4faec005..f99ce1af 100644
--- a/plugins/org/impl/impl.go
+++ b/plugins/org/impl/impl.go
@@ -83,5 +83,9 @@ func (plugin Org) ApiResources() map[string]map[string]core.ApiResourceHandler {
 			"GET": plugin.handlers.GetUserAccountMapping,
 			"PUT": plugin.handlers.CreateUserAccountMapping,
 		},
+		"project_mapping.csv": {
+			"GET": plugin.handlers.GetProjectMapping,
+			"PUT": plugin.handlers.CreateProjectMapping,
+		},
 	}
 }