Skip to content

Commit 402f34b

Browse files
authored
support Lark approval cc_groups in release plans (#4627)
* support Lark approval cc_groups in release plans Signed-off-by: Cynthia <chenchen@koderover.com> * extract Lark user group conversion helper Signed-off-by: Cynthia <chenchen@koderover.com> * correctly handle Lark user groups on START and END nodes Signed-off-by: Cynthia <chenchen@koderover.com> --------- Signed-off-by: Cynthia <chenchen@koderover.com> Co-authored-by: Cynthia <chenchen@koderover.com>
1 parent 3833e69 commit 402f34b

3 files changed

Lines changed: 102 additions & 57 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package util
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/models"
7+
larkservice "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/lark"
8+
"github.com/koderover/zadig/v2/pkg/setting"
9+
"github.com/koderover/zadig/v2/pkg/tool/lark"
10+
"k8s.io/apimachinery/pkg/util/sets"
11+
)
12+
13+
func ConvertLarkUserGroupToUser(larkApprovalID string, groups []*models.LarkApprovalGroup) ([]*lark.UserInfo, error) {
14+
userSet := sets.NewString()
15+
users := make([]*lark.UserInfo, 0)
16+
for _, group := range groups {
17+
userGroup, err := larkservice.GetLarkUserGroup(larkApprovalID, group.GroupID)
18+
if err != nil {
19+
return nil, fmt.Errorf("failed to get lark user group: %s", err)
20+
}
21+
22+
if userGroup.MemberUserCount > 0 {
23+
userInfos, err := larkservice.GetLarkUserGroupMembersInfo(larkApprovalID, group.GroupID, "user", setting.LarkUserOpenID, "")
24+
if err != nil {
25+
return nil, fmt.Errorf("failed to get lark department user infos: %s", err)
26+
}
27+
28+
for _, user := range userInfos {
29+
if !userSet.Has(user.ID) {
30+
users = append(users, user)
31+
userSet.Insert(user.ID)
32+
}
33+
}
34+
}
35+
36+
if userGroup.MemberDepartmentCount > 0 {
37+
userInfos, err := larkservice.GetLarkUserGroupMembersInfo(larkApprovalID, group.GroupID, "department", setting.LarkDepartmentID, "")
38+
if err != nil {
39+
return nil, fmt.Errorf("failed to get lark department user infos: %s", err)
40+
}
41+
42+
for _, user := range userInfos {
43+
if !userSet.Has(user.ID) {
44+
users = append(users, user)
45+
userSet.Insert(user.ID)
46+
}
47+
}
48+
}
49+
}
50+
return users, nil
51+
}

