feat(crm): align nested conversation payloads

This commit is contained in:
2026-06-05 04:05:01 +08:00
parent 9d0e8d40c0
commit fb775b76f6
6 changed files with 74 additions and 9 deletions
@@ -57,6 +57,7 @@ func (s *ContactHandlerCRUDTestSuite) SetupSuite() {
&model.Notification{},
&model.Conversation{},
&model.Message{},
&model.Attachment{},
&model.ContactInbox{},
&model.InboxMember{},
&model.ContactNote{},
@@ -134,6 +135,7 @@ func (s *ContactHandlerCRUDTestSuite) SetupTest() {
s.db.Exec("DELETE FROM contact_exports")
s.db.Exec("DELETE FROM data_imports")
s.db.Exec("DELETE FROM notifications")
s.db.Exec("DELETE FROM attachments")
s.db.Exec("DELETE FROM messages")
s.db.Exec("DELETE FROM notes")
s.db.Exec("DELETE FROM contact_inboxes")
@@ -852,8 +854,12 @@ func (s *ContactHandlerCRUDTestSuite) TestListConversations_Success() {
now := time.Now().Unix()
older := now - 60
s.Require().NoError(s.db.Create(&model.Conversation{AccountID: s.account.ID, InboxID: inbox.ID, ContactID: s.contact.ID, Status: "open", Priority: "low", ChannelType: "web_widget", Channel: "web_widget", LastActivityAt: &older}).Error)
s.Require().NoError(s.db.Create(&model.Conversation{AccountID: s.account.ID, InboxID: inbox.ID, ContactID: s.contact.ID, Status: "open", Priority: "high", ChannelType: "web_widget", Channel: "web_widget", LastActivityAt: &now}).Error)
olderConversation := &model.Conversation{AccountID: s.account.ID, InboxID: inbox.ID, ContactID: s.contact.ID, Status: "open", Priority: "low", ChannelType: "web_widget", Channel: "web_widget", LastActivityAt: &older}
recentConversation := &model.Conversation{AccountID: s.account.ID, InboxID: inbox.ID, ContactID: s.contact.ID, Status: "open", Priority: "high", ChannelType: "web_widget", Channel: "web_widget", LastActivityAt: &now}
s.Require().NoError(s.db.Create(olderConversation).Error)
s.Require().NoError(s.db.Create(recentConversation).Error)
senderID := s.contact.ID
s.Require().NoError(s.db.Create(&model.Message{AccountID: s.account.ID, InboxID: inbox.ID, ConversationID: recentConversation.ID, SenderID: &senderID, SenderType: "contact", MessageType: "incoming", ContentType: "text", Status: "sent", Content: "Latest contact message"}).Error)
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", fmt.Sprintf("/api/v1/accounts/%d/contacts/%d/conversations", s.account.ID, s.contact.ID), nil)
@@ -867,6 +873,24 @@ func (s *ContactHandlerCRUDTestSuite) TestListConversations_Success() {
s.Len(payload, 2)
first := payload[0].(map[string]interface{})
s.Equal("high", first["priority"])
s.Contains(first, "meta")
s.Contains(first, "messages")
s.Contains(first, "last_non_activity_message")
s.Equal(float64(recentConversation.ID), first["id"])
s.Equal(float64(s.account.ID), first["account_id"])
s.Equal(float64(inbox.ID), first["inbox_id"])
s.NotContains(first, "contact_id")
meta := first["meta"].(map[string]interface{})
s.Equal("web_widget", meta["channel"])
s.Equal(float64(s.contact.ID), meta["sender"].(map[string]interface{})["id"])
messages := first["messages"].([]interface{})
s.Len(messages, 1)
message := messages[0].(map[string]interface{})
s.Equal("Latest contact message", message["content"])
s.Equal(float64(0), message["message_type"])
s.Equal(float64(recentConversation.ID), message["conversation_id"])
}
func (s *ContactHandlerCRUDTestSuite) TestListConversations_InvalidContactID() {