/
server_roles_list.go
106 lines (99 loc) · 2.64 KB
/
server_roles_list.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package iamspanner
import (
"context"
"sort"
"cloud.google.com/go/iam/admin/apiv1/adminpb"
"go.einride.tech/aip/pagination"
"go.einride.tech/aip/validation"
"google.golang.org/protobuf/proto"
)
// ListRoles implements adminpb.IAMServer.
func (s *IAMServer) ListRoles(
ctx context.Context,
request *adminpb.ListRolesRequest,
) (*adminpb.ListRolesResponse, error) {
var parsedRequest listRolesRequest
if err := parsedRequest.parse(request); err != nil {
return nil, err
}
return s.listRoles(ctx, &parsedRequest)
}
func (s *IAMServer) listRoles(
_ context.Context,
request *listRolesRequest,
) (*adminpb.ListRolesResponse, error) {
roles := make([]*adminpb.Role, 0, s.roles.Count())
s.roles.RangeRoles(func(role *adminpb.Role) bool {
roles = append(roles, role)
return true
})
sort.Slice(roles, func(i, j int) bool {
return roles[i].Name < roles[j].Name
})
response := adminpb.ListRolesResponse{
Roles: make([]*adminpb.Role, 0, request.pageSize),
}
from := int(request.pageToken.Offset)
to := int(request.pageToken.Offset) + int(request.pageSize)
if to >= len(roles) {
to = len(roles)
} else {
response.NextPageToken = request.nextPageToken()
}
for _, role := range roles[from:to] {
switch request.view {
case adminpb.RoleView_FULL:
response.Roles = append(response.Roles, role)
default:
clone := proto.Clone(role).(*adminpb.Role)
clone.IncludedPermissions = nil
response.Roles = append(response.Roles, clone)
}
}
return &response, nil
}
type listRolesRequest struct {
pageSize int32
pageToken pagination.PageToken
view adminpb.RoleView
request *adminpb.ListRolesRequest
}
func (r *listRolesRequest) parse(request *adminpb.ListRolesRequest) error {
const (
defaultPageSize = 300
maxPageSize = 1_000
)
var v validation.MessageValidator
r.request = request
// parent = 1
if request.Parent != "" {
v.AddFieldViolation("parent", "unsupported field")
}
// page_size = 2
switch {
case request.PageSize < 0:
v.AddFieldViolation("page_size", "must be >= 0")
case request.PageSize == 0:
r.pageSize = defaultPageSize
case request.PageSize > maxPageSize:
r.pageSize = maxPageSize
default:
r.pageSize = request.PageSize
}
// page_token = 3
pageToken, err := pagination.ParsePageToken(request)
if err != nil {
v.AddFieldViolation("page_token", "invalid format")
}
r.pageToken = pageToken
switch request.View {
case adminpb.RoleView_BASIC, adminpb.RoleView_FULL:
r.view = request.View
default:
v.AddFieldViolation("view", "unsupported value: %d", request.View.Number())
}
return v.Err()
}
func (r *listRolesRequest) nextPageToken() string {
return r.pageToken.Next(r.request).String()
}