diff --git a/README.md b/README.md index 09cd0e1..d1d650a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Go client for the [Notion API](https://developers.notion.com/reference). ### Users - [x] [Retrieve a user](client.go) -- [ ] List all users +- [x] [List all users](client.go) ### Search diff --git a/block.go b/block.go index c8e3a99..97275c2 100644 --- a/block.go +++ b/block.go @@ -56,7 +56,7 @@ const ( BlockTypeUnsupported BlockType = "unsupported" ) -type FindBlockChildrenQuery struct { +type PaginationQuery struct { StartCursor string PageSize int } diff --git a/client.go b/client.go index a732115..2fac324 100644 --- a/client.go +++ b/client.go @@ -225,7 +225,7 @@ func (c *Client) UpdatePageProps(ctx context.Context, pageID string, params Upda // FindBlockChildrenByID returns a list of block children for a given block ID. // See: https://developers.notion.com/reference/post-database-query -func (c *Client) FindBlockChildrenByID(ctx context.Context, blockID string, query *FindBlockChildrenQuery) (result BlockChildrenResponse, err error) { +func (c *Client) FindBlockChildrenByID(ctx context.Context, blockID string, query *PaginationQuery) (result BlockChildrenResponse, err error) { req, err := c.newRequest(ctx, http.MethodGet, fmt.Sprintf("/blocks/%v/children", blockID), nil) if err != nil { return BlockChildrenResponse{}, fmt.Errorf("notion: invalid request: %w", err) @@ -323,3 +323,40 @@ func (c *Client) FindUserByID(ctx context.Context, id string) (user User, err er return user, nil } + +// ListUsers returns a list of all users, and pagination metadata. +// See: https://developers.notion.com/reference/get-users +func (c *Client) ListUsers(ctx context.Context, query *PaginationQuery) (result ListUsersResponse, err error) { + req, err := c.newRequest(ctx, http.MethodGet, "/users", nil) + if err != nil { + return ListUsersResponse{}, fmt.Errorf("notion: invalid request: %w", err) + } + + if query != nil { + q := url.Values{} + if query.StartCursor != "" { + q.Set("start_cursor", query.StartCursor) + } + if query.PageSize != 0 { + q.Set("page_size", strconv.Itoa(query.PageSize)) + } + req.URL.RawQuery = q.Encode() + } + + res, err := c.httpClient.Do(req) + if err != nil { + return ListUsersResponse{}, fmt.Errorf("notion: failed to make HTTP request: %w", err) + } + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + return ListUsersResponse{}, fmt.Errorf("notion: failed to list users: %w", parseErrorResponse(res)) + } + + err = json.NewDecoder(res.Body).Decode(&result) + if err != nil { + return ListUsersResponse{}, fmt.Errorf("notion: failed to parse HTTP response: %w", err) + } + + return result, nil +} diff --git a/user.go b/user.go index ff34c4c..bc31f0a 100644 --- a/user.go +++ b/user.go @@ -15,3 +15,10 @@ type User struct { Person *Person `json:"person"` Bot *Bot `json:"bot"` } + +// ListUsersResponse contains results (users) and pagination data returned from a list request. +type ListUsersResponse struct { + Results []User `json:"results"` + HasMore bool `json:"has_more"` + NextCursor *string `json:"next_cursor"` +}