pkg/microservice/aslan/core/release_plan/service/lint.go

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package service
1919
import (
2020
"fmt"
2121

22+
commonmodels "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/models"
2223
"github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/util"
2324
"github.com/koderover/zadig/v2/pkg/tool/lark"
2425
"github.com/pkg/errors"
@@ -105,12 +106,44 @@ func lintApproval(approval *models.Approval) error {
105106
if len(approval.LarkApproval.ApprovalNodes) == 0 {
106107
return errors.New("num of approval-node is 0")
107108
}
109+
108110
for i, node := range approval.LarkApproval.ApprovalNodes {
109-
if node.Type == lark.ApproveTypeStart || node.Type == lark.ApproveTypeEnd {
110-
continue
111-
}
112-
if len(node.ApproveUsers) == 0 {
113-
return errors.Errorf("num of approval-node %d approver is 0", i)
111+
if node.ApproveNodeType == lark.ApproveNodeTypeUser {
112+
if node.Type == lark.ApproveTypeStart || node.Type == lark.ApproveTypeEnd {
113+
continue
114+
}
115+
if len(node.ApproveUsers) == 0 {
116+
return errors.Errorf("num of approval-node %d approver is 0", i)
117+
}
118+
} else if node.ApproveNodeType == lark.ApproveNodeTypeUserGroup {
119+
if node.Type == lark.ApproveTypeStart || node.Type == lark.ApproveTypeEnd {
120+
users, err := util.ConvertLarkUserGroupToUser(approval.LarkApproval.ID, node.CcGroups)
121+
if err != nil {
122+
return errors.Errorf("failed to convert lark user group to user: %s", err)
123+
}
124+
node.CcUsers = users
125+
approval.LarkApproval.ApprovalNodes[i] = node
126+
continue
127+
}
128+
129+
if len(node.ApproveGroups) == 0 {
130+
return errors.Errorf("num of approval-node %d approver is 0", i)
131+
}
132+
133+
users, err := util.ConvertLarkUserGroupToUser(approval.LarkApproval.ID, node.ApproveGroups)
134+
if err != nil {
135+
return errors.Errorf("failed to convert lark user group to user: %s", err)
136+
}
137+
138+
approveUsers := make([]*commonmodels.LarkApprovalUser, 0)
139+
for _, user := range users {
140+
approveUsers = append(approveUsers, &commonmodels.LarkApprovalUser{
141+
UserInfo: *user,
142+
})
143+
}
144+
node.ApproveUsers = approveUsers
145+
146+
approval.LarkApproval.ApprovalNodes[i] = node
114147
}
115148
if !lo.Contains([]string{"AND", "OR"}, string(node.Type)) {
116149
return errors.Errorf("approval-node %d type should be AND or OR", i)

pkg/microservice/aslan/core/workflow/service/workflow/controller/job/job_approval.go

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ import (
2525

2626
"github.com/koderover/zadig/v2/pkg/microservice/aslan/config"
2727
commonmodels "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/repository/models"
28-
larkservice "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/lark"
2928
"github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/util"
30-
"github.com/koderover/zadig/v2/pkg/setting"
3129
e "github.com/koderover/zadig/v2/pkg/tool/errors"
3230
"github.com/koderover/zadig/v2/pkg/tool/lark"
3331
"github.com/koderover/zadig/v2/pkg/types"
@@ -289,13 +287,22 @@ func (j ApprovalJobController) ToTask(taskID int64) ([]*commonmodels.JobTask, er
289287
return nil, fmt.Errorf("num of approval-node %d approver is 0", i)
290288
}
291289
} else if node.ApproveNodeType == lark.ApproveNodeTypeUserGroup {
292-
if node.Type != lark.ApproveTypeStart && node.Type != lark.ApproveTypeEnd {
293-
if len(node.ApproveGroups) == 0 {
294-
return nil, fmt.Errorf("num of approval-node %d approver is 0", i)
290+
291+
if node.Type == lark.ApproveTypeStart || node.Type == lark.ApproveTypeEnd {
292+
users, err := util.ConvertLarkUserGroupToUser(j.jobSpec.LarkApproval.ID, node.CcGroups)
293+
if err != nil {
294+
return nil, fmt.Errorf("failed to convert lark user group to user: %s", err)
295295
}
296+
node.CcUsers = users
297+
jobSpec.LarkApproval.ApprovalNodes[i] = node
298+
continue
296299
}
297300

298-
users, err := convertLarkUserGroupToUser(j.jobSpec.LarkApproval.ID, node.ApproveGroups)
301+
if len(node.ApproveGroups) == 0 {
302+
return nil, fmt.Errorf("num of approval-node %d approver is 0", i)
303+
}
304+
305+
users, err := util.ConvertLarkUserGroupToUser(j.jobSpec.LarkApproval.ID, node.ApproveGroups)
299306
if err != nil {
300307
return nil, fmt.Errorf("failed to convert lark user group to user: %s", err)
301308
}
@@ -308,12 +315,6 @@ func (j ApprovalJobController) ToTask(taskID int64) ([]*commonmodels.JobTask, er
308315
}
309316
node.ApproveUsers = approveUsers
310317

311-
users, err = convertLarkUserGroupToUser(j.jobSpec.LarkApproval.ID, node.CcGroups)
312-
if err != nil {
313-
return nil, fmt.Errorf("failed to convert lark user group to user: %s", err)
314-
}
315-
node.CcUsers = users
316-
317318
jobSpec.LarkApproval.ApprovalNodes[i] = node
318319
}
319320
if !lo.Contains([]string{"AND", "OR"}, string(node.Type)) {
@@ -337,46 +338,6 @@ func (j ApprovalJobController) ToTask(taskID int64) ([]*commonmodels.JobTask, er
337338
return resp, nil
338339
}
339340

340-
func convertLarkUserGroupToUser(larkApprovalID string, groups []*commonmodels.LarkApprovalGroup) ([]*lark.UserInfo, error) {
341-
userSet := sets.NewString()
342-
users := make([]*lark.UserInfo, 0)
343-
for _, group := range groups {
344-
userGroup, err := larkservice.GetLarkUserGroup(larkApprovalID, group.GroupID)
345-
if err != nil {
346-
return nil, fmt.Errorf("failed to get lark user group: %s", err)
347-
}
348-
349-
if userGroup.MemberUserCount > 0 {
350-
userInfos, err := larkservice.GetLarkUserGroupMembersInfo(larkApprovalID, group.GroupID, "user", setting.LarkUserOpenID, "")
351-
if err != nil {
352-
return nil, fmt.Errorf("failed to get lark department user infos: %s", err)
353-
}
354-
355-
for _, user := range userInfos {
356-
if !userSet.Has(user.ID) {
357-
users = append(users, user)
358-
userSet.Insert(user.ID)
359-
}
360-
}
361-
}
362-
363-
if userGroup.MemberDepartmentCount > 0 {
364-
userInfos, err := larkservice.GetLarkUserGroupMembersInfo(larkApprovalID, group.GroupID, "department", setting.LarkDepartmentID, "")
365-
if err != nil {
366-
return nil, fmt.Errorf("failed to get lark department user infos: %s", err)
367-
}
368-
369-
for _, user := range userInfos {
370-
if !userSet.Has(user.ID) {
371-
users = append(users, user)
372-
userSet.Insert(user.ID)
373-
}
374-
}
375-
}
376-
}
377-
return users, nil
378-
}
379-
380341
func (j ApprovalJobController) SetRepo(repo *types.Repository) error {
381342
return nil
382343
}

0 commit comments

Comments
 (0)