blob: 6f512227c0cc12141c7d58213469b4bc5c6e9dcb [file] [log] [blame]
package tasks
import (
lakeModels "github.com/merico-dev/lake/models"
"github.com/merico-dev/lake/models/domainlayer"
"github.com/merico-dev/lake/models/domainlayer/didgen"
"github.com/merico-dev/lake/models/domainlayer/ticket"
jiraModels "github.com/merico-dev/lake/plugins/jira/models"
"gorm.io/gorm/clause"
)
func ConvertIssues(sourceId uint64, boardId uint64) error {
jiraIssue := &jiraModels.JiraIssue{}
// select all issues belongs to the board
cursor, err := lakeModels.Db.Model(jiraIssue).
Select("jira_issues.*").
Joins("left join jira_board_issues on jira_board_issues.issue_id = jira_issues.issue_id").
Where("jira_board_issues.source_id = ? AND jira_board_issues.board_id = ?", sourceId, boardId).
Rows()
if err != nil {
return err
}
defer cursor.Close()
issueIdGen := didgen.NewDomainIdGenerator(&jiraModels.JiraIssue{})
userIdGen := didgen.NewDomainIdGenerator(&jiraModels.JiraUser{})
boardIssue := &ticket.BoardIssue{
BoardId: didgen.NewDomainIdGenerator(&jiraModels.JiraBoard{}).Generate(sourceId, boardId),
}
// clearn up board issue relationship altogether
err = lakeModels.Db.Exec("DELETE from board_issues where board_id = ?", boardIssue.BoardId).Error
if err != nil {
return err
}
// iterate all rows
for cursor.Next() {
err = lakeModels.Db.ScanRows(cursor, jiraIssue)
if err != nil {
return err
}
issue := &ticket.Issue{
DomainEntity: domainlayer.DomainEntity{
Id: issueIdGen.Generate(jiraIssue.SourceId, jiraIssue.IssueId),
},
Url: jiraIssue.Self,
Key: jiraIssue.Key,
Summary: jiraIssue.Summary,
EpicKey: jiraIssue.EpicKey,
Type: jiraIssue.StdType,
Status: jiraIssue.StdStatus,
StoryPoint: jiraIssue.StdStoryPoint,
OriginalEstimateMinutes: jiraIssue.OriginalEstimateMinutes,
CreatorId: userIdGen.Generate(sourceId, jiraIssue.CreatorAccountId),
ResolutionDate: jiraIssue.ResolutionDate,
Priority: jiraIssue.PriorityName,
CreatedDate: &jiraIssue.Created,
UpdatedDate: &jiraIssue.Updated,
LeadTimeMinutes: jiraIssue.LeadTimeMinutes,
TimeSpentMinutes: jiraIssue.SpentMinutes,
}
if jiraIssue.AssigneeAccountId != "" {
issue.AssigneeId = userIdGen.Generate(sourceId, jiraIssue.AssigneeAccountId)
}
if jiraIssue.ParentId != 0 {
issue.ParentIssueId = issueIdGen.Generate(sourceId, jiraIssue.ParentId)
}
err = lakeModels.Db.Clauses(clause.OnConflict{UpdateAll: true}).Create(issue).Error
if err != nil {
return err
}
// convert board issue relationship
boardIssue.IssueId = issue.Id
err = lakeModels.Db.Clauses(clause.OnConflict{DoNothing: true}).Create(boardIssue).Error
if err != nil {
return err
}
}
return nil
}