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,
+ },
}
}