Skip to content

Commit dda3326

Browse files
authored
Merge pull request #50 from ConductorOne/jallers/fix-user-sync
Improve pagination when listing users
2 parents 66ee656 + 28ebb56 commit dda3326

File tree

4 files changed

+30
-15
lines changed

4 files changed

+30
-15
lines changed

pkg/connector/connector.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (d *Connector) Metadata(ctx context.Context) (*v2.ConnectorMetadata, error)
5353
// Validate is called to ensure that the connector is properly configured. It should exercise any API credentials
5454
// to be sure that they are valid.
5555
func (d *Connector) Validate(ctx context.Context) (annotations.Annotations, error) {
56-
users, _, err := d.Client.ListUsers(ctx, 0, 1)
56+
users, _, err := d.Client.ListUsers(ctx, "", 1)
5757
if err != nil {
5858
return nil, err
5959
}

pkg/connector/pagination.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ func parseOffsetFromToken(i string, resourceID *v2.ResourceId) (*pagination.Bag,
3030
return b, offset, nil
3131
}
3232

33+
func parseCursorFromToken(i string, resourceID *v2.ResourceId) (*pagination.Bag, string, error) {
34+
b := &pagination.Bag{}
35+
err := b.Unmarshal(i)
36+
if err != nil {
37+
return nil, "", err
38+
}
39+
40+
if b.Current() == nil {
41+
b.Push(pagination.PageState{
42+
ResourceTypeID: resourceID.ResourceType,
43+
ResourceID: resourceID.Resource,
44+
})
45+
}
46+
47+
return b, b.PageToken(), nil
48+
}
49+
3350
func convertPageToken(token string) (int, error) {
3451
if token == "" {
3552
return 0, nil

pkg/connector/users.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ func getUserDetailedStatus(user *snowflake.User) string {
9797
// List returns all the users from the database as resource objects.
9898
// Users include a UserTrait because they are the 'shape' of a standard user.
9999
func (o *userBuilder) List(ctx context.Context, parentResourceID *v2.ResourceId, pToken *pagination.Token) ([]*v2.Resource, string, annotations.Annotations, error) {
100-
bag, offset, err := parseOffsetFromToken(pToken.Token, &v2.ResourceId{ResourceType: o.resourceType.Id})
100+
bag, cursor, err := parseCursorFromToken(pToken.Token, &v2.ResourceId{ResourceType: o.resourceType.Id})
101101
if err != nil {
102-
return nil, "", nil, wrapError(err, "failed to get next page offset")
102+
return nil, "", nil, wrapError(err, "failed to get next page cursor")
103103
}
104104

105-
users, _, err := o.client.ListUsers(ctx, offset, resourcePageSize)
105+
users, _, err := o.client.ListUsers(ctx, cursor, resourcePageSize)
106106
if err != nil {
107107
return nil, "", nil, wrapError(err, "failed to list users")
108108
}
@@ -125,12 +125,12 @@ func (o *userBuilder) List(ctx context.Context, parentResourceID *v2.ResourceId,
125125
return resources, "", nil, nil
126126
}
127127

128-
nextPage, err := handleNextPage(bag, offset+resourcePageSize)
128+
nextCursor, err := bag.NextToken(users[len(users)-1].Username)
129129
if err != nil {
130130
return nil, "", nil, wrapError(err, "failed to create next page cursor")
131131
}
132132

133-
return resources, nextPage, nil, nil
133+
return resources, nextCursor, nil, nil
134134
}
135135

136136
// Entitlements always returns an empty slice for users.

pkg/snowflake/user.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,12 @@ func (r *GetUserRawResponse) GetValueByColumnName(columnName string) (string, bo
181181
return "", false
182182
}
183183

184-
func (c *Client) ListUsers(ctx context.Context, offset, limit int) ([]User, *http.Response, error) {
185-
queries := []string{
186-
"SHOW USERS;",
187-
c.paginateLastQuery(offset, limit),
184+
func (c *Client) ListUsers(ctx context.Context, cursor string, limit int) ([]User, *http.Response, error) {
185+
queries := []string{}
186+
if cursor != "" {
187+
queries = append(queries, fmt.Sprintf("SHOW USERS LIMIT %d FROM '%s';", limit, cursor))
188+
} else {
189+
queries = append(queries, fmt.Sprintf("SHOW USERS LIMIT %d;", limit))
188190
}
189191

190192
req, err := c.PostStatementRequest(ctx, queries)
@@ -198,11 +200,7 @@ func (c *Client) ListUsers(ctx context.Context, offset, limit int) ([]User, *htt
198200
return nil, resp, err
199201
}
200202

201-
if len(response.StatementHandles) < 2 {
202-
return nil, resp, nil
203-
}
204-
205-
req, err = c.GetStatementResponse(ctx, response.StatementHandles[1])
203+
req, err = c.GetStatementResponse(ctx, response.StatementHandle)
206204
if err != nil {
207205
return nil, resp, err
208206
}

0 commit comments

Comments
 (0)