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"
 }