chore: disallow inbox as default method (#17093)

Disallow setting `inbox` as the default notifications method.
This commit is contained in:
Danielle Maywood
2025-03-25 20:10:15 +00:00
committed by GitHub
parent cf10d98aab
commit c131d01cfd
2 changed files with 28 additions and 2 deletions

View File

@ -3,6 +3,7 @@ package notifications
import (
"context"
"encoding/json"
"fmt"
"slices"
"strings"
"text/template"
@ -25,6 +26,14 @@ var (
ErrDuplicate = xerrors.New("duplicate notification")
)
type InvalidDefaultNotificationMethodError struct {
Method string
}
func (e InvalidDefaultNotificationMethodError) Error() string {
return fmt.Sprintf("given default notification method %q is invalid", e.Method)
}
type StoreEnqueuer struct {
store Store
log slog.Logger
@ -43,8 +52,13 @@ type StoreEnqueuer struct {
// NewStoreEnqueuer creates an Enqueuer implementation which can persist notification messages in the store.
func NewStoreEnqueuer(cfg codersdk.NotificationsConfig, store Store, helpers template.FuncMap, log slog.Logger, clock quartz.Clock) (*StoreEnqueuer, error) {
var method database.NotificationMethod
if err := method.Scan(cfg.Method.String()); err != nil {
return nil, xerrors.Errorf("given notification method %q is invalid", cfg.Method)
// TODO(DanielleMaywood):
// Currently we do not want to allow setting `inbox` as the default notification method.
// As of 2025-03-25, setting this to `inbox` would cause a crash on the deployment
// notification settings page. Until we make a future decision on this we want to disallow
// setting it.
if err := method.Scan(cfg.Method.String()); err != nil || method == database.NotificationMethodInbox {
return nil, InvalidDefaultNotificationMethodError{Method: cfg.Method.String()}
}
return &StoreEnqueuer{

View File

@ -1856,6 +1856,18 @@ func TestNotificationDuplicates(t *testing.T) {
require.NoError(t, err)
}
func TestNotificationMethodCannotDefaultToInbox(t *testing.T) {
t.Parallel()
store, _ := dbtestutil.NewDB(t)
logger := testutil.Logger(t)
cfg := defaultNotificationsConfig(database.NotificationMethodInbox)
_, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewMock(t))
require.ErrorIs(t, err, notifications.InvalidDefaultNotificationMethodError{Method: string(database.NotificationMethodInbox)})
}
func TestNotificationTargetMatrix(t *testing.T) {
t.Parallel()