Skip to main content

Support Message Controller

Controller: support.message.controller.js
Module: Conversation-v2
Purpose: Handles bidirectional messaging between support agents and customers

Overview

The Support Message controller manages message exchange in support conversations. It provides separate endpoints for agents (team) and customers (support widget), enabling real-time communication with Socket.IO integration.

Methods

1. Send Message (Agent) (sendMessage)

Sends a message from support agent to customer.

Endpoint: POST /api/conversation-v2/support/message

Authentication: Required (JWT - agent)

Request Body:

{
"room_id": "507f1f77bcf86cd799439011",
"message": {
"type": "text",
"content": "Hello! How can I assist you today?"
},
"new_room": false,
"integration_app": null
}

Response:

{
"success": true,
"messages": {
"message": {
"_id": "507f1f77bcf86cd799439020",
"room_id": "507f1f77bcf86cd799439011",
"conversation_id": "507f1f77bcf86cd799439012",
"content": "Hello! How can I assist you today?",
"type": "text",
"created_at": "2025-10-08T10:30:00.000Z"
}
}
}

MongoDB Operations:

CollectionOperationQueryPurpose
messagesinsertOneNew messageCreate message
roomsupdateOneUpdate last messageRoom metadata

Business Logic:

  • Message sent from agent's conversation context
  • Broadcasts to customer via Socket.IO (type: 'team')
  • Notes (type: 'note') not broadcasted to customer
  • Optional integration app tracking for automation

Message Types:

  • text - Plain text message
  • note - Internal agent note (not visible to customer)
  • image - Image attachment
  • file - File attachment

Note Messages:

graph TD
A[Agent Sends Message] --> B{Type = note?}
B -->|Yes| C[No Customer Notification]
B -->|No| D[Broadcast to Customer]
C --> E[Only Agents See]
D --> F[Customer Receives]

Use Cases:

  • Agent responding to customer inquiry
  • Sending attachments or images
  • Internal notes between agents

2. Send Message (Customer) (sendUserMessage)

Sends a message from customer to support agents.

Endpoint: POST /api/conversation-v2/support/user/message

Authentication: Support token + session

Request Body:

{
"room_id": "507f1f77bcf86cd799439011",
"message": {
"type": "text",
"content": "I need help with my account"
}
}

Response:

{
"success": true,
"messages": {
"message": {
"_id": "507f1f77bcf86cd799439030",
"room_id": "507f1f77bcf86cd799439011",
"conversation_id": "507f1f77bcf86cd799439031",
"content": "I need help with my account",
"type": "text",
"created_at": "2025-10-08T10:31:00.000Z"
}
}
}

MongoDB Operations:

CollectionOperationQueryPurpose
messagesinsertOneNew messageCreate message

Business Logic:

  • Message sent from customer's support conversation
  • Uses support_conversation._id from auth context
  • Broadcasts to assigned agents via Socket.IO (type: 'support')
  • Increments unread count for agents

Authentication Flow:

graph TD
A[Customer Widget] --> B[Support Token Auth]
B --> C[Session Validation]
C --> D[Get Support Conversation]
D --> E[Send Message]
E --> F[Broadcast to Agents]

Use Cases:

  • Customer asking questions
  • Sending files from widget
  • Replying to agent messages

3. Query Messages (Agent) (queryMessages)

Retrieves message history for agents viewing support room.

Endpoint: GET /api/conversation-v2/support/message

Authentication: Required (JWT - agent)

Query Parameters:

{
room_id: string;
upperRef?: string; // Pagination - older messages
lowerRef?: string; // Pagination - newer messages
limit?: number; // Messages per page
sort?: 'asc' | 'desc';
search?: string; // Search query
}

Response:

{
"success": true,
"messages": [
{
"_id": "507f1f77bcf86cd799439030",
"content": "I need help with my account",
"conversation_id": "507f1f77bcf86cd799439031",
"created_at": "2025-10-08T10:31:00.000Z",
"sender_type": "customer"
},
{
"_id": "507f1f77bcf86cd799439020",
"content": "Hello! How can I assist you today?",
"conversation_id": "507f1f77bcf86cd799439012",
"created_at": "2025-10-08T10:30:00.000Z",
"sender_type": "agent",
"type": "text"
}
],
"hasMore": true
}

