feat(conversations): align typing events

This commit is contained in:
2026-06-07 11:43:59 +08:00
parent 5ae2d7fec9
commit 83878eb606
6 changed files with 130 additions and 46 deletions
@@ -890,18 +890,21 @@ func (h *ConversationHandler) ToggleTyping(c *gin.Context) {
}
var req struct {
TypingStatus string `json:"typing_status" binding:"required"`
TypingStatus string `json:"typing_status"`
IsPrivate bool `json:"is_private"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.AbortWithStatusError(c, http.StatusBadRequest, response.ErrValidation, err.Error())
return
if c.Request.Body != nil && c.Request.ContentLength != 0 {
if err := c.ShouldBindJSON(&req); err != nil && !errors.Is(err, io.EOF) {
response.AbortWithStatusError(c, http.StatusBadRequest, response.ErrValidation, err.Error())
return
}
}
conversation, ok := h.resolveConversationRoute(c, accountID, conversationID)
if !ok {
return
}
svcErr := h.conversationSvc.ToggleTyping(c.Request.Context(), accountID, conversation.ID, req.TypingStatus)
svcErr := h.conversationSvc.ToggleTyping(c.Request.Context(), accountID, conversation.ID, currentUserID(c), req.TypingStatus, req.IsPrivate)
if svcErr != nil {
handleServiceError(c, svcErr)
return
@@ -728,11 +728,28 @@ func (s *ConversationHandlerTestSuite) TestToggleTyping_InvalidConversationID()
assert.Equal(s.T(), http.StatusBadRequest, w.Code)
}
func (s *ConversationHandlerTestSuite) TestToggleTyping_MissingFields() {
func (s *ConversationHandlerTestSuite) TestToggleTyping_MissingFieldsIsNoopSuccess() {
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", fmt.Sprintf("/api/v1/accounts/%d/conversations/%d/toggle_typing", s.testAccount.ID, s.testConv.ID), bytes.NewBufferString(`{}`))
req.Header.Set("Content-Type", "application/json")
s.router.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusOK, w.Code)
assert.Empty(s.T(), w.Body.String())
}
func (s *ConversationHandlerTestSuite) TestToggleTyping_EmptyBodyIsNoopSuccess() {
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", fmt.Sprintf("/api/v1/accounts/%d/conversations/%d/toggle_typing", s.testAccount.ID, s.testConv.ID), nil)
s.router.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusOK, w.Code)
assert.Empty(s.T(), w.Body.String())
}
func (s *ConversationHandlerTestSuite) TestToggleTyping_InvalidJSON() {
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", fmt.Sprintf("/api/v1/accounts/%d/conversations/%d/toggle_typing", s.testAccount.ID, s.testConv.ID), bytes.NewBufferString(`{`))
req.Header.Set("Content-Type", "application/json")
s.router.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusBadRequest, w.Code)
}