github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/uaa/groups.go (about)

     1  package uaa
     2  
     3  import (
     4  	"bytes"
     5  	"code.cloudfoundry.org/cli/api/uaa/internal"
     6  	"encoding/json"
     7  	"fmt"
     8  	"net/http"
     9  	"net/url"
    10  )
    11  
    12  type Group struct {
    13  	ID          string `json:"id"`
    14  	Value       string `json:"value"`
    15  	Display     string `json:"display"`
    16  	DisplayName string `json:"displayName"`
    17  	Type        string `json:"type"`
    18  }
    19  
    20  func (g Group) Name() string {
    21  	if g.Display == "" {
    22  		return g.DisplayName
    23  	}
    24  	return g.Display
    25  }
    26  
    27  func (g Group) Id() string {
    28  	if g.ID == "" {
    29  		return g.Value
    30  	}
    31  	return g.ID
    32  }
    33  
    34  // GetGroups get all UAA groups.
    35  func (client *Client) GetGroups() ([]Group, error) {
    36  	request, err := client.newRequest(requestOptions{
    37  		RequestName: internal.GetGroupsRequest,
    38  		Header: http.Header{
    39  			"Content-Type": {"application/json"},
    40  		},
    41  	})
    42  	if err != nil {
    43  		return []Group{}, err
    44  	}
    45  
    46  	var usersResources struct {
    47  		Groups []Group `json:"resources"`
    48  	}
    49  	response := Response{
    50  		Result: &usersResources,
    51  	}
    52  
    53  	err = client.connection.Make(request, &response)
    54  	if err != nil {
    55  		return []Group{}, err
    56  	}
    57  	return usersResources.Groups, err
    58  }
    59  
    60  // GetGroups get all UAA groups filtered by name.
    61  func (client *Client) GetGroupsByName(name string) ([]Group, error) {
    62  	request, err := client.newRequest(requestOptions{
    63  		RequestName: internal.GetGroupsRequest,
    64  		Header: http.Header{
    65  			"Content-Type": {"application/json"},
    66  		},
    67  		Query: url.Values{
    68  			"filter": []string{fmt.Sprintf(`displayName Eq "%s"`, name)},
    69  		},
    70  	})
    71  	if err != nil {
    72  		return []Group{}, err
    73  	}
    74  
    75  	var usersResources struct {
    76  		Groups []Group `json:"resources"`
    77  	}
    78  	response := Response{
    79  		Result: &usersResources,
    80  	}
    81  
    82  	err = client.connection.Make(request, &response)
    83  	if err != nil {
    84  		return []Group{}, err
    85  	}
    86  	return usersResources.Groups, err
    87  }
    88  
    89  // AddMemberByName add member to a group by its name.
    90  func (client *Client) AddMemberByName(userGuid, origin, groupName string) error {
    91  	groups, err := client.GetGroupsByName(groupName)
    92  	if err != nil {
    93  		return err
    94  	}
    95  
    96  	groupAddReq := struct {
    97  		Origin string `json:"origin"`
    98  		Type   string `json:"type"`
    99  		Value  string `json:"value"`
   100  	}{
   101  		Origin: origin,
   102  		Value:  userGuid,
   103  		Type:   "USER",
   104  	}
   105  
   106  	bodyBytes, err := json.Marshal(groupAddReq)
   107  	if err != nil {
   108  		return err
   109  	}
   110  
   111  	for _, g := range groups {
   112  		request, err := client.newRequest(requestOptions{
   113  			RequestName: internal.PostGroupMemberRequest,
   114  			Header: http.Header{
   115  				"Content-Type": {"application/json"},
   116  			},
   117  			URIParams: internal.Params{"group_guid": g.ID},
   118  			Body:      bytes.NewBuffer(bodyBytes),
   119  		})
   120  		if err != nil {
   121  			return err
   122  		}
   123  
   124  		response := Response{
   125  		}
   126  
   127  		err = client.connection.Make(request, &response)
   128  		if err != nil {
   129  			return err
   130  		}
   131  		return err
   132  	}
   133  	return nil
   134  }
   135  
   136  // DeleteMemberByName delete member to a group by its name.
   137  func (client *Client) DeleteMemberByName(userGuid, groupName string) error {
   138  	groups, err := client.GetGroupsByName(groupName)
   139  	if err != nil {
   140  		return err
   141  	}
   142  	for _, g := range groups {
   143  		request, err := client.newRequest(requestOptions{
   144  			RequestName: internal.DeleteGroupMemberRequest,
   145  			Header: http.Header{
   146  				"Content-Type": {"application/json"},
   147  			},
   148  			URIParams: internal.Params{"user_guid": userGuid, "group_guid": g.ID},
   149  		})
   150  		if err != nil {
   151  			return err
   152  		}
   153  
   154  		response := Response{
   155  		}
   156  		err = client.connection.Make(request, &response)
   157  		if err != nil {
   158  			return err
   159  		}
   160  		return err
   161  	}
   162  	return nil
   163  }