Files
influx-cli/internal/cmd/org/org_members.go
2021-05-20 13:24:13 -04:00

163 lines
4.2 KiB
Go

package org
import (
"context"
"fmt"
"github.com/influxdata/influx-cli/v2/internal/api"
"github.com/influxdata/influx-cli/v2/internal/cmd"
"github.com/influxdata/influx-cli/v2/pkg/influxid"
)
type AddMemberParams struct {
MemberId influxid.ID
OrgName string
OrgID influxid.ID
}
func (c Client) AddMember(ctx context.Context, params *AddMemberParams) (err error) {
if !params.OrgID.Valid() && params.OrgName == "" && c.ActiveConfig.Org == "" {
return cmd.ErrMustSpecifyOrg
}
orgID := params.OrgID.String()
if !params.OrgID.Valid() {
if orgID, err = c.getOrgId(ctx, params.OrgName); err != nil {
return err
}
}
member, err := c.PostOrgsIDMembers(ctx, orgID).
AddResourceMemberRequestBody(*api.NewAddResourceMemberRequestBody(params.MemberId.String())).
Execute()
if err != nil {
return fmt.Errorf("failed to add user %q to org %q: %w", params.MemberId.String(), orgID, err)
}
_, err = c.StdIO.Write([]byte(fmt.Sprintf("user %q has been added as a member of org %q\n", *member.Id, orgID)))
return err
}
type ListMemberParams struct {
OrgName string
OrgID influxid.ID
}
const maxConcurrentGetUserRequests = 10
func (c Client) ListMembers(ctx context.Context, params *ListMemberParams) (err error) {
if !params.OrgID.Valid() && params.OrgName == "" && c.ActiveConfig.Org == "" {
return cmd.ErrMustSpecifyOrg
}
orgID := params.OrgID.String()
if !params.OrgID.Valid() {
if orgID, err = c.getOrgId(ctx, params.OrgName); err != nil {
return err
}
}
members, err := c.GetOrgsIDMembers(ctx, orgID).Execute()
if err != nil {
return fmt.Errorf("failed to find members of org %q: %w", orgID, err)
}
type indexedUser struct {
user api.UserResponse
index int
}
userChan := make(chan indexedUser, maxConcurrentGetUserRequests)
semChan := make(chan struct{}, maxConcurrentGetUserRequests)
errChan := make(chan error)
var resourceMembers []api.ResourceMember
if members.Users != nil {
resourceMembers = *members.Users
}
// Fetch user details about all members of the org.
for i, member := range resourceMembers {
go func(i int, memberId string) {
semChan <- struct{}{}
defer func() { <-semChan }()
user, err := c.GetUsersID(ctx, memberId).Execute()
if err != nil {
errChan <- fmt.Errorf("failed to retrieve details for user %q: %w", memberId, err)
return
}
userChan <- indexedUser{user: user, index: i}
}(i, member.GetId())
}
users := make([]api.UserResponse, len(resourceMembers))
for range resourceMembers {
select {
case <-ctx.Done():
return ctx.Err()
case err := <-errChan:
return err
case user := <-userChan:
users[user.index] = user.user
}
}
if c.PrintAsJSON {
return c.PrintJSON(users)
}
rows := make([]map[string]interface{}, len(resourceMembers))
for i, user := range users {
rows[i] = map[string]interface{}{
"ID": user.GetId(),
"Name": user.GetName(),
"User Type": "member",
"Status": user.GetStatus(),
}
}
return c.PrintTable([]string{"ID", "Name", "User Type", "Status"}, rows...)
}
type RemoveMemberParams struct {
MemberId influxid.ID
OrgName string
OrgID influxid.ID
}
func (c Client) RemoveMember(ctx context.Context, params *RemoveMemberParams) (err error) {
if !params.OrgID.Valid() && params.OrgName == "" && c.ActiveConfig.Org == "" {
return cmd.ErrMustSpecifyOrg
}
orgID := params.OrgID.String()
if !params.OrgID.Valid() {
if orgID, err = c.getOrgId(ctx, params.OrgName); err != nil {
return err
}
}
if err = c.DeleteOrgsIDMembersID(ctx, orgID, params.MemberId.String()).Execute(); err != nil {
return fmt.Errorf("failed to remove member %q from org %q", params.MemberId, orgID)
}
_, err = c.StdIO.Write([]byte(fmt.Sprintf("user %q has been removed from org %q\n", params.MemberId, orgID)))
return err
}
func (c Client) getOrgId(ctx context.Context, orgName string) (string, error) {
req := c.GetOrgs(ctx)
if orgName != "" {
req = req.Org(orgName)
} else {
req = req.Org(c.ActiveConfig.Org)
}
orgs, err := req.Execute()
if err != nil {
return "", fmt.Errorf("failed to find org %q: %w", orgName, err)
}
if orgs.Orgs == nil || len(*orgs.Orgs) == 0 {
return "", fmt.Errorf("no org found with name %q", orgName)
}
return *(*orgs.Orgs)[0].Id, nil
}