Skip to content

Commit c0ff163

Browse files
committed
feat: support created_at filter for the GET /users endpoint
1 parent 576e1f4 commit c0ff163

File tree

8 files changed

+44
-4
lines changed

8 files changed

+44
-4
lines changed

coderd/database/dbmem/dbmem.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5648,6 +5648,16 @@ func (q *FakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
56485648
users = usersFilteredByRole
56495649
}
56505650

5651+
if !params.CreatedAt.IsZero() {
5652+
usersFilteredByCreatedAt := make([]database.User, 0, len(users))
5653+
for i, user := range users {
5654+
if user.CreatedAt.Equal(params.CreatedAt) {
5655+
usersFilteredByCreatedAt = append(usersFilteredByCreatedAt, users[i])
5656+
}
5657+
}
5658+
users = usersFilteredByCreatedAt
5659+
}
5660+
56515661
if !params.LastSeenBefore.IsZero() {
56525662
usersFilteredByLastSeen := make([]database.User, 0, len(users))
56535663
for i, user := range users {

coderd/database/modelqueries.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ func (q *sqlQuerier) GetAuthorizedUsers(ctx context.Context, arg GetUsersParams,
390390
pq.Array(arg.RbacRole),
391391
arg.LastSeenBefore,
392392
arg.LastSeenAfter,
393+
arg.CreatedAt,
393394
arg.OffsetOpt,
394395
arg.LimitOpt,
395396
)

coderd/database/queries.sql.go

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/users.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,12 @@ WHERE
199199
last_seen_at >= @last_seen_after
200200
ELSE true
201201
END
202+
-- Filter by created_at
203+
AND CASE
204+
WHEN @created_at :: timestamp with time zone != '0001-01-01 00:00:00Z' THEN
205+
DATE(created_at) = DATE(@created_at)
206+
ELSE true
207+
END
202208
-- End of filters
203209

204210
-- Authorize Filter clause will be injected below in GetAuthorizedUsers

coderd/searchquery/search.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func Users(query string) (database.GetUsersParams, []codersdk.ValidationError) {
7070
RbacRole: parser.Strings(values, []string{}, "role"),
7171
LastSeenAfter: parser.Time3339Nano(values, time.Time{}, "last_seen_after"),
7272
LastSeenBefore: parser.Time3339Nano(values, time.Time{}, "last_seen_before"),
73+
CreatedAt: parser.Time3339Nano(values, time.Time{}, "created_at"),
7374
}
7475
parser.ErrorExcessParams(values)
7576
return filter, parser.Errors

coderd/users.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ func (api *API) GetUsers(rw http.ResponseWriter, r *http.Request) ([]database.Us
317317
RbacRole: params.RbacRole,
318318
LastSeenBefore: params.LastSeenBefore,
319319
LastSeenAfter: params.LastSeenAfter,
320+
CreatedAt: params.CreatedAt,
320321
OffsetOpt: int32(paginationParams.Offset),
321322
LimitOpt: int32(paginationParams.Limit),
322323
})

coderd/users_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,7 @@ func TestUsersFilter(t *testing.T) {
14671467

14681468
firstUser, err := client.User(ctx, codersdk.Me)
14691469
require.NoError(t, err, "fetch me")
1470+
createdAt := firstUser.CreatedAt
14701471

14711472
// Noon on Jan 18 is the "now" for this test for last_seen timestamps.
14721473
// All these values are equal
@@ -1655,6 +1656,16 @@ func TestUsersFilter(t *testing.T) {
16551656
return u.LastSeenAt.Before(end) && u.LastSeenAt.After(start)
16561657
},
16571658
},
1659+
{
1660+
Name: "CreatedAt",
1661+
Filter: codersdk.UsersRequest{
1662+
SearchQuery: fmt.Sprintf(`created_at:%q`, createdAt.Format(time.RFC3339)),
1663+
},
1664+
FilterF: func(_ codersdk.UsersRequest, u codersdk.User) bool {
1665+
target := time.Date(2023, 1, 18, 12, 0, 0, 0, time.UTC)
1666+
return u.CreatedAt.Equal(target)
1667+
},
1668+
},
16581669
}
16591670

16601671
for _, c := range testCases {

docs/admin/users/index.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,9 @@ to use the Coder's filter query:
185185

186186
- To find active users, use the filter `status:active`.
187187
- To find admin users, use the filter `role:admin`.
188-
- To find users have not been active since July 2023:
188+
- To find users who have not been active since July 2023:
189189
`status:active last_seen_before:"2023-07-01T00:00:00Z"`
190+
- To find users created at January 18, 2023: `created_at:"2023-01-18T00:00:00Z"`
190191

191192
The following filters are supported:
192193

@@ -195,6 +196,7 @@ The following filters are supported:
195196
- `role` - Represents the role of the user. You can refer to the
196197
[TemplateRole documentation](https://pkg.go.dev/github.com/coder/coder/v2/codersdk#TemplateRole)
197198
for a list of supported user roles.
198-
- `last_seen_before` and `last_seen_after` - The last time a used has used the
199+
- `last_seen_before` and `last_seen_after` - The last time a user has used the
199200
platform (e.g. logging in, any API requests, connecting to workspaces). Uses
200201
the RFC3339Nano format.
202+
- `created_at` - The time a user was created. Uses the RFC3339Nano format.

0 commit comments

Comments
 (0)