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.
This commit is contained in:
ryan
2026-06-16 08:59:03 +08:00
parent 6a913701b9
commit bfa00ae6ac
3 changed files with 17 additions and 1 deletions
+10 -1
View File
@@ -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)
+4
View File
@@ -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
+3
View File
@@ -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
}