MongoDB Operations:

CollectionOperationQueryPurpose
messagesfindPagination queryGet messages

Business Logic:

  • Shows all messages including agent notes
  • Supports bidirectional pagination
  • Search across message content
  • Marks sender type (agent vs customer)

4. Query Messages (Customer) (queryUserMessages)

Retrieves message history for customers in widget.

Endpoint: GET /api/conversation-v2/support/user/message

Authentication: Support token + session

Query Parameters: Same as agent version

Response:

{
"success": true,
"messages": [
{
"_id": "507f1f77bcf86cd799439030",
"content": "I need help with my account",
"created_at": "2025-10-08T10:31:00.000Z",
"is_mine": true
},
{
"_id": "507f1f77bcf86cd799439020",
"content": "Hello! How can I assist you today?",
"created_at": "2025-10-08T10:30:00.000Z",
"is_mine": false
}
]
}

MongoDB Operations:

CollectionOperationQueryPurpose
messagesfindFilter notesGet customer-visible messages

Business Logic:

  • Filters out agent notes (type: 'note')
  • Only shows messages customer should see
  • Marks which messages belong to customer (is_mine)
  • Same pagination support as agent endpoint

Message Filtering:

graph TD
A[All Messages] --> B{Filter by Type}
B -->|text, image, file| C[Include in Response]
B -->|note| D[Exclude from Response]
C --> E[Customer Sees Message]
D --> F[Agent-Only Visibility]

Data Models

Message Schema (Support Context)

{
_id: ObjectId;
room_id: ObjectId;
conversation_id: ObjectId; // Agent or support conversation

// Content
content: string;
type: 'text' | 'image' | 'file' | 'note';
attachments?: Array<{
url: string;
type: string;
name: string;
size: number;
}>;

// Integration
integration_app?: string; // Bot/automation identifier

// Timestamps
created_at: Date;
updated_at: Date;
}

Socket.IO Integration

Agent-side Events

// New customer message
socket.to(`account_${accountId}`).emit('newMessage', {
message: messageObject,
type: 'support',
});

Customer-side Events

// New agent message
socket.to(`support_${conversationId}`).emit('newMessage', {
message: messageObject,
type: 'team',
});

Message Types Deep Dive

Text Message

{
"type": "text",
"content": "Hello! How can I help?"
}

Image Message

{
"type": "image",
"content": "Screenshot attached",
"attachments": [
{
"url": "https://cdn.example.com/images/screenshot.png",
"type": "image/png",
"size": 245678
}
]
}

Agent Note (Internal)

{
"type": "note",
"content": "Customer seems frustrated. Offer discount if needed."
}

Security Considerations

Agent Authentication

  • JWT token with conversation.id (agent's conversation)
  • Account-level isolation via account_id
  • Only assigned agents can view room messages

Customer Authentication

  • Support token from widget embed
  • Session validation via support_session header
  • Device ID tracking for security

Note Protection

// Agent notes never sent to customers
if (message.type !== 'note') {
emitToCustomer(message);
}

Performance Considerations

Indexing

db.messages.createIndex({
room_id: 1,
created_at: -1,
type: 1,
});

Pagination

  • Default limit: 20 messages
  • Use upperRef/lowerRef for efficient pagination
  • Avoid loading entire conversation history

Error Handling

Status CodeErrorCause
401UnauthorizedInvalid token or session
403ForbiddenNot assigned to room
404Room not foundInvalid room_id

Testing Recommendations

describe('Support Message Controller', () => {
describe('sendMessage (agent)', () => {
it('should send text message to customer', async () => {});
it('should not broadcast notes to customer', async () => {});
});

describe('sendUserMessage (customer)', () => {
it('should send message from widget', async () => {});
it('should validate session', async () => {});
});

describe('queryMessages', () => {
it('should show all messages to agents', async () => {});
it('should hide notes from customers', async () => {});
});
});

Last Updated: October 8, 2025
Documented By: AI Documentation System
Source: internal/api/v1/conversation-v2/controllers/support.message.controller.js

💬

Documentation Assistant

Ask me anything about the docs

Hi! I'm your documentation assistant. Ask me anything about the docs!

I can help you with:
- Code examples
- Configuration details
- Troubleshooting
- Best practices

Try asking: How do I configure the API?
09:31 AM