Skip to content

Commit 449c595

Browse files
committed
impl GetUsers github user id filter
1 parent 2e96d64 commit 449c595

File tree

5 files changed

+70
-17
lines changed

5 files changed

+70
-17
lines changed

coderd/database/dbmem/dbmem.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6577,6 +6577,16 @@ func (q *FakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
65776577
users = usersFilteredByLastSeen
65786578
}
65796579

6580+
if params.GithubComUserID != 0 {
6581+
usersFilteredByGithubComUserID := make([]database.User, 0, len(users))
6582+
for i, user := range users {
6583+
if user.GithubComUserID.Int64 == params.GithubComUserID {
6584+
usersFilteredByGithubComUserID = append(usersFilteredByGithubComUserID, users[i])
6585+
}
6586+
}
6587+
users = usersFilteredByGithubComUserID
6588+
}
6589+
65806590
beforePageCount := len(users)
65816591

65826592
if params.OffsetOpt > 0 {

coderd/httpapi/queryparams.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,19 @@ func (p *QueryParamParser) Int(vals url.Values, def int, queryParam string) int
8282
return v
8383
}
8484

85+
func (p *QueryParamParser) Int64(vals url.Values, def int64, queryParam string) int64 {
86+
v, err := parseQueryParam(p, vals, func(v string) (int64, error) {
87+
return strconv.ParseInt(v, 10, 64)
88+
}, def, queryParam)
89+
if err != nil {
90+
p.Errors = append(p.Errors, codersdk.ValidationError{
91+
Field: queryParam,
92+
Detail: fmt.Sprintf("Query param %q must be a valid 64-bit integer: %s", queryParam, err.Error()),
93+
})
94+
}
95+
return v
96+
}
97+
8598
// PositiveInt32 function checks if the given value is 32-bit and positive.
8699
//
87100
// We can't use `uint32` as the value must be within the range <0,2147483647>

coderd/searchquery/search.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,14 @@ func Users(query string) (database.GetUsersParams, []codersdk.ValidationError) {
8080

8181
parser := httpapi.NewQueryParamParser()
8282
filter := database.GetUsersParams{
83-
Search: parser.String(values, "", "search"),
84-
Status: httpapi.ParseCustomList(parser, values, []database.UserStatus{}, "status", httpapi.ParseEnum[database.UserStatus]),
85-
RbacRole: parser.Strings(values, []string{}, "role"),
86-
LastSeenAfter: parser.Time3339Nano(values, time.Time{}, "last_seen_after"),
87-
LastSeenBefore: parser.Time3339Nano(values, time.Time{}, "last_seen_before"),
88-
CreatedAfter: parser.Time3339Nano(values, time.Time{}, "created_after"),
89-
CreatedBefore: parser.Time3339Nano(values, time.Time{}, "created_before"),
83+
Search: parser.String(values, "", "search"),
84+
Status: httpapi.ParseCustomList(parser, values, []database.UserStatus{}, "status", httpapi.ParseEnum[database.UserStatus]),
85+
RbacRole: parser.Strings(values, []string{}, "role"),
86+
LastSeenAfter: parser.Time3339Nano(values, time.Time{}, "last_seen_after"),
87+
LastSeenBefore: parser.Time3339Nano(values, time.Time{}, "last_seen_before"),
88+
CreatedAfter: parser.Time3339Nano(values, time.Time{}, "created_after"),
89+
CreatedBefore: parser.Time3339Nano(values, time.Time{}, "created_before"),
90+
GithubComUserID: parser.Int64(values, 0, "github_com_user_id"),
9091
}
9192
parser.ErrorExcessParams(values)
9293
return filter, parser.Errors

coderd/users.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,16 +297,17 @@ func (api *API) GetUsers(rw http.ResponseWriter, r *http.Request) ([]database.Us
297297
}
298298

299299
userRows, err := api.Database.GetUsers(ctx, database.GetUsersParams{
300-
AfterID: paginationParams.AfterID,
301-
Search: params.Search,
302-
Status: params.Status,
303-
RbacRole: params.RbacRole,
304-
LastSeenBefore: params.LastSeenBefore,
305-
LastSeenAfter: params.LastSeenAfter,
306-
CreatedAfter: params.CreatedAfter,
307-
CreatedBefore: params.CreatedBefore,
308-
OffsetOpt: int32(paginationParams.Offset),
309-
LimitOpt: int32(paginationParams.Limit),
300+
AfterID: paginationParams.AfterID,
301+
Search: params.Search,
302+
Status: params.Status,
303+
RbacRole: params.RbacRole,
304+
LastSeenBefore: params.LastSeenBefore,
305+
LastSeenAfter: params.LastSeenAfter,
306+
CreatedAfter: params.CreatedAfter,
307+
CreatedBefore: params.CreatedBefore,
308+
GithubComUserID: params.GithubComUserID,
309+
OffsetOpt: int32(paginationParams.Offset),
310+
LimitOpt: int32(paginationParams.Limit),
310311
})
311312
if err != nil {
312313
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{

coderd/users_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package coderd_test
22

33
import (
44
"context"
5+
"database/sql"
56
"fmt"
67
"net/http"
78
"slices"
@@ -1873,6 +1874,33 @@ func TestGetUsers(t *testing.T) {
18731874
require.NoError(t, err)
18741875
require.ElementsMatch(t, active, res.Users)
18751876
})
1877+
t.Run("GithubComUserID", func(t *testing.T) {
1878+
t.Parallel()
1879+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1880+
defer cancel()
1881+
1882+
client, db := coderdtest.NewWithDatabase(t, nil)
1883+
first := coderdtest.CreateFirstUser(t, client)
1884+
_ = dbgen.User(t, db, database.User{
1885+
Email: "test2@coder.com",
1886+
Username: "test2",
1887+
})
1888+
// nolint:gocritic // Unit test
1889+
err := db.UpdateUserGithubComUserID(dbauthz.AsSystemRestricted(ctx), database.UpdateUserGithubComUserIDParams{
1890+
ID: first.UserID,
1891+
GithubComUserID: sql.NullInt64{
1892+
Int64: 123,
1893+
Valid: true,
1894+
},
1895+
})
1896+
require.NoError(t, err)
1897+
res, err := client.Users(ctx, codersdk.UsersRequest{
1898+
SearchQuery: "github_com_user_id:123",
1899+
})
1900+
require.NoError(t, err)
1901+
require.Len(t, res.Users, 1)
1902+
require.Equal(t, res.Users[0].ID, first.UserID)
1903+
})
18761904
}
18771905

18781906
func TestGetUsersPagination(t *testing.T) {

0 commit comments

Comments
 (0)