Skip to content

Commit

Permalink
optimize approver code
Browse files Browse the repository at this point in the history
  • Loading branch information
AllenShen committed Mar 28, 2024
1 parent dafc389 commit d8f9cfa
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,11 @@ type Approval struct {
}

type NativeApproval struct {
Timeout int `bson:"timeout" yaml:"timeout" json:"timeout"`
ApproveUsers []*User `bson:"approve_users" yaml:"approve_users" json:"approve_users"`
DetailedApproveUsers []*User `bson:"-" yaml:"detailed_approve_users" json:"detailed_approve_users"`
NeededApprovers int `bson:"needed_approvers" yaml:"needed_approvers" json:"needed_approvers"`
RejectOrApprove config.ApproveOrReject `bson:"reject_or_approve" yaml:"-" json:"reject_or_approve"`
Timeout int `bson:"timeout" yaml:"timeout" json:"timeout"`
ApproveUsers []*User `bson:"approve_users" yaml:"approve_users" json:"approve_users"`
FloatApproveUsers []*User `bson:"-" yaml:"flat_approve_users" json:"flat_approve_users"`
NeededApprovers int `bson:"needed_approvers" yaml:"needed_approvers" json:"needed_approvers"`
RejectOrApprove config.ApproveOrReject `bson:"reject_or_approve" yaml:"-" json:"reject_or_approve"`
// InstanceCode: native approval instance code, save for working after restart aslan
InstanceCode string `bson:"instance_code" yaml:"instance_code" json:"instance_code"`
}
Expand Down
114 changes: 65 additions & 49 deletions pkg/microservice/aslan/core/release_plan/service/approval.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,53 +212,16 @@ func updateDingTalkApproval(ctx context.Context, approvalInfo *models.Approval)
return nil
}

