feat(conversations): align mute semantics

This commit is contained in:
2026-06-07 11:20:12 +08:00
parent 148201905a
commit 6b6289f896
7 changed files with 194 additions and 30 deletions
@@ -810,6 +810,24 @@ func (s *ConversationCrudTestSuite) TestMute_Success() {
assert.Equal(s.T(), http.StatusOK, w.Code)
assert.Empty(s.T(), w.Body.String())
var conversation model.Conversation
s.Require().NoError(s.db.First(&conversation, s.testConv.ID).Error)
assert.Equal(s.T(), string(model.ConversationStatusResolved), conversation.Status)
assert.True(s.T(), conversation.Muted)
var contact model.Contact
s.Require().NoError(s.db.First(&contact, s.testContact.ID).Error)
assert.True(s.T(), contact.Blocked)
w = httptest.NewRecorder()
req, _ = http.NewRequest("GET", s.convURL(s.testConv.ID), nil)
s.router.ServeHTTP(w, req)
assert.Equal(s.T(), http.StatusOK, w.Code)
var resp map[string]interface{}
s.Require().NoError(json.Unmarshal(w.Body.Bytes(), &resp))
assert.Equal(s.T(), true, resp["muted"])
assert.Equal(s.T(), string(model.ConversationStatusResolved), resp["status"])
}
func (s *ConversationCrudTestSuite) TestMute_InvalidAccountID() {
@@ -849,6 +867,15 @@ func (s *ConversationCrudTestSuite) TestUnmute_Success() {
assert.Equal(s.T(), http.StatusOK, w.Code)
assert.Empty(s.T(), w.Body.String())
var conversation model.Conversation
s.Require().NoError(s.db.First(&conversation, s.testConv.ID).Error)
assert.Equal(s.T(), string(model.ConversationStatusResolved), conversation.Status)
assert.False(s.T(), conversation.Muted)
var contact model.Contact
s.Require().NoError(s.db.First(&contact, s.testContact.ID).Error)
assert.False(s.T(), contact.Blocked)
}
func (s *ConversationCrudTestSuite) TestUnmute_InvalidAccountID() {
@@ -238,7 +238,7 @@ func serializeConversation(ctx context.Context, db *gorm.DB, conversation *model
CustomAttributes: jsonObject(conversation.CustomAttributes),
InboxID: conversation.InboxID,
Labels: labelList(conversation.Labels),
Muted: conversation.Muted,
Muted: conversationMuted(ctx, db, conversation),
SnoozedUntil: conversation.SnoozedUntil,
Status: conversation.Status,
CreatedAt: conversation.CreatedAt.Unix(),
@@ -260,6 +260,21 @@ func serializeConversation(ctx context.Context, db *gorm.DB, conversation *model
return payload
}
func conversationMuted(ctx context.Context, db *gorm.DB, conversation *model.Conversation) bool {
if db == nil || conversation.ContactID == 0 {
return conversation.Muted
}
var contact model.Contact
if err := db.WithContext(ctx).
Select("id", "blocked").
Where("id = ? AND account_id = ?", conversation.ContactID, conversation.AccountID).
First(&contact).Error; err == nil {
return contact.Blocked
}
return conversation.Muted
}
func serializeAppliedSlaForConversation(ctx context.Context, db *gorm.DB, conversationID uint) map[string]any {
if db == nil || conversationID == 0 {
return nil