github.com/pivotal-cf/go-pivnet/v6@v6.0.2/user_groups.go (about) 1 package pivnet 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 ) 9 10 type UserGroupsService struct { 11 client Client 12 } 13 14 type addRemoveUserGroupBody struct { 15 UserGroup UserGroup `json:"user_group"` 16 } 17 18 type createUserGroupBody struct { 19 UserGroup createUserGroup `json:"user_group"` 20 } 21 22 type updateUserGroupBody struct { 23 UserGroup updateUserGroup `json:"user_group"` 24 } 25 26 type addRemoveMemberBody struct { 27 Member member `json:"member"` 28 } 29 30 type UserGroupsResponse struct { 31 UserGroups []UserGroup `json:"user_groups,omitempty"` 32 } 33 34 type UpdateUserGroupResponse struct { 35 UserGroup UserGroup `json:"user_group,omitempty"` 36 } 37 38 type UserGroup struct { 39 ID int `json:"id,omitempty" yaml:"id,omitempty"` 40 Name string `json:"name,omitempty" yaml:"name,omitempty"` 41 Description string `json:"description,omitempty" yaml:"description,omitempty"` 42 Members []string `json:"members,omitempty" yaml:"members,omitempty"` 43 Admins []string `json:"admins,omitempty" yaml:"admins,omitempty"` 44 } 45 46 type createUserGroup struct { 47 ID int `json:"id,omitempty"` 48 Name string `json:"name,omitempty"` 49 Description string `json:"description,omitempty"` 50 Members []string `json:"members"` // do not omit empty to satisfy pivnet 51 } 52 53 type updateUserGroup struct { 54 ID int `json:"id,omitempty"` 55 Name string `json:"name,omitempty"` 56 Description string `json:"description,omitempty"` 57 Members []string `json:"members,omitempty"` 58 } 59 60 type member struct { 61 Email string `json:"email,omitempty"` 62 Admin bool `json:"admin,omitempty"` 63 } 64 65 func (u UserGroupsService) List() ([]UserGroup, error) { 66 url := "/user_groups" 67 68 var response UserGroupsResponse 69 resp, err := u.client.MakeRequest( 70 "GET", 71 url, 72 http.StatusOK, 73 nil, 74 ) 75 if err != nil { 76 return nil, err 77 } 78 defer resp.Body.Close() 79 80 err = json.NewDecoder(resp.Body).Decode(&response) 81 if err != nil { 82 return nil, err 83 } 84 85 return response.UserGroups, nil 86 } 87 88 func (u UserGroupsService) ListForRelease(productSlug string, releaseID int) ([]UserGroup, error) { 89 url := fmt.Sprintf( 90 "/products/%s/releases/%d/user_groups", 91 productSlug, 92 releaseID, 93 ) 94 95 var response UserGroupsResponse 96 resp, err := u.client.MakeRequest( 97 "GET", 98 url, 99 http.StatusOK, 100 nil, 101 ) 102 if err != nil { 103 return nil, err 104 } 105 defer resp.Body.Close() 106 107 err = json.NewDecoder(resp.Body).Decode(&response) 108 if err != nil { 109 return nil, err 110 } 111 112 return response.UserGroups, nil 113 } 114 115 func (u UserGroupsService) AddToRelease(productSlug string, releaseID int, userGroupID int) error { 116 url := fmt.Sprintf( 117 "/products/%s/releases/%d/add_user_group", 118 productSlug, 119 releaseID, 120 ) 121 122 body := addRemoveUserGroupBody{ 123 UserGroup: UserGroup{ 124 ID: userGroupID, 125 }, 126 } 127 128 b, err := json.Marshal(body) 129 if err != nil { 130 // Untested as we cannot force an error because we are marshalling 131 // a known-good body 132 return err 133 } 134 135 resp, err := u.client.MakeRequest( 136 "PATCH", 137 url, 138 http.StatusNoContent, 139 bytes.NewReader(b), 140 ) 141 if err != nil { 142 return err 143 } 144 defer resp.Body.Close() 145 146 return nil 147 } 148 149 func (u UserGroupsService) RemoveFromRelease(productSlug string, releaseID int, userGroupID int) error { 150 url := fmt.Sprintf( 151 "/products/%s/releases/%d/remove_user_group", 152 productSlug, 153 releaseID, 154 ) 155 156 body := addRemoveUserGroupBody{ 157 UserGroup: UserGroup{ 158 ID: userGroupID, 159 }, 160 } 161 162 b, err := json.Marshal(body) 163 if err != nil { 164 // Untested as we cannot force an error because we are marshalling 165 // a known-good body 166 return err 167 } 168 169 resp, err := u.client.MakeRequest( 170 "PATCH", 171 url, 172 http.StatusNoContent, 173 bytes.NewReader(b), 174 ) 175 if err != nil { 176 return err 177 } 178 defer resp.Body.Close() 179 180 return nil 181 } 182 183 func (u UserGroupsService) Get(userGroupID int) (UserGroup, error) { 184 url := fmt.Sprintf("/user_groups/%d", userGroupID) 185 186 var response UserGroup 187 resp, err := u.client.MakeRequest( 188 "GET", 189 url, 190 http.StatusOK, 191 nil, 192 ) 193 if err != nil { 194 return UserGroup{}, err 195 } 196 defer resp.Body.Close() 197 198 err = json.NewDecoder(resp.Body).Decode(&response) 199 if err != nil { 200 return UserGroup{}, err 201 } 202 203 return response, nil 204 } 205 206 func (u UserGroupsService) Create(name string, description string, members []string) (UserGroup, error) { 207 url := "/user_groups" 208 209 if members == nil { 210 members = []string{} 211 } 212 213 createBody := createUserGroupBody{ 214 createUserGroup{ 215 Name: name, 216 Description: description, 217 Members: members, 218 }, 219 } 220 221 b, err := json.Marshal(createBody) 222 if err != nil { 223 // Untested as we cannot force an error because we are marshalling 224 // a known-good body 225 return UserGroup{}, err 226 } 227 228 body := bytes.NewReader(b) 229 230 var response UserGroup 231 resp, err := u.client.MakeRequest( 232 "POST", 233 url, 234 http.StatusCreated, 235 body, 236 ) 237 if err != nil { 238 return UserGroup{}, err 239 } 240 defer resp.Body.Close() 241 242 err = json.NewDecoder(resp.Body).Decode(&response) 243 if err != nil { 244 return UserGroup{}, err 245 } 246 247 return response, nil 248 } 249 250 func (u UserGroupsService) Update(userGroup UserGroup) (UserGroup, error) { 251 url := fmt.Sprintf("/user_groups/%d", userGroup.ID) 252 253 createBody := updateUserGroupBody{ 254 updateUserGroup{ 255 Name: userGroup.Name, 256 Description: userGroup.Description, 257 }, 258 } 259 260 b, err := json.Marshal(createBody) 261 if err != nil { 262 // Untested as we cannot force an error because we are marshalling 263 // a known-good body 264 return UserGroup{}, err 265 } 266 267 body := bytes.NewReader(b) 268 269 var response UpdateUserGroupResponse 270 resp, err := u.client.MakeRequest( 271 "PATCH", 272 url, 273 http.StatusOK, 274 body, 275 ) 276 if err != nil { 277 return UserGroup{}, err 278 } 279 defer resp.Body.Close() 280 281 err = json.NewDecoder(resp.Body).Decode(&response) 282 if err != nil { 283 return UserGroup{}, err 284 } 285 286 return response.UserGroup, nil 287 } 288 289 func (r UserGroupsService) Delete(userGroupID int) error { 290 url := fmt.Sprintf("/user_groups/%d", userGroupID) 291 292 resp, err := r.client.MakeRequest( 293 "DELETE", 294 url, 295 http.StatusNoContent, 296 nil, 297 ) 298 if err != nil { 299 return err 300 } 301 defer resp.Body.Close() 302 303 return nil 304 } 305 306 func (r UserGroupsService) AddMemberToGroup( 307 userGroupID int, 308 memberEmailAddress string, 309 admin bool, 310 ) (UserGroup, error) { 311 url := fmt.Sprintf("/user_groups/%d/add_member", userGroupID) 312 313 addRemoveMemberBody := addRemoveMemberBody{ 314 member{ 315 Email: memberEmailAddress, 316 Admin: admin, 317 }, 318 } 319 320 b, err := json.Marshal(addRemoveMemberBody) 321 if err != nil { 322 // Untested as we cannot force an error because we are marshalling 323 // a known-good body 324 return UserGroup{}, err 325 } 326 327 body := bytes.NewReader(b) 328 329 var response UpdateUserGroupResponse 330 resp, err := r.client.MakeRequest( 331 "PATCH", 332 url, 333 http.StatusOK, 334 body, 335 ) 336 if err != nil { 337 return UserGroup{}, err 338 } 339 defer resp.Body.Close() 340 341 err = json.NewDecoder(resp.Body).Decode(&response) 342 if err != nil { 343 return UserGroup{}, err 344 } 345 346 return response.UserGroup, nil 347 } 348 349 func (r UserGroupsService) RemoveMemberFromGroup(userGroupID int, memberEmailAddress string) (UserGroup, error) { 350 url := fmt.Sprintf("/user_groups/%d/remove_member", userGroupID) 351 352 addRemoveMemberBody := addRemoveMemberBody{ 353 member{ 354 Email: memberEmailAddress, 355 }, 356 } 357 358 b, err := json.Marshal(addRemoveMemberBody) 359 if err != nil { 360 // Untested as we cannot force an error because we are marshalling 361 // a known-good body 362 return UserGroup{}, err 363 } 364 365 body := bytes.NewReader(b) 366 367 var response UpdateUserGroupResponse 368 resp, err := r.client.MakeRequest( 369 "PATCH", 370 url, 371 http.StatusOK, 372 body, 373 ) 374 if err != nil { 375 return UserGroup{}, err 376 } 377 defer resp.Body.Close() 378 379 err = json.NewDecoder(resp.Body).Decode(&response) 380 if err != nil { 381 return UserGroup{}, err 382 } 383 384 return response.UserGroup, nil 385 }