func createNativeApproval(plan *models.ReleasePlan, url string) error {
if plan == nil || plan.Approval == nil || plan.Approval.NativeApproval == nil {
return errors.New("createNativeApproval: native approval data not found")
}
approval := plan.Approval.NativeApproval

var err error
mailNotifyInfo := ""
var email *systemconfig.Email
for {
email, err = systemconfig.New().GetEmailHost()
if err != nil {
log.Errorf("CreateNativeApproval GetEmailHost error, error msg:%s", err)
break
}

t, err := template.New("approval").Parse(string(approvalHTML))
if err != nil {
log.Errorf("CreateNativeApproval template parse error, error msg:%s", err)
break
}
var buf bytes.Buffer
err = t.Execute(&buf, struct {
PlanName string
Manager string
Description string
TimeRange string
Url string
}{
PlanName: plan.Name,
Manager: plan.Manager,
Description: plan.Description,
TimeRange: time.Unix(plan.StartTime, 0).Format("2006-01-02 15:04:05") + "-" + time.Unix(plan.EndTime, 0).Format("2006-01-02 15:04:05"),
Url: url,
})
if err != nil {
log.Errorf("CreateNativeApproval template execute error, error msg:%s", err)
break
}
mailNotifyInfo = buf.String()
break
}

func geneFlatNativeApprovalUsers(approval *models.NativeApproval) ([]*models.User, map[string]*types.UserInfo) {
// change [group + user] approvals to user approvals
approvalUsers := make([]*models.User, 0)
userSet := sets.NewString()
userMap := make(map[string]*types.UserInfo)

if approval == nil {
return approvalUsers, userMap
}

for _, u := range approval.ApproveUsers {
if u.Type == "user" || u.Type == "" {
userSet.Insert(u.UserID)
Expand Down Expand Up @@ -292,11 +255,65 @@ func createNativeApproval(plan *models.ReleasePlan, url string) error {
}
}

if email != nil {
for _, uid := range userSet.List() {
info, ok := userMap[uid]
return approvalUsers, userMap
}

func createNativeApproval(plan *models.ReleasePlan, url string) error {
if plan == nil || plan.Approval == nil || plan.Approval.NativeApproval == nil {
return errors.New("createNativeApproval: native approval data not found")
}
approval := plan.Approval.NativeApproval

approvalUsers, userMap := geneFlatNativeApprovalUsers(approval)

// send email to all approval users if necessary
go func() {
var err error
mailNotifyInfo := ""
var email *systemconfig.Email

for {
email, err = systemconfig.New().GetEmailHost()
if err != nil {
log.Errorf("CreateNativeApproval GetEmailHost error, error msg:%s", err)
break
}

t, err := template.New("approval").Parse(string(approvalHTML))
if err != nil {
log.Errorf("CreateNativeApproval template parse error, error msg:%s", err)
break
}
var buf bytes.Buffer
err = t.Execute(&buf, struct {
PlanName string
Manager string
Description string
TimeRange string
Url string
}{
PlanName: plan.Name,
Manager: plan.Manager,
Description: plan.Description,
TimeRange: time.Unix(plan.StartTime, 0).Format("2006-01-02 15:04:05") + "-" + time.Unix(plan.EndTime, 0).Format("2006-01-02 15:04:05"),
Url: url,
})
if err != nil {
log.Errorf("CreateNativeApproval template execute error, error msg:%s", err)
break
}
mailNotifyInfo = buf.String()
break
}

if email == nil {
return
}

for _, u := range approvalUsers {
info, ok := userMap[u.UserID]
if !ok {
info, err = user.New().GetUserByID(uid)
info, err = user.New().GetUserByID(u.UserID)
if err != nil {
log.Warnf("CreateNativeApproval GetUserByUid error, error msg:%s", err)
continue
Expand All @@ -322,11 +339,10 @@ func createNativeApproval(plan *models.ReleasePlan, url string) error {
continue
}
}
}
}()

originApprovalUser := approval.ApproveUsers
approval.ApproveUsers = approvalUsers
approval.DetailedApproveUsers = approvalUsers

approveKey := uuid.New().String()
approval.InstanceCode = approveKey
Expand Down
45 changes: 8 additions & 37 deletions pkg/microservice/aslan/core/release_plan/service/release_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package service

import (
"context"
"k8s.io/apimachinery/pkg/util/sets"
"time"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -137,43 +136,11 @@ func GetReleasePlan(id string) (*models.ReleasePlan, error) {
return nil, errors.Wrap(err, "GetReleasePlan")
}

// TODO write detailed approval data into DB
// native approval users may be user or user groups
// convert to flat user when needed, this data is generated dynamically because group binding may be changed
if releasePlan.Approval != nil && releasePlan.Approval.NativeApproval != nil {
approval := releasePlan.Approval.NativeApproval
approvalUsers := make([]*models.User, 0)
userSet := sets.NewString()
for _, u := range approval.ApproveUsers {
if u.Type == "user" || u.Type == "" {
userSet.Insert(u.UserID)
approvalUsers = append(approvalUsers, u)
}
}
for _, u := range approval.ApproveUsers {
if u.Type == "group" {
groupInfo, err := user.New().GetGroupDetailedInfo(u.GroupID)
if err != nil {
log.Warnf("CreateNativeApproval GetGroupDetailedInfo error, error msg:%s", err)
continue
}
for _, uid := range groupInfo.UIDs {
if userSet.Has(uid) {
continue
}
userSet.Insert(uid)
userDetailedInfo, err := user.New().GetUserByID(uid)
if err != nil {
log.Errorf("failed to find user %s, error: %s", uid, err)
continue
}
approvalUsers = append(approvalUsers, &models.User{
Type: "user",
UserID: uid,
UserName: userDetailedInfo.Name,
})
}
}
}
releasePlan.Approval.NativeApproval.DetailedApproveUsers = approvalUsers
flatNativeApprovalUsers, _ := geneFlatNativeApprovalUsers(releasePlan.Approval.NativeApproval)
releasePlan.Approval.NativeApproval.FloatApproveUsers = flatNativeApprovalUsers
}

return releasePlan, nil
Expand Down Expand Up @@ -448,7 +415,11 @@ func ApproveReleasePlan(c *handler.Context, planID string, req *ApproveRequest)
if !ok {
// restore data after restart aslan
log.Infof("updateNativeApproval: approval instance code %s not found, set it", plan.Approval.NativeApproval.InstanceCode)
approvalUsers, _ := geneFlatNativeApprovalUsers(plan.Approval.NativeApproval)
originApprovalUsers := plan.Approval.NativeApproval.ApproveUsers
plan.Approval.NativeApproval.ApproveUsers = approvalUsers
approvalservice.GlobalApproveMap.SetApproval(plan.Approval.NativeApproval.InstanceCode, plan.Approval.NativeApproval)
plan.Approval.NativeApproval.ApproveUsers = originApprovalUsers
}

approval, err = approvalservice.GlobalApproveMap.DoApproval(approvalKey, c.UserName, c.UserID, req.Comment, req.Approve)
Expand Down

0 comments on commit d8f9cfa

Please sign in to comment.