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

likyh 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 345b0cbe fix: fix webhook (#3217)
345b0cbe is described below

commit 345b0cbecfe44357290986dcd6e423da74cfb8a1
Author: mappjzc <[email protected]>
AuthorDate: Wed Sep 28 09:53:08 2022 +0800

    fix: fix webhook (#3217)
    
    changed issueId to be issueKey
    finshed cicd_task in PostPipelineFinish
    create domainBoard only if non-existent
    
    Nddtfjiang <[email protected]>
---
 plugins/webhook/api/cicd_pipeline.go | 47 ++++++++++++++++++++++++++++++++----
 plugins/webhook/api/connection.go    |  5 ++--
 plugins/webhook/api/issue.go         | 42 ++++++++++++++++++++++----------
 plugins/webhook/impl/impl.go         |  2 +-
 4 files changed, 75 insertions(+), 21 deletions(-)

diff --git a/plugins/webhook/api/cicd_pipeline.go 
b/plugins/webhook/api/cicd_pipeline.go
index 064ca983..aa383938 100644
--- a/plugins/webhook/api/cicd_pipeline.go
+++ b/plugins/webhook/api/cicd_pipeline.go
@@ -19,6 +19,10 @@ package api
 
 import (
        "fmt"
+       "net/http"
+       "reflect"
+       "time"
+
        "github.com/apache/incubator-devlake/errors"
        "github.com/apache/incubator-devlake/models/domainlayer"
        "github.com/apache/incubator-devlake/models/domainlayer/devops"
@@ -28,8 +32,6 @@ import (
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/webhook/models"
        "github.com/go-playground/validator/v10"
-       "net/http"
-       "time"
 )
 
 type WebhookTaskRequest struct {
@@ -161,14 +163,50 @@ func PostPipelineFinish(input *core.ApiResourceInput) 
(*core.ApiResourceOutput,
 
        db := basicRes.GetDal()
        pipelineId := fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, 
input.Params[`pipelineName`])
-       println(pipelineId)
+
+       now := time.Now()
+
+       // finished all CICDTask
+       cursor, err := db.Cursor(
+               dal.From(&devops.CICDTask{}),
+               dal.Where("pipeline_id = ?", pipelineId),
+       )
+       if err != nil {
+               return nil, errors.Default.Wrap(err, "error on select CICDTask")
+       }
+       batch, err := helper.NewBatchSave(basicRes, 
reflect.TypeOf(&devops.CICDTask{}), 500)
+       if err != nil {
+               return nil, errors.Default.Wrap(err, "error getting batch from 
CICDTask")
+       }
+       defer batch.Close()
+
+       domainTasks := []devops.CICDTask{}
+       for cursor.Next() {
+               task := &devops.CICDTask{}
+               err = errors.Convert(cursor.Scan(task))
+               if err != nil {
+                       return nil, errors.Default.Wrap(err, "error on Convert 
CICDTask data")
+               }
+               // set the IN_PROGRESS task to be ABORT
+               if task.Result == `IN_PROGRESS` {
+                       task.Result = `ABORT`
+                       task.FinishedDate = &now
+               }
+               task.Status = ticket.DONE
+               domainTasks = append(domainTasks, *task)
+               err = batch.Add(task)
+               if err != nil {
+                       return nil, errors.Default.Wrap(err, fmt.Sprintf("error 
on CICDTask batch add %v", task))
+               }
+       }
+
+       // finished CICDPipeline
        domainPipeline := &devops.CICDPipeline{}
        err = db.First(domainPipeline, dal.Where("id = ?", pipelineId))
        if err != nil {
                return nil, errors.NotFound.Wrap(err, `pipeline not found`)
        }
 
-       domainTasks := []devops.CICDTask{}
        err = db.All(&domainTasks, dal.Where("pipeline_id = ?", pipelineId))
        if err != nil {
                return nil, errors.NotFound.Wrap(err, `tasks not found`)
@@ -177,7 +215,6 @@ func PostPipelineFinish(input *core.ApiResourceInput) 
(*core.ApiResourceOutput,
        domainPipeline.Type = pipelineType
        domainPipeline.Result = result
        domainPipeline.Status = ticket.DONE
-       now := time.Now()
        domainPipeline.FinishedDate = &now
        domainPipeline.DurationSec = 
uint64(domainPipeline.FinishedDate.Sub(domainPipeline.CreatedDate).Seconds())
 
diff --git a/plugins/webhook/api/connection.go 
b/plugins/webhook/api/connection.go
index a7bdd7a0..652085ce 100644
--- a/plugins/webhook/api/connection.go
+++ b/plugins/webhook/api/connection.go
@@ -19,10 +19,11 @@ package api
 
 import (
        "fmt"
+       "net/http"
+
        "github.com/apache/incubator-devlake/errors"
        "github.com/apache/incubator-devlake/plugins/core"
        "github.com/apache/incubator-devlake/plugins/webhook/models"
-       "net/http"
 )
 
 // PostConnections
@@ -127,7 +128,7 @@ func GetConnection(input *core.ApiResourceInput) 
(*core.ApiResourceOutput, error
 func formatConnection(connection *models.WebhookConnection) 
*WebhookConnectionResponse {
        response := &WebhookConnectionResponse{WebhookConnection: *connection}
        response.PostIssuesEndpoint = fmt.Sprintf(`/plugins/webhook/%d/issues`, 
connection.ID)
-       response.CloseIssuesEndpoint = 
fmt.Sprintf(`/plugins/webhook/%d/issue/:boardKey/:issueId/close`, connection.ID)
+       response.CloseIssuesEndpoint = 
fmt.Sprintf(`/plugins/webhook/%d/issue/:boardKey/:issueKey/close`, 
connection.ID)
        response.PostPipelineTaskEndpoint = 
fmt.Sprintf(`/plugins/webhook/%d/cicd_tasks`, connection.ID)
        response.ClosePipelineEndpoint = 
fmt.Sprintf(`/plugins/webhook/%d/cicd_pipeline/:pipelineName/finish`, 
connection.ID)
        return response
diff --git a/plugins/webhook/api/issue.go b/plugins/webhook/api/issue.go
index 06a3fc4b..b93dae23 100644
--- a/plugins/webhook/api/issue.go
+++ b/plugins/webhook/api/issue.go
@@ -19,6 +19,9 @@ package api
 
 import (
        "fmt"
+       "net/http"
+       "time"
+
        "github.com/apache/incubator-devlake/errors"
        "github.com/apache/incubator-devlake/models/domainlayer"
        "github.com/apache/incubator-devlake/models/domainlayer/ticket"
@@ -27,8 +30,6 @@ import (
        "github.com/apache/incubator-devlake/plugins/helper"
        "github.com/apache/incubator-devlake/plugins/webhook/models"
        "github.com/go-playground/validator/v10"
-       "net/http"
-       "time"
 )
 
 type WebhookIssueRequest struct {
@@ -125,24 +126,39 @@ func PostIssue(input *core.ApiResourceInput) 
(*core.ApiResourceOutput, errors.Er
        if request.ParentIssueKey != "" {
                domainIssue.ParentIssueId = fmt.Sprintf("%s:%d:%s:%s", 
"webhook", connection.ID, request.BoardKey, request.ParentIssueKey)
        }
-       domainBoard := &ticket.Board{
-               DomainEntity: domainlayer.DomainEntity{
-                       Id: fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, 
request.BoardKey),
-               },
-       }
+
+       domainBoardId := fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, 
request.BoardKey)
+
        boardIssue := &ticket.BoardIssue{
-               BoardId: domainBoard.Id,
+               BoardId: domainBoardId,
                IssueId: domainIssue.Id,
        }
-       // save
-       err = db.CreateOrUpdate(domainIssue)
+
+       // check if board exists
+       count, err := db.Count(dal.From(&ticket.Board{}), dal.Where("id = ?", 
domainBoardId))
        if err != nil {
                return nil, err
        }
-       err = db.CreateOrUpdate(domainBoard)
+
+       // only create board with domainBoard non-existent
+       if count == 0 {
+               domainBoard := &ticket.Board{
+                       DomainEntity: domainlayer.DomainEntity{
+                               Id: domainBoardId,
+                       },
+               }
+               err = db.Create(domainBoard)
+               if err != nil {
+                       return nil, err
+               }
+       }
+
+       // save
+       err = db.CreateOrUpdate(domainIssue)
        if err != nil {
                return nil, err
        }
+
        err = db.CreateOrUpdate(boardIssue)
        if err != nil {
                return nil, err
@@ -158,7 +174,7 @@ func PostIssue(input *core.ApiResourceInput) 
(*core.ApiResourceOutput, errors.Er
 // @Success 200  {string} noResponse ""
 // @Failure 400  {string} errcode.Error "Bad Request"
 // @Failure 500  {string} errcode.Error "Internal Error"
-// @Router /plugins/webhook/:connectionId/issue/:boardKey/:issueId/close [POST]
+// @Router /plugins/webhook/:connectionId/issue/:boardKey/:issueKey/close 
[POST]
 func CloseIssue(input *core.ApiResourceInput) (*core.ApiResourceOutput, 
errors.Error) {
        connection := &models.WebhookConnection{}
        err := connectionHelper.First(connection, input.Params)
@@ -168,7 +184,7 @@ func CloseIssue(input *core.ApiResourceInput) 
(*core.ApiResourceOutput, errors.E
 
        db := basicRes.GetDal()
        domainIssue := &ticket.Issue{}
-       err = db.First(domainIssue, dal.Where("id = ?", 
fmt.Sprintf("%s:%d:%s:%s", "webhook", connection.ID, input.Params[`boardKey`], 
input.Params[`issueId`])))
+       err = db.First(domainIssue, dal.Where("id = ?", 
fmt.Sprintf("%s:%d:%s:%s", "webhook", connection.ID, input.Params[`boardKey`], 
input.Params[`issueKey`])))
        if err != nil {
                return nil, errors.NotFound.Wrap(err, `issue not found`)
        }
diff --git a/plugins/webhook/impl/impl.go b/plugins/webhook/impl/impl.go
index b8001434..a939f560 100644
--- a/plugins/webhook/impl/impl.go
+++ b/plugins/webhook/impl/impl.go
@@ -72,7 +72,7 @@ func (plugin Webhook) ApiResources() 
map[string]map[string]core.ApiResourceHandl
                ":connectionId/issues": {
                        "POST": api.PostIssue,
                },
-               ":connectionId/issue/:boardKey/:issueId/close": {
+               ":connectionId/issue/:boardKey/:issueKey/close": {
                        "POST": api.CloseIssue,
                },
        }

Reply via email to