feat(notification-settings): align chatwoot payloads

This commit is contained in:
2026-06-06 02:55:51 +08:00
parent d49aafd2c3
commit 4b2c1a97ae
5 changed files with 62 additions and 22 deletions
@@ -55,9 +55,7 @@ func (h *NotificationSettingHandler) Show(c *gin.Context) {
return
}
response.OK(c, gin.H{
"notification_setting": serializeNotificationSetting(ns),
})
c.JSON(http.StatusOK, serializeNotificationSetting(ns))
}
// Update modifies notification settings for the current user in the account.
@@ -89,21 +87,19 @@ func (h *NotificationSettingHandler) Update(c *gin.Context) {
return
}
response.OK(c, gin.H{
"notification_setting": serializeNotificationSetting(ns),
})
c.JSON(http.StatusOK, serializeNotificationSetting(ns))
}
// serializeNotificationSetting builds the response object matching Chatwoot Jbuilder show.json.jbuilder:
// id, user_id, account_id, all_email_flags, selected_email_flags, all_push_flags, selected_push_flags
func serializeNotificationSetting(ns *model.NotificationSetting) gin.H {
return gin.H{
"id": ns.ID,
"user_id": ns.UserID,
"account_id": ns.AccountID,
"all_email_flags": model.AllEmailFlagNames(),
"id": ns.ID,
"user_id": ns.UserID,
"account_id": ns.AccountID,
"all_email_flags": model.AllEmailFlagNames(),
"selected_email_flags": ns.SelectedEmailFlagNames(),
"all_push_flags": model.AllPushFlagNames(),
"selected_push_flags": ns.SelectedPushFlagNames(),
"all_push_flags": model.AllPushFlagNames(),
"selected_push_flags": ns.SelectedPushFlagNames(),
}
}
}
@@ -2,6 +2,7 @@ package v1
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
@@ -70,7 +71,7 @@ func (s *NotificationSettingHandlerTestSuite) TestShow_BadRequest_InvalidAccount
func (s *NotificationSettingHandlerTestSuite) TestShow_Success() {
r := gin.New()
r.GET("/api/v1/accounts/:account_id/notification_settings", func(c *gin.Context) {
c.Set("user_id", float64(1))
c.Set("user_id", float64(11))
s.handler.Show(c)
})
@@ -79,6 +80,16 @@ func (s *NotificationSettingHandlerTestSuite) TestShow_Success() {
r.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusOK, w.Code)
var body map[string]interface{}
s.Require().NoError(json.Unmarshal(w.Body.Bytes(), &body))
assert.NotContains(s.T(), body, "success")
assert.NotContains(s.T(), body, "data")
assert.NotContains(s.T(), body, "notification_setting")
assert.Equal(s.T(), float64(s.account.ID), body["account_id"])
assert.Equal(s.T(), float64(11), body["user_id"])
s.Require().Contains(body, "all_email_flags")
s.Require().Contains(body, "selected_email_flags")
}
func (s *NotificationSettingHandlerTestSuite) TestUpdate_BadRequest_InvalidAccountID() {
@@ -94,4 +105,29 @@ func (s *NotificationSettingHandlerTestSuite) TestUpdate_BadRequest_InvalidAccou
r.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusBadRequest, w.Code)
}
}
func (s *NotificationSettingHandlerTestSuite) TestUpdate_ReturnsRawChatwootPayload() {
r := gin.New()
r.PATCH("/api/v1/accounts/:account_id/notification_settings", func(c *gin.Context) {
c.Set("user_id", float64(12))
s.handler.Update(c)
})
body := `{"notification_settings":{"selected_email_flags":["email_conversation_assignment"],"selected_push_flags":["push_conversation_mention"]}}`
w := httptest.NewRecorder()
req, _ := http.NewRequest("PATCH", fmt.Sprintf("/api/v1/accounts/%d/notification_settings", s.account.ID), bytes.NewBufferString(body))
req.Header.Set("Content-Type", "application/json")
r.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusOK, w.Code)
var data map[string]interface{}
s.Require().NoError(json.Unmarshal(w.Body.Bytes(), &data))
assert.NotContains(s.T(), data, "success")
assert.NotContains(s.T(), data, "data")
assert.NotContains(s.T(), data, "notification_setting")
assert.Equal(s.T(), float64(s.account.ID), data["account_id"])
assert.Equal(s.T(), float64(12), data["user_id"])
assert.Equal(s.T(), []interface{}{"email_conversation_assignment"}, data["selected_email_flags"])
assert.Equal(s.T(), []interface{}{"push_conversation_mention"}, data["selected_push_flags"])
}