feat(crm): align shared attachment payloads

This commit is contained in:
2026-06-05 23:17:05 +08:00
parent ad5d864944
commit f8263a3402
10 changed files with 209 additions and 30 deletions
@@ -96,6 +96,7 @@ func (s *ContactHandlerCRUDTestSuite) SetupSuite() {
s.router.DELETE("/api/v1/accounts/:id/contacts/:contact_id", s.handler.Delete)
s.router.DELETE("/api/v1/accounts/:id/contacts/:contact_id/avatar", s.handler.DeleteAvatar)
s.router.GET("/api/v1/accounts/:id/contacts/:contact_id/conversations", s.handler.ListConversations)
s.router.GET("/api/v1/accounts/:id/contacts/:contact_id/attachments", s.handler.ListAttachments)
s.router.GET("/api/v1/accounts/:id/contacts/:contact_id/labels", s.handler.ListLabels)
s.router.POST("/api/v1/accounts/:id/contacts/:contact_id/labels", s.handler.UpdateLabels)
s.router.GET("/api/v1/accounts/:id/contacts/:contact_id/contact_inboxes", s.handler.ListContactInboxes)
@@ -578,6 +579,39 @@ func (s *ContactHandlerCRUDTestSuite) TestDeleteAvatar_Success() {
s.Equal("", found.AvatarURL)
}
func (s *ContactHandlerCRUDTestSuite) TestListAttachmentsReturnsChatwootPayload() {
inbox := &model.Inbox{AccountID: s.account.ID, Name: "Shared Files", ChannelType: "web_widget"}
s.Require().NoError(s.db.Create(inbox).Error)
displayID := uint(42)
conversation := &model.Conversation{AccountID: s.account.ID, InboxID: inbox.ID, ContactID: s.contact.ID, DisplayID: &displayID, Status: "open", ChannelType: "web_widget", Channel: "web_widget"}
s.Require().NoError(s.db.Create(conversation).Error)
message := &model.Message{AccountID: s.account.ID, InboxID: inbox.ID, ConversationID: conversation.ID, SenderID: &s.contact.ID, SenderType: "contact", Content: "image", MessageType: "incoming", ContentType: "text", Status: "sent"}
s.Require().NoError(s.db.Create(message).Error)
attachment := &model.Attachment{AccountID: s.account.ID, MessageID: message.ID, FileType: "image", FileURL: "https://cdn.example.com/image.png", ThumbURL: "https://cdn.example.com/thumb.png", FileName: "image.png", FileSize: 1234, Width: 640, Height: 480}
s.Require().NoError(s.db.Create(attachment).Error)
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", fmt.Sprintf("/api/v1/accounts/%d/contacts/%d/attachments", s.account.ID, s.contact.ID), nil)
s.router.ServeHTTP(w, req)
s.Equal(http.StatusOK, w.Code, w.Body.String())
var resp map[string]any
s.NoError(json.Unmarshal(w.Body.Bytes(), &resp))
meta := resp["meta"].(map[string]any)
s.Equal(float64(1), meta["total_count"])
payload := resp["payload"].([]any)
s.Len(payload, 1)
item := payload[0].(map[string]any)
s.Equal(float64(attachment.ID), item["id"])
s.Equal(float64(message.ID), item["message_id"])
s.Equal("image", item["file_type"])
s.Equal("https://cdn.example.com/image.png", item["data_url"])
s.Equal("png", item["extension"])
s.Equal(float64(displayID), item["conversation_id"])
s.Contains(item, "created_at")
s.Contains(item, "sender")
}
func (s *ContactHandlerCRUDTestSuite) TestMerge_ChatwootActionsPathReturnsRawContact() {
base := &model.Contact{AccountID: s.account.ID, Name: "Base Contact", Email: "base@example.com"}
mergee := &model.Contact{AccountID: s.account.ID, Name: "Mergee Contact", PhoneNumber: "+12212345"}