From bfa00ae6ac92d644576640971fb730d9f3a449f5 Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 16 Jun 2026 08:59:03 +0800 Subject: [PATCH] feat(push): validate push channels presence before enabling push event - Reject toggling an event to enabled in ToggleEvent handler if channels list is empty. - Add model-level validation in PushEvent.Validate() to prevent enabling events without channels during creation/updates. - Update TestPushRouters/toggle_event_status unit test to cover this verification. --- internal/apps/admin/push/push_test.go | 11 ++++++++++- internal/apps/admin/push/routers.go | 4 ++++ internal/model/push_event.go | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/internal/apps/admin/push/push_test.go b/internal/apps/admin/push/push_test.go index b47389cc..c3782e2f 100644 --- a/internal/apps/admin/push/push_test.go +++ b/internal/apps/admin/push/push_test.go @@ -363,11 +363,20 @@ func TestPushRouters(t *testing.T) { var event model.PushEvent dbConn.First(&event) + // 1. 未配置任何渠道时开启,应该被拒绝 req, _ := http.NewRequest("POST", "/api/v1/admin/push/events/"+strconv.FormatUint(event.ID, 10)+"/toggle", nil) w := httptest.NewRecorder() r.ServeHTTP(w, req) + assert.Equal(t, http.StatusBadRequest, w.Code) - assert.Equal(t, http.StatusOK, w.Code) + // 2. 为该事件关联渠道后,再切换开启,应当成功 + event.Channels = []string{"email"} + dbConn.Save(&event) + + req2, _ := http.NewRequest("POST", "/api/v1/admin/push/events/"+strconv.FormatUint(event.ID, 10)+"/toggle", nil) + w2 := httptest.NewRecorder() + r.ServeHTTP(w2, req2) + assert.Equal(t, http.StatusOK, w2.Code) var updated model.PushEvent dbConn.First(&updated) diff --git a/internal/apps/admin/push/routers.go b/internal/apps/admin/push/routers.go index 9c8a9a68..901f2077 100644 --- a/internal/apps/admin/push/routers.go +++ b/internal/apps/admin/push/routers.go @@ -351,6 +351,10 @@ func ToggleEvent(c *gin.Context) { } event.Enabled = !event.Enabled + if event.Enabled && len(event.Channels) == 0 { + c.JSON(http.StatusBadRequest, response.Err("cannot enable event without any push channels configured")) + return + } if err := db.DB(c.Request.Context()).Model(&event).Update("enabled", event.Enabled).Error; err != nil { c.JSON(http.StatusInternalServerError, response.Err(err.Error())) return diff --git a/internal/model/push_event.go b/internal/model/push_event.go index 680783ea..9f806c35 100644 --- a/internal/model/push_event.go +++ b/internal/model/push_event.go @@ -46,6 +46,9 @@ func (pe *PushEvent) Validate() error { if pe.Template == "" { return errors.New("event template is required") } + if pe.Enabled && len(pe.Channels) == 0 { + return errors.New("cannot enable event without any push channels configured") + } return nil }