Skip to content

Commit

Permalink
add jira sprint support in release plan
Browse files Browse the repository at this point in the history
Signed-off-by: Patrick Zhao <zhaoyu@koderover.com>
  • Loading branch information
PetrusZ committed Jul 5, 2024
1 parent 91f774f commit 6e731a5
Show file tree
Hide file tree
Showing 10 changed files with 794 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,16 @@ type ReleasePlan struct {
Name string `bson:"name" yaml:"name" json:"name"`
Manager string `bson:"manager" yaml:"manager" json:"manager"`
// ManagerID is the user id of the manager
ManagerID string `bson:"manager_id" yaml:"manager_id" json:"manager_id"`
StartTime int64 `bson:"start_time" yaml:"start_time" json:"start_time"`
EndTime int64 `bson:"end_time" yaml:"end_time" json:"end_time"`
ScheduleExecuteTime int64 `bson:"schedule_execute_time" yaml:"schedule_execute_time" json:"schedule_execute_time"`
Description string `bson:"description" yaml:"description" json:"description"`
CreatedBy string `bson:"created_by" yaml:"created_by" json:"created_by"`
CreateTime int64 `bson:"create_time" yaml:"create_time" json:"create_time"`
UpdatedBy string `bson:"updated_by" yaml:"updated_by" json:"updated_by"`
UpdateTime int64 `bson:"update_time" yaml:"update_time" json:"update_time"`
ManagerID string `bson:"manager_id" yaml:"manager_id" json:"manager_id"`
StartTime int64 `bson:"start_time" yaml:"start_time" json:"start_time"`
EndTime int64 `bson:"end_time" yaml:"end_time" json:"end_time"`
ScheduleExecuteTime int64 `bson:"schedule_execute_time" yaml:"schedule_execute_time" json:"schedule_execute_time"`
Description string `bson:"description" yaml:"description" json:"description"`
CreatedBy string `bson:"created_by" yaml:"created_by" json:"created_by"`
CreateTime int64 `bson:"create_time" yaml:"create_time" json:"create_time"`
UpdatedBy string `bson:"updated_by" yaml:"updated_by" json:"updated_by"`
UpdateTime int64 `bson:"update_time" yaml:"update_time" json:"update_time"`
JiraSprintAssociation ReleasePlanJiraSprintAssociation `bson:"jira_sprint_association" yaml:"jira_sprint_association" json:"jira_sprint_association"`

Approval *Approval `bson:"approval" yaml:"approval" json:"approval,omitempty"`

Expand All @@ -50,6 +51,17 @@ type ReleasePlan struct {
SuccessTime int64 `bson:"success_time" yaml:"success_time" json:"success_time"`
}

type ReleasePlanJiraSprintAssociation struct {
JiraID string `bson:"jira_id" yaml:"jira_id" json:"jira_id"`
Sprints []ReleasePlanJiraSprint `bson:"sprints" yaml:"sprints" json:"sprints"`
}

type ReleasePlanJiraSprint struct {
ProjectKey string `bson:"project_key" yaml:"project_key" json:"project_key"`
BoardID int `bson:"board_id" yaml:"board_id" json:"board_id"`
SprintID int `bson:"sprint_id" yaml:"sprint_id" json:"sprint_id"`
}

func (ReleasePlan) TableName() string {
return "release_plan"
}
Expand Down
37 changes: 37 additions & 0 deletions pkg/microservice/aslan/core/release_plan/service/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const (
VerbUpdateTimeRange = "update_time_range"
VerbUpdateScheduleExecuteTime = "update_schedule_execute_time"
VerbUpdateManager = "update_manager"
VerbUpdateJiraSprint = "update_jira_sprint"

VerbCreateReleaseJob = "create_release_job"
VerbUpdateReleaseJob = "update_release_job"
Expand Down Expand Up @@ -92,6 +93,8 @@ func NewPlanUpdater(args *UpdateReleasePlanArgs) (PlanUpdater, error) {
return NewUpdateApprovalUpdater(args)
case VerbDeleteApproval:
return NewDeleteApprovalUpdater(args)
case VerbUpdateJiraSprint:
return NewJiraSprintUpdater(args)
default:
return nil, fmt.Errorf("invalid verb: %s", args.Verb)
}
Expand Down Expand Up @@ -571,3 +574,37 @@ func (u *ScheduleExecuteTimeUpdater) TargetType() string {
func (u *ScheduleExecuteTimeUpdater) Verb() string {
return VerbUpdate
}

type JiraSprintUpdater struct {
JiraSprintAssociation models.ReleasePlanJiraSprintAssociation `json:"jira_sprint_association"`
}

func NewJiraSprintUpdater(args *UpdateReleasePlanArgs) (*JiraSprintUpdater, error) {
var updater JiraSprintUpdater
if err := models.IToi(args.Spec, &updater); err != nil {
return nil, errors.Wrap(err, "invalid spec")
}
return &updater, nil
}

func (u *JiraSprintUpdater) Update(plan *models.ReleasePlan) (before interface{}, after interface{}, err error) {
before, after = plan.JiraSprintAssociation, u.JiraSprintAssociation
plan.JiraSprintAssociation = u.JiraSprintAssociation
return
}

func (u *JiraSprintUpdater) Lint() error {
return nil
}

func (u *JiraSprintUpdater) TargetName() string {
return "需求关联"
}

func (u *JiraSprintUpdater) TargetType() string {
return TargetTypeDescription
}

func (u *JiraSprintUpdater) Verb() string {
return VerbUpdate
}
64 changes: 63 additions & 1 deletion pkg/microservice/aslan/core/system/handler/project_management.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package handler

import (
"fmt"
"strconv"
"strings"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -203,14 +204,75 @@ func Validate(c *gin.Context) {
// @Accept json
// @Produce json
// @Param id path string true "jira id"
// @Success 200 {array} service.JiraProjectsResp
// @Success 200 {array} service.JiraProjectResp
// @Router /api/aslan/system/project_management/{id}/jira/project [get]
func ListJiraProjects(c *gin.Context) {
ctx := internalhandler.NewContext(c)
defer func() { internalhandler.JSONResponse(c, ctx) }()
ctx.Resp, ctx.Err = service.ListJiraProjects(c.Param("id"))
}

// @Summary List Jira Boards
// @Description List Jira Boards
// @Tags system
// @Accept json
// @Produce json
// @Param id path string true "jira id"
// @Param projectKey query string true "jira project key"
// @Success 200 {array} service.JiraBoardResp
// @Router /api/aslan/system/project_management/{id}/jira/board [get]
func ListJiraBoards(c *gin.Context) {
ctx := internalhandler.NewContext(c)
defer func() { internalhandler.JSONResponse(c, ctx) }()
ctx.Resp, ctx.Err = service.ListJiraBoards(c.Param("id"), c.Query("projectKey"))
}

// @Summary List Jira Sprints
// @Description List Jira Sprints
// @Tags system
// @Accept json
// @Produce json
// @Param id path string true "jira id"
// @Param boardID path string true "jira board id"
// @Success 200 {array} service.JiraSprintResp
// @Router /api/aslan/system/project_management/{id}/jira/board/:boardID/sprint [get]
func ListJiraSprints(c *gin.Context) {
ctx := internalhandler.NewContext(c)
defer func() { internalhandler.JSONResponse(c, ctx) }()

boardID, err := strconv.Atoi(c.Param("boardID"))
if err != nil {
ctx.Err = e.ErrInvalidParam.AddDesc("invalid board id")
return

}

ctx.Resp, ctx.Err = service.ListJiraSprints(c.Param("id"), boardID)
}

// @Summary Get Jira Sprint
// @Description Get Jira Sprint
// @Tags system
// @Accept json
// @Produce json
// @Param id path string true "jira id"
// @Param sprintID path string true "jira sprint id"
// @Success 200 {object} service.JiraSprintResp
// @Router /api/aslan/system/project_management/{id}/jira/sprint/:sprintID [get]
func GetJiraSprint(c *gin.Context) {
ctx := internalhandler.NewContext(c)
defer func() { internalhandler.JSONResponse(c, ctx) }()

sprintID, err := strconv.Atoi(c.Param("sprintID"))
if err != nil {
ctx.Err = e.ErrInvalidParam.AddDesc("invalid sprint id")
return

}

ctx.Resp, ctx.Err = service.GetJiraSprint(c.Param("id"), sprintID)
}

func SearchJiraIssues(c *gin.Context) {
ctx := internalhandler.NewContext(c)
defer func() { internalhandler.JSONResponse(c, ctx) }()
Expand Down
3 changes: 3 additions & 0 deletions pkg/microservice/aslan/core/system/handler/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,9 @@ func (*Router) Inject(router *gin.RouterGroup) {
pm.PATCH("/:id", UpdateProjectManagement)
pm.DELETE("/:id", DeleteProjectManagement)
pm.GET("/:id/jira/project", ListJiraProjects)
pm.GET("/:id/jira/board", ListJiraBoards)
pm.GET("/:id/jira/board/:boardID/sprint", ListJiraSprints)
pm.GET("/:id/jira/sprint/:sprintID", GetJiraSprint)
pm.GET("/:id/jira/issue", SearchJiraIssues)
pm.GET("/:id/jira/issue/jql", SearchJiraProjectIssuesWithJQL)
pm.GET("/:id/jira/type", GetJiraTypes)
Expand Down
109 changes: 105 additions & 4 deletions pkg/microservice/aslan/core/system/service/project_management.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,12 @@ func ValidateMeego(info *models.ProjectManagement) error {
return nil
}

type JiraProjectsResp struct {
type JiraProjectResp struct {
Name string `json:"name"`
Key string `json:"key"`
}

func ListJiraProjects(id string) ([]JiraProjectsResp, error) {
func ListJiraProjects(id string) ([]JiraProjectResp, error) {
info, err := mongodb.NewProjectManagementColl().GetJiraByID(id)
if err != nil {
if err == mongo.ErrNoDocuments {
Expand All @@ -142,16 +142,117 @@ func ListJiraProjects(id string) ([]JiraProjectsResp, error) {
return nil, err
}

var resp []JiraProjectsResp
var resp []JiraProjectResp
for _, project := range list {
resp = append(resp, JiraProjectsResp{
resp = append(resp, JiraProjectResp{
Name: project.Name,
Key: project.Key,
})
}
return resp, nil
}

type JiraBoardResp struct {
ID int `json:"id"`
Name string `json:"name"`
Self string `json:"self"`
Type string `json:"type"`
}

func ListJiraBoards(id, projectKey string) ([]JiraBoardResp, error) {
info, err := mongodb.NewProjectManagementColl().GetJiraByID(id)
if err != nil {
if err == mongo.ErrNoDocuments {
return nil, nil
}
return nil, err
}

boards, err := jira.NewJiraClientWithAuthType(info.JiraHost, info.JiraUser, info.JiraToken, info.JiraPersonalAccessToken, info.JiraAuthType).Board.ListBoards(projectKey, "scrum")
if err != nil {
return nil, err
}

var resp []JiraBoardResp
for _, board := range boards {
resp = append(resp, JiraBoardResp{
ID: board.ID,
Name: board.Name,
Self: board.Self,
Type: board.Type,
})
}
return resp, nil
}

type JiraSprintResp struct {
ID int `json:"id,omitempty"`
Self string `json:"self,omitempty"`
State string `json:"state,omitempty"`
Name string `json:"name,omitempty"`
StartDate time.Time `json:"startDate,omitempty"`
EndDate time.Time `json:"endDate,omitempty"`
CompleteDate time.Time `json:"completeDate,omitempty"`
OriginBoardID int `json:"originBoardId,omitempty"`
}

func ListJiraSprints(id string, boardID int) ([]JiraSprintResp, error) {
info, err := mongodb.NewProjectManagementColl().GetJiraByID(id)
if err != nil {
if err == mongo.ErrNoDocuments {
return nil, nil
}
return nil, err
}

sprints, err := jira.NewJiraClientWithAuthType(info.JiraHost, info.JiraUser, info.JiraToken, info.JiraPersonalAccessToken, info.JiraAuthType).Sprint.ListSprints(boardID, "")
if err != nil {
return nil, err
}

var resp []JiraSprintResp
for _, sprint := range sprints {
resp = append(resp, JiraSprintResp{
ID: sprint.ID,
Self: sprint.Self,
State: sprint.State,
Name: sprint.Name,
StartDate: sprint.StartDate,
EndDate: sprint.EndDate,
CompleteDate: sprint.CompleteDate,
OriginBoardID: sprint.OriginBoardID,
})
}
return resp, nil
}

func GetJiraSprint(id string, sprintID int) (*JiraSprintResp, error) {
info, err := mongodb.NewProjectManagementColl().GetJiraByID(id)
if err != nil {
if err == mongo.ErrNoDocuments {
return nil, nil
}
return nil, err
}

sprint, err := jira.NewJiraClientWithAuthType(info.JiraHost, info.JiraUser, info.JiraToken, info.JiraPersonalAccessToken, info.JiraAuthType).Sprint.GetSrpint(sprintID)
if err != nil {
return nil, err
}

resp := &JiraSprintResp{
ID: sprint.ID,
Self: sprint.Self,
State: sprint.State,
Name: sprint.Name,
StartDate: sprint.StartDate,
EndDate: sprint.EndDate,
CompleteDate: sprint.CompleteDate,
OriginBoardID: sprint.OriginBoardID,
}
return resp, nil
}

func GetJiraTypes(id, project string) ([]*jira.IssueTypeWithStatus, error) {
info, err := mongodb.NewProjectManagementColl().GetJiraByID(id)
if err != nil {
Expand Down
Loading

0 comments on commit 6e731a5

Please sign in to comment.