This repository has been archived by the owner on Mar 24, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
all_users.go
82 lines (66 loc) · 1.81 KB
/
all_users.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package uaa
import (
"encoding/json"
"fmt"
"net/url"
)
type AllUsersInterface interface {
AllUsers() ([]User, error)
}
func AllUsers(u UAA) ([]User, error) {
var users []User
var totalResults int
var err error
bareUsersURL := u.uaaURL + "/Users"
users, totalResults, err = PaginatedUsersFromQuery(u, bareUsersURL)
if err != nil {
return users, err
}
for ThereAreMorePages(users, totalResults) {
var moreUsers []User
nextStartIndex := len(users) + 1
moreUsers, totalResults, err = PaginatedUsersFromQuery(u, UsersQueryURIFromStartIndex(u.uaaURL, nextStartIndex))
if err != nil {
return users, err
}
users = append(users, moreUsers...)
}
return users, nil
}
func PaginatedUsersFromQuery(u UAA, uriString string) ([]User, int, error) {
users := []User{}
uri, err := url.Parse(uriString)
if err != nil {
return []User{}, 0, err
}
host := uri.Scheme + "://" + uri.Host
client := NewClient(host, u.VerifySSL).WithAuthorizationToken(u.AccessToken)
code, body, err := client.MakeRequest("GET", uri.RequestURI(), nil)
if err != nil {
return users, 0, err
}
if code > 399 {
return users, 0, NewFailure(code, body)
}
var response map[string]interface{}
err = json.Unmarshal(body, &response)
if err != nil {
return users, 0, err
}
resources := response["resources"].([]interface{})
for _, resource := range resources {
user, err := UserFromResource(resource.(map[string]interface{}))
if err != nil {
return users, 0, err
}
users = append(users, user)
}
totalResults := int(response["totalResults"].(float64))
return users, totalResults, nil
}
func UsersQueryURIFromStartIndex(host string, startIndex int) string {
return fmt.Sprintf("%s/Users?startIndex=%d", host, startIndex)
}
func ThereAreMorePages(users []User, totalResults int) bool {
return (len(users) < totalResults)
}