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 <[email protected]>
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"
 }

Reply via email to