143 lines
3.9 KiB
Go
143 lines
3.9 KiB
Go
// Copyright 2018 The OpenPitrix Authors. All rights reserved.
|
|
// Use of this source code is governed by a Apache license
|
|
// that can be found in the LICENSE file.
|
|
|
|
package account
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"math"
|
|
"strings"
|
|
|
|
"openpitrix.io/openpitrix/pkg/constants"
|
|
"openpitrix.io/openpitrix/pkg/logger"
|
|
"openpitrix.io/openpitrix/pkg/manager"
|
|
"openpitrix.io/openpitrix/pkg/pb"
|
|
"openpitrix.io/openpitrix/pkg/util/pbutil"
|
|
"openpitrix.io/openpitrix/pkg/util/stringutil"
|
|
)
|
|
|
|
type Client struct {
|
|
pb.AccountManagerClient
|
|
}
|
|
|
|
func NewClient() (*Client, error) {
|
|
conn, err := manager.NewClient(constants.AccountServiceHost, constants.AccountServicePort)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Client{
|
|
AccountManagerClient: pb.NewAccountManagerClient(conn),
|
|
}, nil
|
|
}
|
|
|
|
func (c *Client) GetUsers(ctx context.Context, userIds []string) ([]*pb.User, error) {
|
|
var internalUsers []*pb.User
|
|
var noInternalUserIds []string
|
|
for _, userId := range userIds {
|
|
if stringutil.StringIn(userId, constants.InternalUsers) {
|
|
internalUsers = append(internalUsers, &pb.User{
|
|
UserId: pbutil.ToProtoString(userId),
|
|
})
|
|
} else {
|
|
noInternalUserIds = append(noInternalUserIds, userId)
|
|
}
|
|
}
|
|
|
|
if len(noInternalUserIds) == 0 {
|
|
return internalUsers, nil
|
|
}
|
|
|
|
response, err := c.DescribeUsers(ctx, &pb.DescribeUsersRequest{
|
|
UserId: noInternalUserIds,
|
|
})
|
|
if err != nil {
|
|
logger.Error(ctx, "Describe users %s failed: %+v", noInternalUserIds, err)
|
|
return nil, err
|
|
}
|
|
if len(response.UserSet) != len(noInternalUserIds) {
|
|
logger.Error(ctx, "Describe users %s with return count [%d]", userIds, len(response.UserSet)+len(internalUsers))
|
|
return nil, fmt.Errorf("describe users %s with return count [%d]", userIds, len(response.UserSet)+len(internalUsers))
|
|
}
|
|
response.UserSet = append(response.UserSet, internalUsers...)
|
|
return response.UserSet, nil
|
|
}
|
|
|
|
func (c *Client) GetUser(ctx context.Context, userId string) (*pb.User, error) {
|
|
users, err := c.GetUsers(ctx, []string{userId})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(users) == 0 {
|
|
return nil, fmt.Errorf("not found user [%s]", userId)
|
|
}
|
|
return users[0], nil
|
|
}
|
|
|
|
func (c *Client) GetUserGroupPath(ctx context.Context, userId string) (string, error) {
|
|
var userGroupPath string
|
|
|
|
response, err := c.DescribeUsersDetail(ctx, &pb.DescribeUsersRequest{
|
|
UserId: []string{userId},
|
|
})
|
|
if err != nil || len(response.UserDetailSet) == 0 {
|
|
logger.Error(ctx, "Describe user [%s] failed: %+v", userId, err)
|
|
return "", err
|
|
}
|
|
|
|
groups := response.UserDetailSet[0].GroupSet
|
|
|
|
//If one user under different groups, get the highest group path.
|
|
minLevel := math.MaxInt32
|
|
for _, group := range groups {
|
|
level := len(strings.Split(group.GroupPath.GetValue(), "."))
|
|
if level < minLevel {
|
|
minLevel = level
|
|
userGroupPath = group.GetGroupPath().GetValue()
|
|
}
|
|
}
|
|
|
|
return userGroupPath, nil
|
|
|
|
}
|
|
|
|
func (c *Client) GetRoleUsers(ctx context.Context, roleIds []string) ([]*pb.User, error) {
|
|
response, err := c.DescribeUsers(ctx, &pb.DescribeUsersRequest{
|
|
RoleId: roleIds,
|
|
Status: []string{constants.StatusActive},
|
|
})
|
|
if err != nil {
|
|
logger.Error(ctx, "Describe users failed: %+v", err)
|
|
return nil, err
|
|
}
|
|
|
|
return response.UserSet, nil
|
|
}
|
|
|
|
func (c *Client) GetIsvFromUser(ctx context.Context, userId string) (*pb.User, error) {
|
|
groupPath, err := c.GetUserGroupPath(ctx, userId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rootGroupId := strings.Split(groupPath, ".")[0]
|
|
|
|
describeUsersResponse, err := c.DescribeUsers(ctx, &pb.DescribeUsersRequest{
|
|
RootGroupId: []string{rootGroupId},
|
|
Status: []string{constants.StatusActive},
|
|
RoleId: []string{constants.RoleIsv},
|
|
})
|
|
if err != nil {
|
|
logger.Error(ctx, "Failed to describe users: %+v", err)
|
|
return nil, err
|
|
}
|
|
|
|
if len(describeUsersResponse.UserSet) == 0 {
|
|
logger.Error(ctx, "Isv not exist with root group id [%s]", rootGroupId)
|
|
return nil, fmt.Errorf("isv not exist")
|
|
}
|
|
|
|
return describeUsersResponse.UserSet[0], nil
|
|
}
|