in backend/plugins/webhook/api/issues.go [115:221]
func postIssue(input *plugin.ApiResourceInput, err errors.Error, connection *models.WebhookConnection) (*plugin.ApiResourceOutput, errors.Error) {
if err != nil {
return nil, err
}
// get request
request := &WebhookIssueRequest{}
err = helper.DecodeMapStruct(input.Body, request, true)
if err != nil {
return &plugin.ApiResourceOutput{Body: err.Error(), Status: http.StatusBadRequest}, nil
}
// validate
vld = validator.New()
err = errors.Convert(vld.Struct(request))
if err != nil {
return &plugin.ApiResourceOutput{Body: err.Error(), Status: http.StatusBadRequest}, nil
}
txHelper := dbhelper.NewTxHelper(basicRes, &err)
defer txHelper.End()
tx := txHelper.Begin()
domainIssue := &ticket.Issue{
DomainEntity: domainlayer.DomainEntity{
Id: fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, request.IssueKey),
},
Url: request.Url,
IssueKey: request.IssueKey,
Title: request.Title,
Description: request.Description,
EpicKey: request.EpicKey,
Type: request.Type,
Status: request.Status,
OriginalStatus: request.OriginalStatus,
StoryPoint: &request.StoryPoint,
ResolutionDate: request.ResolutionDate,
CreatedDate: request.CreatedDate,
UpdatedDate: request.UpdatedDate,
LeadTimeMinutes: &request.LeadTimeMinutes,
Priority: request.Priority,
OriginalEstimateMinutes: &request.OriginalEstimateMinutes,
TimeSpentMinutes: &request.TimeSpentMinutes,
TimeRemainingMinutes: &request.TimeRemainingMinutes,
CreatorName: request.CreatorName,
AssigneeName: request.AssigneeName,
Severity: request.Severity,
Component: request.Component,
}
if *domainIssue.LeadTimeMinutes == 0 {
if domainIssue.ResolutionDate != nil && domainIssue.CreatedDate != nil {
temp := uint(domainIssue.ResolutionDate.Sub(*domainIssue.CreatedDate).Minutes())
domainIssue.LeadTimeMinutes = &temp
}
}
// FIXME we have no idea about how to calculate domainIssue.TimeRemainingMinutes and domainIssue.TimeSpentMinutes.
if request.CreatorId != "" {
domainIssue.CreatorId = fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, request.CreatorId)
}
if request.AssigneeId != "" {
domainIssue.AssigneeId = fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, request.AssigneeId)
}
if request.ParentIssueKey != "" {
domainIssue.ParentIssueId = fmt.Sprintf("%s:%d:%s", "webhook", connection.ID, request.ParentIssueKey)
}
domainBoardId := fmt.Sprintf("%s:%d", "webhook", connection.ID)
boardIssue := &ticket.BoardIssue{
BoardId: domainBoardId,
IssueId: domainIssue.Id,
}
// check if board exists
count, err := tx.Count(dal.From(&ticket.Board{}), dal.Where("id = ?", domainBoardId))
if err != nil {
return nil, err
}
// only create board with domainBoard non-existent
if count == 0 {
domainBoard := &ticket.Board{
DomainEntity: domainlayer.DomainEntity{
Id: domainBoardId,
},
}
err = tx.Create(domainBoard)
if err != nil {
return nil, err
}
}
// save
err = tx.CreateOrUpdate(domainIssue)
if err != nil {
return nil, err
}
err = tx.CreateOrUpdate(boardIssue)
if err != nil {
return nil, err
}
if domainIssue.IsIncident() {
if err := saveIncidentRelatedRecordsFromIssue(tx, logger, domainBoardId, domainIssue); err != nil {
logger.Error(err, "failed to save incident related records")
return nil, errors.Convert(err)
}
}
return &plugin.ApiResourceOutput{Body: nil, Status: http.StatusOK}, nil
}