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 }