You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by zh...@apache.org on 2022/11/23 15:27:17 UTC
[incubator-devlake] branch main updated: refactor: add transformation_rule_id to _tool_jira_boards (#3797)
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 363b0c874 refactor: add transformation_rule_id to _tool_jira_boards (#3797)
363b0c874 is described below
commit 363b0c8745a925b8defa5dcf70393a8932b9bcd1
Author: mindlesscloud <li...@merico.dev>
AuthorDate: Wed Nov 23 23:27:12 2022 +0800
refactor: add transformation_rule_id to _tool_jira_boards (#3797)
---
plugins/jira/api/scope.go | 82 ++++++++++++++++------
plugins/jira/api/transformation_rule.go | 33 +++------
plugins/jira/impl/impl.go | 8 +--
plugins/jira/models/board.go | 14 ++--
.../20221116_add_trasformation_rule_table.go | 14 +++-
5 files changed, 95 insertions(+), 56 deletions(-)
diff --git a/plugins/jira/api/scope.go b/plugins/jira/api/scope.go
index a6a575f7c..d6ce8c33c 100644
--- a/plugins/jira/api/scope.go
+++ b/plugins/jira/api/scope.go
@@ -24,17 +24,11 @@ import (
"github.com/apache/incubator-devlake/errors"
"github.com/apache/incubator-devlake/plugins/core"
"github.com/apache/incubator-devlake/plugins/core/dal"
+ "github.com/apache/incubator-devlake/plugins/helper"
"github.com/apache/incubator-devlake/plugins/jira/models"
"github.com/mitchellh/mapstructure"
)
-type putBoardRequest struct {
- ProjectId uint `json:"projectId"`
- Name string `json:"name"`
- Self string `json:"self"`
- Type string `json:"type"`
-}
-
// PutScope create or update jira board
// @Summary create or update jira board
// @Description Create or update Jira board
@@ -42,7 +36,7 @@ type putBoardRequest struct {
// @Accept application/json
// @Param connectionId path int false "connection ID"
// @Param boardId path int false "board ID"
-// @Param scope body putBoardRequest true "json"
+// @Param scope body models.JiraBoard true "json"
// @Success 200 {object} models.JiraBoard
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
@@ -50,22 +44,55 @@ type putBoardRequest struct {
func PutScope(input *core.ApiResourceInput) (*core.ApiResourceOutput, errors.Error) {
connectionId, boardId := extractParam(input.Params)
if connectionId*boardId == 0 {
- return nil, errors.BadInput.New("invalid path params")
+ return nil, errors.BadInput.New("invalid connectionId or boardId")
}
- var req putBoardRequest
- err := mapstructure.Decode(input.Body, &req)
+ var board models.JiraBoard
+ err := errors.Convert(mapstructure.Decode(input.Body, &board))
if err != nil {
- return nil, errors.Default.Wrap(err, "error decoding map into putBoardRequest")
+ return nil, errors.BadInput.Wrap(err, "decoding Jira board error")
}
- board := &models.JiraBoard{
- ConnectionId: connectionId,
- BoardId: boardId,
- ProjectId: req.ProjectId,
- Name: req.Name,
- Self: req.Self,
- Type: req.Type,
+ err = verifyBoard(&board)
+ if err != nil {
+ return nil, err
}
- err = basicRes.GetDal().CreateOrUpdate(&board)
+ err = basicRes.GetDal().CreateOrUpdate(board)
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "error on saving JiraBoard")
+ }
+ return &core.ApiResourceOutput{Body: board, Status: http.StatusOK}, nil
+}
+
+// UpdateScope patch to jira board
+// @Summary patch to jira board
+// @Description patch to jira board
+// @Tags plugins/jira
+// @Accept application/json
+// @Param connectionId path int false "connection ID"
+// @Param boardId path int false "board ID"
+// @Param scope body models.JiraBoard true "json"
+// @Success 200 {object} models.JiraBoard
+// @Failure 400 {object} shared.ApiBody "Bad Request"
+// @Failure 500 {object} shared.ApiBody "Internal Error"
+// @Router /plugins/jira/connections/{connectionId}/scopes/{boardId} [PATCH]
+func UpdateScope(input *core.ApiResourceInput) (*core.ApiResourceOutput, errors.Error) {
+ connectionId, boardId := extractParam(input.Params)
+ if connectionId*boardId == 0 {
+ return nil, errors.BadInput.New("invalid connectionId or boardId")
+ }
+ var board models.JiraBoard
+ err := basicRes.GetDal().First(&board, dal.Where("connection_id = ? AND board_id = ?", connectionId, boardId))
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "getting JiraBoard error")
+ }
+ err = helper.DecodeMapStruct(input.Body, &board)
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "patch jira board error")
+ }
+ err = verifyBoard(&board)
+ if err != nil {
+ return nil, err
+ }
+ err = basicRes.GetDal().Update(board)
if err != nil {
return nil, errors.Default.Wrap(err, "error on saving JiraBoard")
}
@@ -110,7 +137,7 @@ func GetScope(input *core.ApiResourceInput) (*core.ApiResourceOutput, errors.Err
if connectionId*boardId == 0 {
return nil, errors.BadInput.New("invalid path params")
}
- err := basicRes.GetDal().First(&board, dal.Where("connection_id = ? AND board_id = ?", connectionId, board))
+ err := basicRes.GetDal().First(&board, dal.Where("connection_id = ? AND board_id = ?", connectionId, boardId))
if err != nil {
return nil, err
}
@@ -122,3 +149,16 @@ func extractParam(params map[string]string) (uint64, uint64) {
boardId, _ := strconv.ParseUint(params["boardId"], 10, 64)
return connectionId, boardId
}
+
+func verifyBoard(board *models.JiraBoard) errors.Error {
+ if board.ConnectionId == 0 {
+ return errors.BadInput.New("invalid connectionId")
+ }
+ if board.BoardId == 0 {
+ return errors.BadInput.New("invalid boardId")
+ }
+ if board.ScopeId != strconv.FormatUint(board.BoardId, 10) {
+ return errors.BadInput.New("the scope_id does not match the board_id")
+ }
+ return nil
+}
diff --git a/plugins/jira/api/transformation_rule.go b/plugins/jira/api/transformation_rule.go
index b0c04b885..fd3391d65 100644
--- a/plugins/jira/api/transformation_rule.go
+++ b/plugins/jira/api/transformation_rule.go
@@ -21,11 +21,11 @@ import (
"encoding/json"
"net/http"
"strconv"
- "time"
"github.com/apache/incubator-devlake/errors"
"github.com/apache/incubator-devlake/plugins/core"
"github.com/apache/incubator-devlake/plugins/core/dal"
+ "github.com/apache/incubator-devlake/plugins/helper"
"github.com/apache/incubator-devlake/plugins/jira/models"
"github.com/apache/incubator-devlake/plugins/jira/tasks"
"github.com/mitchellh/mapstructure"
@@ -37,7 +37,7 @@ import (
// @Tags plugins/jira
// @Accept application/json
// @Param transformationRule body tasks.TransformationRules true "transformation rule"
-// @Success 200 {object} models.JiraTransformationRule
+// @Success 200 {object} tasks.TransformationRules
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
// @Router /plugins/jira/transformation_rules [POST]
@@ -60,7 +60,7 @@ func CreateTransformationRule(input *core.ApiResourceInput) (*core.ApiResourceOu
// @Accept application/json
// @Param id path int true "id"
// @Param transformationRule body tasks.TransformationRules true "transformation rule"
-// @Success 200 {object} models.JiraTransformationRule
+// @Success 200 {object} tasks.TransformationRules
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
// @Router /plugins/jira/transformation_rules/{id} [PATCH]
@@ -74,34 +74,23 @@ func UpdateTransformationRule(input *core.ApiResourceInput) (*core.ApiResourceOu
if err != nil {
return nil, errors.Default.Wrap(err, "error on saving TransformationRule")
}
- rule := new(tasks.TransformationRules)
- _, err = rule.FromDb(&old)
+ err = helper.DecodeMapStruct(input.Body, &old)
if err != nil {
- return nil, errors.Default.Wrap(err, "the transformation rule ID should be an integer")
- }
- err = mapstructure.Decode(input.Body, &rule)
- if err != nil {
- return nil, errors.Default.Wrap(err, "error decoding map into putBoardRequest")
- }
- dbRule, err := makeDbTransformationRule(rule)
- dbRule.Model = old.Model
- dbRule.UpdatedAt = time.Now()
- if err != nil {
- return nil, errors.Default.Wrap(err, "error in makeJiraTransformationRule")
+ return nil, errors.Default.Wrap(err, "error decoding map into transformationRule")
}
-
- err = basicRes.GetDal().Update(&dbRule, dal.Where("id = ?", transformationRuleId))
+ old.ID = transformationRuleId
+ err = basicRes.GetDal().Update(&old, dal.Where("id = ?", transformationRuleId))
if err != nil {
return nil, errors.Default.Wrap(err, "error on saving TransformationRule")
}
- return &core.ApiResourceOutput{Body: rule, Status: http.StatusOK}, nil
+ return &core.ApiResourceOutput{Body: old, Status: http.StatusOK}, nil
}
func makeDbTransformationRuleFromInput(input *core.ApiResourceInput) (*models.JiraTransformationRule, errors.Error) {
var req tasks.TransformationRules
err := mapstructure.Decode(input.Body, &req)
if err != nil {
- return nil, errors.Default.Wrap(err, "error decoding map into putBoardRequest")
+ return nil, errors.Default.Wrap(err, "error decoding map into transformationRule")
}
return makeDbTransformationRule(&req)
}
@@ -123,7 +112,7 @@ func makeDbTransformationRule(rule *tasks.TransformationRules) (*models.JiraTran
// @Description return one transformation rule
// @Tags plugins/jira
// @Param id path int true "id"
-// @Success 200 {object} models.JiraTransformationRule
+// @Success 200 {object} tasks.TransformationRules
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
// @Router /plugins/jira/transformation_rules/{id} [GET]
@@ -144,7 +133,7 @@ func GetTransformationRule(input *core.ApiResourceInput) (*core.ApiResourceOutpu
// @Summary return all transformation rules
// @Description return all transformation rules
// @Tags plugins/jira
-// @Success 200 {object} []models.JiraTransformationRule
+// @Success 200 {object} []tasks.TransformationRules
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
// @Router /plugins/jira/transformation_rules [GET]
diff --git a/plugins/jira/impl/impl.go b/plugins/jira/impl/impl.go
index 5b2b957ef..8c01cb351 100644
--- a/plugins/jira/impl/impl.go
+++ b/plugins/jira/impl/impl.go
@@ -101,9 +101,6 @@ func (plugin Jira) SubTaskMetas() []core.SubTaskMeta {
tasks.CollectProjectsMeta,
tasks.ExtractProjectsMeta,
- tasks.CollectBoardMeta,
- tasks.ExtractBoardMeta,
-
tasks.CollectIssueTypesMeta,
tasks.ExtractIssueTypesMeta,
@@ -250,8 +247,9 @@ func (plugin Jira) ApiResources() map[string]map[string]core.ApiResourceHandler
"GET": api.Proxy,
},
"connections/:connectionId/scopes/:boardId": {
- "GET": api.GetScope,
- "PUT": api.PutScope,
+ "GET": api.GetScope,
+ "PUT": api.PutScope,
+ "PATCH": api.UpdateScope,
},
"connections/:connectionId/scopes": {
"GET": api.GetScopeList,
diff --git a/plugins/jira/models/board.go b/plugins/jira/models/board.go
index fe72296dd..a091ebca0 100644
--- a/plugins/jira/models/board.go
+++ b/plugins/jira/models/board.go
@@ -23,12 +23,14 @@ import (
type JiraBoard struct {
common.NoPKModel
- ConnectionId uint64 `gorm:"primaryKey"`
- BoardId uint64 `gorm:"primaryKey"`
- ProjectId uint
- Name string `gorm:"type:varchar(255)"`
- Self string `gorm:"type:varchar(255)"`
- Type string `gorm:"type:varchar(100)"`
+ ConnectionId uint64 `gorm:"primaryKey"`
+ BoardId uint64 `gorm:"primaryKey"`
+ ScopeId string
+ TransformationRuleId uint64
+ ProjectId uint
+ Name string `gorm:"type:varchar(255)"`
+ Self string `gorm:"type:varchar(255)"`
+ Type string `gorm:"type:varchar(100)"`
}
func (JiraBoard) TableName() string {
diff --git a/plugins/jira/models/migrationscripts/20221116_add_trasformation_rule_table.go b/plugins/jira/models/migrationscripts/20221116_add_trasformation_rule_table.go
index 8f1079e51..e5d2f863c 100644
--- a/plugins/jira/models/migrationscripts/20221116_add_trasformation_rule_table.go
+++ b/plugins/jira/models/migrationscripts/20221116_add_trasformation_rule_table.go
@@ -19,14 +19,24 @@ package migrationscripts
import (
"github.com/apache/incubator-devlake/errors"
+ "github.com/apache/incubator-devlake/helpers/migrationhelper"
"github.com/apache/incubator-devlake/plugins/core"
"github.com/apache/incubator-devlake/plugins/jira/models/migrationscripts/archived"
)
+type jiraBoard20221116 struct {
+ TransformationRuleId uint64
+ ScopeId string `gorm:"type:varchar(255)"`
+}
+
+func (jiraBoard20221116) TableName() string {
+ return "_tool_jira_boards"
+}
+
type addTransformationRule20221116 struct{}
func (script *addTransformationRule20221116) Up(basicRes core.BasicRes) errors.Error {
- return basicRes.GetDal().AutoMigrate(&archived.JiraTransformationRule{})
+ return migrationhelper.AutoMigrateTables(basicRes, &jiraBoard20221116{}, &archived.JiraTransformationRule{})
}
func (*addTransformationRule20221116) Version() uint64 {
@@ -34,5 +44,5 @@ func (*addTransformationRule20221116) Version() uint64 {
}
func (*addTransformationRule20221116) Name() string {
- return "add table _tool_jira_transformation_rules"
+ return "add table _tool_jira_transformation_rules, add transformation_rule_id to _tool_jira_boards"
}