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
@@ -304,17 +304,17 @@ func serializeMessage(ctx context.Context, db *gorm.DB, message *model.Message,
if err := db.WithContext(ctx).Where("message_id = ?", message.ID).Order("id ASC").Find(&attachments).Error; err == nil && len(attachments) > 0 {
payload.Attachments = make([]any, 0, len(attachments))
for i := range attachments {
payload.Attachments = append(payload.Attachments, serializeAttachment(&attachments[i]))
payload.Attachments = append(payload.Attachments, serializeAttachment(ctx, db, &attachments[i]))
}
}
}
return payload
}
func serializeAttachment(attachment *model.Attachment) map[string]any {
func serializeAttachment(ctx context.Context, db *gorm.DB, attachment *model.Attachment) map[string]any {
extension := strings.TrimPrefix(filepath.Ext(attachment.FileName), ".")
dataURL := nonEmpty(attachment.FileURL, attachment.ExternalURL)
return map[string]any{
payload := map[string]any{
"id": attachment.ID,
"message_id": attachment.MessageID,
"file_type": attachment.FileType,
@@ -326,6 +326,52 @@ func serializeAttachment(attachment *model.Attachment) map[string]any {
"width": attachment.Width,
"height": attachment.Height,
}
message := attachment.Message
if message.ID == 0 && db != nil && attachment.MessageID != 0 {
_ = db.WithContext(ctx).First(&message, attachment.MessageID).Error
}
if !message.CreatedAt.IsZero() {
payload["created_at"] = message.CreatedAt.Unix()
}
if sender := serializeMessageSender(ctx, db, &message); sender != nil {
payload["sender"] = sender
}
return payload
}
func serializeAttachmentWithConversation(ctx context.Context, db *gorm.DB, attachment *model.Attachment) map[string]any {
payload := serializeAttachment(ctx, db, attachment)
message := attachment.Message
if message.ID == 0 && db != nil && attachment.MessageID != 0 {
_ = db.WithContext(ctx).First(&message, attachment.MessageID).Error
}
if db != nil && message.ConversationID != 0 {
var conversation model.Conversation
if err := db.WithContext(ctx).First(&conversation, message.ConversationID).Error; err == nil {
payload["conversation_id"] = conversationDisplayID(&conversation)
}
}
return payload
}
func serializeMessageSender(ctx context.Context, db *gorm.DB, message *model.Message) map[string]any {
if db == nil || message == nil || message.SenderID == nil || *message.SenderID == 0 {
return nil
}
senderType := strings.ToLower(message.SenderType)
if senderType == "contact" {
var contact model.Contact
if err := db.WithContext(ctx).First(&contact, *message.SenderID).Error; err == nil {
return serializeContact(&contact)
}
return nil
}
var user model.User
if err := db.WithContext(ctx).First(&user, *message.SenderID).Error; err == nil {
return serializeUser(&user, message.AccountID)
}
return nil
}
func serializeContact(contact *model.Contact) map[string]any {