@@ -23,6 +23,7 @@ import (
23
23
"golang.org/x/xerrors"
24
24
25
25
"github.com/coder/coder/v2/coderd/notifications/types"
26
+ "github.com/coder/coder/v2/coderd/prebuilds"
26
27
27
28
"github.com/coder/coder/v2/coderd/database"
28
29
"github.com/coder/coder/v2/coderd/database/dbtime"
@@ -154,6 +155,22 @@ func New() database.Store {
154
155
panic (xerrors .Errorf ("failed to create psk provisioner key: %w" , err ))
155
156
}
156
157
158
+ q .mutex .Lock ()
159
+ // We can't insert this user using the interface, because it's a system user.
160
+ q .data .users = append (q .data .users , database.User {
161
+ ID : prebuilds .SystemUserID ,
162
+ Email : "prebuilds@coder.com" ,
163
+ Username : "prebuilds" ,
164
+ CreatedAt : dbtime .Now (),
165
+ UpdatedAt : dbtime .Now (),
166
+ Status : "active" ,
167
+ LoginType : "none" ,
168
+ HashedPassword : []byte {},
169
+ IsSystem : true ,
170
+ Deleted : false ,
171
+ })
172
+ q .mutex .Unlock ()
173
+
157
174
return q
158
175
}
159
176
@@ -442,6 +459,7 @@ func convertUsers(users []database.User, count int64) []database.GetUsersRow {
442
459
Deleted : u .Deleted ,
443
460
LastSeenAt : u .LastSeenAt ,
444
461
Count : count ,
462
+ IsSystem : u .IsSystem ,
445
463
}
446
464
}
447
465
@@ -1554,11 +1572,16 @@ func (q *FakeQuerier) ActivityBumpWorkspace(ctx context.Context, arg database.Ac
1554
1572
return sql .ErrNoRows
1555
1573
}
1556
1574
1557
- func (q * FakeQuerier ) AllUserIDs (_ context.Context ) ([]uuid.UUID , error ) {
1575
+ // nolint:revive // It's not a control flag, it's a filter.
1576
+ func (q * FakeQuerier ) AllUserIDs (_ context.Context , includeSystem bool ) ([]uuid.UUID , error ) {
1558
1577
q .mutex .RLock ()
1559
1578
defer q .mutex .RUnlock ()
1560
1579
userIDs := make ([]uuid.UUID , 0 , len (q .users ))
1561
1580
for idx := range q .users {
1581
+ if ! includeSystem && q .users [idx ].IsSystem {
1582
+ continue
1583
+ }
1584
+
1562
1585
userIDs = append (userIDs , q .users [idx ].ID )
1563
1586
}
1564
1587
return userIDs , nil
@@ -2649,12 +2672,17 @@ func (q *FakeQuerier) GetAPIKeysLastUsedAfter(_ context.Context, after time.Time
2649
2672
return apiKeys , nil
2650
2673
}
2651
2674
2652
- func (q * FakeQuerier ) GetActiveUserCount (_ context.Context ) (int64 , error ) {
2675
+ // nolint:revive // It's not a control flag, it's a filter.
2676
+ func (q * FakeQuerier ) GetActiveUserCount (_ context.Context , includeSystem bool ) (int64 , error ) {
2653
2677
q .mutex .RLock ()
2654
2678
defer q .mutex .RUnlock ()
2655
2679
2656
2680
active := int64 (0 )
2657
2681
for _ , u := range q .users {
2682
+ if ! includeSystem && u .IsSystem {
2683
+ continue
2684
+ }
2685
+
2658
2686
if u .Status == database .UserStatusActive && ! u .Deleted {
2659
2687
active ++
2660
2688
}
@@ -3390,14 +3418,18 @@ func (q *FakeQuerier) GetGroupByOrgAndName(_ context.Context, arg database.GetGr
3390
3418
return database.Group {}, sql .ErrNoRows
3391
3419
}
3392
3420
3393
- func (q * FakeQuerier ) GetGroupMembers (ctx context.Context ) ([]database.GroupMember , error ) {
3421
+ //nolint:revive // It's not a control flag, its a filter
3422
+ func (q * FakeQuerier ) GetGroupMembers (ctx context.Context , includeSystem bool ) ([]database.GroupMember , error ) {
3394
3423
q .mutex .RLock ()
3395
3424
defer q .mutex .RUnlock ()
3396
3425
3397
3426
members := make ([]database.GroupMemberTable , 0 , len (q .groupMembers ))
3398
3427
members = append (members , q .groupMembers ... )
3399
3428
for _ , org := range q .organizations {
3400
3429
for _ , user := range q .users {
3430
+ if ! includeSystem && user .IsSystem {
3431
+ continue
3432
+ }
3401
3433
members = append (members , database.GroupMemberTable {
3402
3434
UserID : user .ID ,
3403
3435
GroupID : org .ID ,
@@ -3420,17 +3452,17 @@ func (q *FakeQuerier) GetGroupMembers(ctx context.Context) ([]database.GroupMemb
3420
3452
return groupMembers , nil
3421
3453
}
3422
3454
3423
- func (q * FakeQuerier ) GetGroupMembersByGroupID (ctx context.Context , id uuid. UUID ) ([]database.GroupMember , error ) {
3455
+ func (q * FakeQuerier ) GetGroupMembersByGroupID (ctx context.Context , arg database. GetGroupMembersByGroupIDParams ) ([]database.GroupMember , error ) {
3424
3456
q .mutex .RLock ()
3425
3457
defer q .mutex .RUnlock ()
3426
3458
3427
- if q .isEveryoneGroup (id ) {
3428
- return q .getEveryoneGroupMembersNoLock (ctx , id ), nil
3459
+ if q .isEveryoneGroup (arg . GroupID ) {
3460
+ return q .getEveryoneGroupMembersNoLock (ctx , arg . GroupID ), nil
3429
3461
}
3430
3462
3431
3463
var groupMembers []database.GroupMember
3432
3464
for _ , member := range q .groupMembers {
3433
- if member .GroupID == id {
3465
+ if member .GroupID == arg . GroupID {
3434
3466
groupMember , err := q .getGroupMemberNoLock (ctx , member .UserID , member .GroupID )
3435
3467
if errors .Is (err , errUserDeleted ) {
3436
3468
continue
@@ -3445,8 +3477,8 @@ func (q *FakeQuerier) GetGroupMembersByGroupID(ctx context.Context, id uuid.UUID
3445
3477
return groupMembers , nil
3446
3478
}
3447
3479
3448
- func (q * FakeQuerier ) GetGroupMembersCountByGroupID (ctx context.Context , groupID uuid. UUID ) (int64 , error ) {
3449
- users , err := q .GetGroupMembersByGroupID (ctx , groupID )
3480
+ func (q * FakeQuerier ) GetGroupMembersCountByGroupID (ctx context.Context , arg database. GetGroupMembersCountByGroupIDParams ) (int64 , error ) {
3481
+ users , err := q .GetGroupMembersByGroupID (ctx , database . GetGroupMembersByGroupIDParams ( arg ) )
3450
3482
if err != nil {
3451
3483
return 0 , err
3452
3484
}
@@ -6223,12 +6255,16 @@ func (q *FakeQuerier) GetUserByID(_ context.Context, id uuid.UUID) (database.Use
6223
6255
return q .getUserByIDNoLock (id )
6224
6256
}
6225
6257
6226
- func (q * FakeQuerier ) GetUserCount (_ context.Context ) (int64 , error ) {
6258
+ // nolint:revive // It's not a control flag, it's a filter.
6259
+ func (q * FakeQuerier ) GetUserCount (_ context.Context , includeSystem bool ) (int64 , error ) {
6227
6260
q .mutex .RLock ()
6228
6261
defer q .mutex .RUnlock ()
6229
6262
6230
6263
existing := int64 (0 )
6231
6264
for _ , u := range q .users {
6265
+ if ! includeSystem && u .IsSystem {
6266
+ continue
6267
+ }
6232
6268
if ! u .Deleted {
6233
6269
existing ++
6234
6270
}
@@ -6580,6 +6616,12 @@ func (q *FakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
6580
6616
users = usersFilteredByLastSeen
6581
6617
}
6582
6618
6619
+ if ! params .IncludeSystem {
6620
+ users = slices .DeleteFunc (users , func (u database.User ) bool {
6621
+ return u .IsSystem
6622
+ })
6623
+ }
6624
+
6583
6625
if params .GithubComUserID != 0 {
6584
6626
usersFilteredByGithubComUserID := make ([]database.User , 0 , len (users ))
6585
6627
for i , user := range users {
@@ -8933,6 +8975,7 @@ func (q *FakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParam
8933
8975
Status : status ,
8934
8976
RBACRoles : arg .RBACRoles ,
8935
8977
LoginType : arg .LoginType ,
8978
+ IsSystem : false ,
8936
8979
}
8937
8980
q .users = append (q .users , user )
8938
8981
sort .Slice (q .users , func (i , j int ) bool {
@@ -10091,7 +10134,7 @@ func (q *FakeQuerier) UpdateInactiveUsersToDormant(_ context.Context, params dat
10091
10134
10092
10135
var updated []database.UpdateInactiveUsersToDormantRow
10093
10136
for index , user := range q .users {
10094
- if user .Status == database .UserStatusActive && user .LastSeenAt .Before (params .LastSeenAfter ) {
10137
+ if user .Status == database .UserStatusActive && user .LastSeenAt .Before (params .LastSeenAfter ) && ! user . IsSystem {
10095
10138
q .users [index ].Status = database .UserStatusDormant
10096
10139
q .users [index ].UpdatedAt = params .UpdatedAt
10097
10140
updated = append (updated , database.UpdateInactiveUsersToDormantRow {
0 commit comments