Skip to content

Commit 15fec2b

Browse files
committed
logic
1 parent 4e787ec commit 15fec2b

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

coderd/database/migrations/000234_notifications_user_deleted.up.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
INSERT INTO notification_templates (id, name, title_template, body_template, "group", actions)
22
VALUES ('f44d9314-ad03-4bc8-95d0-5cad491da6b6', 'User account deleted', E'User account "{{.Labels.deleted_account_name}}" deleted',
3-
E'Hi {{.UserName}},\n\nUser account **{{.Labels.created_account_name}}** has been deleted.',
3+
E'Hi {{.UserName}},\n\nUser account **{{.Labels.deleted_account_name}}** has been deleted.',
44
'User Events', '[
55
{
66
"label": "View accounts",

coderd/notifications/events.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ var (
1717
// Account-related events.
1818
var (
1919
TemplateUserAccountCreated = uuid.MustParse("4e19c0ac-94e1-4532-9515-d1801aa283b2")
20+
TemplateUserAccountDeleted = uuid.MustParse("f44d9314-ad03-4bc8-95d0-5cad491da6b6")
2021
)

coderd/users.go

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,24 @@ func (api *API) deleteUser(rw http.ResponseWriter, r *http.Request) {
560560
}
561561
user.Deleted = true
562562
aReq.New = user
563+
564+
userAdmins, err := findUserAdmins(ctx, api.Database)
565+
if err != nil {
566+
api.Logger.Warn(ctx, "unable to fetch user admins", slog.Error(err))
567+
rw.WriteHeader(http.StatusNoContent)
568+
}
569+
570+
for _, u := range userAdmins {
571+
if _, err := api.NotificationsEnqueuer.Enqueue(ctx, u.ID, notifications.TemplateUserAccountCreated,
572+
map[string]string{
573+
"deleted_account_name": user.Username,
574+
}, "api-users-delete",
575+
user.ID,
576+
); err != nil {
577+
api.Logger.Warn(ctx, "unable to notify about deleted user", slog.F("deleted_user", user.Username), slog.Error(err))
578+
}
579+
}
580+
563581
rw.WriteHeader(http.StatusNoContent)
564582
}
565583

@@ -1280,23 +1298,12 @@ func (api *API) CreateUser(ctx context.Context, store database.Store, req Create
12801298
return user, req.OrganizationID, err
12811299
}
12821300

1283-
// Notify all users with user admin permission including owners
1284-
// Notice: we can't scrape the user information in parallel as pq
1285-
// fails with: unexpected describe rows response: 'D'
1286-
owners, err := store.GetUsers(ctx, database.GetUsersParams{
1287-
RbacRole: []string{codersdk.RoleOwner},
1288-
})
1301+
userAdmins, err := findUserAdmins(ctx, store)
12891302
if err != nil {
1290-
return user, req.OrganizationID, xerrors.Errorf("get owners: %w", err)
1291-
}
1292-
userAdmins, err := store.GetUsers(ctx, database.GetUsersParams{
1293-
RbacRole: []string{codersdk.RoleUserAdmin},
1294-
})
1295-
if err != nil {
1296-
return user, req.OrganizationID, xerrors.Errorf("get user admins: %w", err)
1303+
return user, req.OrganizationID, xerrors.Errorf("find user admins: %w", err)
12971304
}
12981305

1299-
for _, u := range append(owners, userAdmins...) {
1306+
for _, u := range userAdmins {
13001307
if _, err := api.NotificationsEnqueuer.Enqueue(ctx, u.ID, notifications.TemplateUserAccountCreated,
13011308
map[string]string{
13021309
"created_account_name": user.Username,
@@ -1309,6 +1316,25 @@ func (api *API) CreateUser(ctx context.Context, store database.Store, req Create
13091316
return user, req.OrganizationID, err
13101317
}
13111318

1319+
// findUserAdmins fetches all users with user admin permission including owners.
1320+
func findUserAdmins(ctx context.Context, store database.Store) ([]database.GetUsersRow, error) {
1321+
// Notice: we can't scrape the user information in parallel as pq
1322+
// fails with: unexpected describe rows response: 'D'
1323+
owners, err := store.GetUsers(ctx, database.GetUsersParams{
1324+
RbacRole: []string{codersdk.RoleOwner},
1325+
})
1326+
if err != nil {
1327+
return nil, xerrors.Errorf("get owners: %w", err)
1328+
}
1329+
userAdmins, err := store.GetUsers(ctx, database.GetUsersParams{
1330+
RbacRole: []string{codersdk.RoleUserAdmin},
1331+
})
1332+
if err != nil {
1333+
return nil, xerrors.Errorf("get user admins: %w", err)
1334+
}
1335+
return append(owners, userAdmins...), nil
1336+
}
1337+
13121338
func convertUsers(users []database.User, organizationIDsByUserID map[uuid.UUID][]uuid.UUID) []codersdk.User {
13131339
converted := make([]codersdk.User, 0, len(users))
13141340
for _, u := range users {

0 commit comments

Comments
 (0)