Skip to content

Commit a131bc3

Browse files
committed
perf: use a single query for notification target lookups
1 parent b90c74a commit a131bc3

File tree

3 files changed

+41
-42
lines changed

3 files changed

+41
-42
lines changed

coderd/templates.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,19 +1130,11 @@ func (api *API) convertTemplate(
11301130

11311131
// findTemplateAdmins fetches all users with template admin permission including owners.
11321132
func findTemplateAdmins(ctx context.Context, store database.Store) ([]database.GetUsersRow, error) {
1133-
// Notice: we can't scrape the user information in parallel as pq
1134-
// fails with: unexpected describe rows response: 'D'
1135-
owners, err := store.GetUsers(ctx, database.GetUsersParams{
1136-
RbacRole: []string{codersdk.RoleOwner},
1137-
})
1138-
if err != nil {
1139-
return nil, xerrors.Errorf("get owners: %w", err)
1140-
}
11411133
templateAdmins, err := store.GetUsers(ctx, database.GetUsersParams{
1142-
RbacRole: []string{codersdk.RoleTemplateAdmin},
1134+
RbacRole: []string{codersdk.RoleTemplateAdmin, codersdk.RoleOwner},
11431135
})
11441136
if err != nil {
1145-
return nil, xerrors.Errorf("get template admins: %w", err)
1137+
return nil, xerrors.Errorf("get owners: %w", err)
11461138
}
1147-
return append(owners, templateAdmins...), nil
1139+
return templateAdmins, nil
11481140
}

coderd/users.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,21 +1537,13 @@ func (api *API) CreateUser(ctx context.Context, store database.Store, req Create
15371537

15381538
// findUserAdmins fetches all users with user admin permission including owners.
15391539
func findUserAdmins(ctx context.Context, store database.Store) ([]database.GetUsersRow, error) {
1540-
// Notice: we can't scrape the user information in parallel as pq
1541-
// fails with: unexpected describe rows response: 'D'
1542-
owners, err := store.GetUsers(ctx, database.GetUsersParams{
1543-
RbacRole: []string{codersdk.RoleOwner},
1544-
})
1545-
if err != nil {
1546-
return nil, xerrors.Errorf("get owners: %w", err)
1547-
}
15481540
userAdmins, err := store.GetUsers(ctx, database.GetUsersParams{
1549-
RbacRole: []string{codersdk.RoleUserAdmin},
1541+
RbacRole: []string{codersdk.RoleOwner, codersdk.RoleUserAdmin},
15501542
})
15511543
if err != nil {
1552-
return nil, xerrors.Errorf("get user admins: %w", err)
1544+
return nil, xerrors.Errorf("get owners: %w", err)
15531545
}
1554-
return append(owners, userAdmins...), nil
1546+
return userAdmins, nil
15551547
}
15561548

15571549
func convertUsers(users []database.User, organizationIDsByUserID map[uuid.UUID][]uuid.UUID) []codersdk.User {

coderd/users_test.go

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -604,16 +604,22 @@ func TestNotifyDeletedUser(t *testing.T) {
604604
// sent[2]: "Member" account created, "user admin" notified
605605

606606
// "Member" account deleted, "owner" notified
607-
require.Equal(t, notifications.TemplateUserAccountDeleted, sent[3].TemplateID)
608-
require.Equal(t, firstUser.UserID, sent[3].UserID)
609-
require.Contains(t, sent[3].Targets, member.ID)
610-
require.Equal(t, member.Username, sent[3].Labels["deleted_account_name"])
607+
ownerNotifications := notifyEnq.Sent(func(n *notificationstest.FakeNotification) bool {
608+
return n.TemplateID == notifications.TemplateUserAccountDeleted &&
609+
n.UserID == firstUser.UserID &&
610+
slices.Contains(n.Targets, member.ID) &&
611+
n.Labels["deleted_account_name"] == member.Username
612+
})
613+
require.Len(t, ownerNotifications, 1)
611614

612615
// "Member" account deleted, "user admin" notified
613-
require.Equal(t, notifications.TemplateUserAccountDeleted, sent[4].TemplateID)
614-
require.Equal(t, userAdmin.ID, sent[4].UserID)
615-
require.Contains(t, sent[4].Targets, member.ID)
616-
require.Equal(t, member.Username, sent[4].Labels["deleted_account_name"])
616+
adminNotifications := notifyEnq.Sent(func(n *notificationstest.FakeNotification) bool {
617+
return n.TemplateID == notifications.TemplateUserAccountDeleted &&
618+
n.UserID == userAdmin.ID &&
619+
slices.Contains(n.Targets, member.ID) &&
620+
n.Labels["deleted_account_name"] == member.Username
621+
})
622+
require.Len(t, adminNotifications, 1)
617623
})
618624
}
619625

@@ -960,22 +966,31 @@ func TestNotifyCreatedUser(t *testing.T) {
960966
require.Len(t, sent, 3)
961967

962968
// "User admin" account created, "owner" notified
963-
require.Equal(t, notifications.TemplateUserAccountCreated, sent[0].TemplateID)
964-
require.Equal(t, firstUser.UserID, sent[0].UserID)
965-
require.Contains(t, sent[0].Targets, userAdmin.ID)
966-
require.Equal(t, userAdmin.Username, sent[0].Labels["created_account_name"])
969+
ownerNotifiedAboutUserAdmin := notifyEnq.Sent(func(n *notificationstest.FakeNotification) bool {
970+
return n.TemplateID == notifications.TemplateUserAccountCreated &&
971+
n.UserID == firstUser.UserID &&
972+
slices.Contains(n.Targets, userAdmin.ID) &&
973+
n.Labels["created_account_name"] == userAdmin.Username
974+
})
975+
require.Len(t, ownerNotifiedAboutUserAdmin, 1)
967976

968977
// "Member" account created, "owner" notified
969-
require.Equal(t, notifications.TemplateUserAccountCreated, sent[1].TemplateID)
970-
require.Equal(t, firstUser.UserID, sent[1].UserID)
971-
require.Contains(t, sent[1].Targets, member.ID)
972-
require.Equal(t, member.Username, sent[1].Labels["created_account_name"])
978+
ownerNotifiedAboutMember := notifyEnq.Sent(func(n *notificationstest.FakeNotification) bool {
979+
return n.TemplateID == notifications.TemplateUserAccountCreated &&
980+
n.UserID == firstUser.UserID &&
981+
slices.Contains(n.Targets, member.ID) &&
982+
n.Labels["created_account_name"] == member.Username
983+
})
984+
require.Len(t, ownerNotifiedAboutMember, 1)
973985

974986
// "Member" account created, "user admin" notified
975-
require.Equal(t, notifications.TemplateUserAccountCreated, sent[1].TemplateID)
976-
require.Equal(t, userAdmin.ID, sent[2].UserID)
977-
require.Contains(t, sent[2].Targets, member.ID)
978-
require.Equal(t, member.Username, sent[2].Labels["created_account_name"])
987+
userAdminNotifiedAboutMember := notifyEnq.Sent(func(n *notificationstest.FakeNotification) bool {
988+
return n.TemplateID == notifications.TemplateUserAccountCreated &&
989+
n.UserID == userAdmin.ID &&
990+
slices.Contains(n.Targets, member.ID) &&
991+
n.Labels["created_account_name"] == member.Username
992+
})
993+
require.Len(t, userAdminNotifiedAboutMember, 1)
979994
})
980995
}
981996

0 commit comments

Comments
 (0)