Skip to main content

Conversation Controller

Controller: conversation.controller.js
Module: Conversation-v2
Purpose: Manages user conversation state, preferences, and status within the messaging system

Overview​

The Conversation controller handles the core conversation entity operations including user status management, conversation details updates, DND (Do Not Disturb) settings, and support-specific configurations. Each conversation represents a user's presence and state in the messaging system.

Methods​

1. Get Conversation (getConv)​

Retrieves the authenticated user's conversation details.

Endpoint: GET /api/conversation-v2/conversation

Authentication: Required (JWT)

Request:

// Headers
Authorization: Bearer <token>

Response:

{
"_id": "507f1f77bcf86cd799439011",
"account_id": "507f1f77bcf86cd799439012",
"user_id": "507f1f77bcf86cd799439013",
"dnd_till": null,
"favorite": [],
"support_dnd_till": null,
"support_favorite": [],
"status": [
{
"type": "online",
"timestamp": 1633024800000
}
],
"last_activity": 1633024800000,
"support_status": "available",
"default_email_inbound_conversation": "507f1f77bcf86cd799439014",
"default_sms_inbound_conversation": "507f1f77bcf86cd799439015",
"support_live_seat": true
}

MongoDB Operations:

CollectionOperationQueryPurpose
conversationsfindOne{ account_id, user_id }Get user's conversation

Business Logic:

  • Returns the conversation entity for the authenticated user
  • Used to initialize user's messaging state on login
  • Contains preferences for both team and support conversations

2. Get Associated Conversations (getAssociated)​

Retrieves team conversations associated with the current user's conversation scope.

Endpoint: GET /api/conversation-v2/conversation/associated

Authentication: Required (JWT + conversation context)

Query Parameters:

{
scopes?: string[]; // Filter by conversation scopes
search?: string; // Search query
type?: string; // Conversation type filter
default_inbound?: string; // Filter default inbound conversations
}

Request:

GET /api/conversation-v2/conversation/associated?scopes=team&search=john&type=user
Authorization: Bearer <token>

Response:

{
"success": true,
"conversations": [
{
"_id": "507f1f77bcf86cd799439011",
"user_id": "507f1f77bcf86cd799439013",
"account_id": "507f1f77bcf86cd799439012",
"user": {
"name": "John Doe",
"email": "john@example.com",
"avatar": "https://cdn.example.com/avatars/john.jpg"
},
"status": [
{
"type": "online",
"timestamp": 1633024800000
}
],
"last_activity": 1633024800000
}
]
}

MongoDB Operations:

CollectionOperationQueryPurpose
conversationsfindMultiple filtersGet team conversations

Business Logic:

  • Filters conversations based on scope (e.g., team members, support agents)
  • Supports search functionality for finding specific team members
  • Used for populating team member lists in the UI

Use Cases:

  • Displaying team members in chat interface
  • Finding users to start conversations with
  • Filtering support agents by availability

3. Get Bots (getBots)​

Retrieves list of available bot configurations for the messaging system.

Endpoint: GET /api/conversation-v2/conversation/bots

Authentication: Required (JWT)

Request:

GET /api/conversation-v2/conversation/bots
Authorization: Bearer <token>

Response:

{
"success": true,
"data": [
{
"id": "bot_1",
"name": "Support Bot",
"type": "automated_response",
"avatar": "https://cdn.example.com/bots/support.png",
"description": "Handles automated support responses"
},
{
"id": "bot_2",
"name": "Sales Bot",
"type": "lead_qualification",
"avatar": "https://cdn.example.com/bots/sales.png",
"description": "Qualifies leads and schedules demos"
}
]
}

Business Logic:

  • Returns hardcoded or configured bot list from service layer
  • Bots can be used for automated responses in conversations
  • No database query required (static configuration)

Use Cases:

  • Displaying available bots to assign to conversations
  • Auto-responder configuration
  • Chatbot integration setup

4. Update Conversation Details (updateDetails)​

Updates various conversation settings including DND status and favorites.

Endpoint: PATCH /api/conversation-v2/conversation/details

Authentication: Required (JWT)

Request Body:

{
"details": {
"dnd_till": 1633110000000,
"favorite": ["507f1f77bcf86cd799439016", "507f1f77bcf86cd799439017"],
"support_dnd_till": null,
"support_favorite": ["507f1f77bcf86cd799439018"]
}
}

Response:

{
"success": true,
"message": "Details updated"
}

MongoDB Operations:

CollectionOperationQuery/UpdatePurpose
conversationsfindOne{ account_id, user_id }Get current conversation
conversationsupdateOne$set details + last_activityUpdate conversation settings

Business Logic:

  • Automatically sets last_activity timestamp on update
  • Merges provided details with existing values (partial updates)
  • Only updates fields that are explicitly provided in request
  • Validates conversation exists before updating

Updatable Fields:

FieldTypeDescription
dnd_tillNumber (timestamp)Do Not Disturb until this timestamp
favoriteObjectId[]List of favorite conversation IDs
support_dnd_tillNumber (timestamp)Support DND setting
support_favoriteObjectId[]Support favorite conversations

Error Responses:

// Conversation not found
{
"error": "Conversation does not exist",
"statusCode": 404
}

Use Cases:

  • Setting Do Not Disturb mode
  • Managing favorite conversations for quick access
  • Updating notification preferences

5. Update Status (updateStatus)​

Updates the user's conversation status (online, away, busy, offline).

Endpoint: PATCH /api/conversation-v2/conversation/status

Authentication: Required (JWT)

Request Body:

{
"status": {
"type": "away",
"timestamp": 1633024800000
}
}

Response:

{
"success": true,
"message": "Details updated"
}

MongoDB Operations:

CollectionOperationQuery/UpdatePurpose
conversationsfindOne{ account_id, user_id }Get current conversation
conversationsupdateOne$push status, update last_activityAppend new status

Business Logic:

  • Status changes are appended to a history array
  • Prevents duplicate status updates (cannot set same status twice in a row)
  • Each status includes a timestamp for tracking
  • Automatically updates last_activity field

Status Flow:

graph LR
A[Current Status: online] --> B{New Status}
B -->|Same as current| C[Error: Duplicate Status]
B -->|Different| D[Append to Array]
D --> E[Update last_activity]
E --> F[Success Response]

Status Types:

  • online - User is active
  • away - User is idle
  • busy - User is in focus mode
  • offline - User is disconnected

Error Responses:

// Duplicate status
{
"error": "Current status cannot be same as last status",
"statusCode": 400
}

// Conversation not found
{
"error": "Conversation does not exist",
"statusCode": 404
}

Use Cases:

  • Automatic status updates based on user activity
  • Manual status changes by user
  • Presence indicators in UI
  • Availability tracking for support agents

6. Update Support Status (supportStatus)​

Updates support-specific settings including availability, routing, and live seat allocation.

Endpoint: PATCH /api/conversation-v2/conversation/support-status

Authentication: Required (JWT + conversation context)

Request Body:

{
"conversationId": "507f1f77bcf86cd799439011",
"status": "available",
"default_email_inbound_conversation": "507f1f77bcf86cd799439014",
"default_sms_inbound_conversation": "507f1f77bcf86cd799439015",
"live_seat": true
}

Response:

{
"success": true,
"conversation": {
"_id": "507f1f77bcf86cd799439011",
"support_status": "available",
"default_email_inbound_conversation": "507f1f77bcf86cd799439014",
"default_sms_inbound_conversation": "507f1f77bcf86cd799439015",
"support_live_seat": true,
"last_activity": 1633024800000
}
}

MongoDB Operations:

CollectionOperationQuery/UpdatePurpose
conversationsupdateOneUpdate support fieldsUpdate target conversation

Business Logic:

  • Only updates fields that are explicitly provided (undefined values are filtered out)
  • Can update support status for other team members (admin functionality)
  • Validates conversation ID against authenticated user's context
  • Used for managing support agent availability

Updatable Fields:

FieldTypeDescription
status (support_status)StringAgent availability status
default_email_inbound_conversationObjectIdDefault conversation for email leads
default_sms_inbound_conversationObjectIdDefault conversation for SMS leads
live_seat (support_live_seat)BooleanWhether agent occupies a live support seat

Support Status Values:

  • available - Ready to receive new support requests
  • busy - Currently handling maximum capacity
  • offline - Not available for support

Use Cases:

  • Support agent toggling availability
  • Routing configuration for inbound leads
  • Live seat management for concurrent chat limits
  • Admin managing team member support settings

Workflow:

graph TD
A[Admin/User Request] --> B{Validate Conversation}
B -->|Valid| C[Filter Undefined Fields]
C --> D[Update Support Settings]
D --> E[Return Updated Conversation]
B -->|Invalid| F[Error: Unauthorized]

Data Models​

Conversation Schema​

{
_id: ObjectId;
account_id: ObjectId; // Account this conversation belongs to
user_id: ObjectId; // User associated with conversation

// Team Chat Settings
dnd_till: number | null; // Do Not Disturb timestamp
favorite: ObjectId[]; // Favorite conversation IDs

// Support Settings
support_dnd_till: number | null;
support_favorite: ObjectId[];
support_status: string; // 'available' | 'busy' | 'offline'
support_live_seat: boolean; // Occupies live support slot

// Routing Configuration
default_email_inbound_conversation: ObjectId;
default_sms_inbound_conversation: ObjectId;

// Status Tracking
status: Array<{
type: string; // 'online' | 'away' | 'busy' | 'offline'
timestamp: number;
}>;
last_activity: number;

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

Status Entry​

{
type: 'online' | 'away' | 'busy' | 'offline';
timestamp: number; // Unix timestamp in milliseconds
}

Error Handling​

Common Errors​

Status CodeErrorCause
400Current status cannot be same as last statusDuplicate status update
404Conversation does not existInvalid conversation ID
401UnauthorizedMissing or invalid JWT token

Error Response Format​

{
"error": "Error message",
"statusCode": 400
}

Integration Points​

Dependencies​

  • convService: Business logic for conversation operations
    • queryConversation(accountId, userId) - Get conversation by user
    • queryTeamConversations(params) - Get associated team conversations
    • getBots() - Get bot configurations
    • updateDetails(accountId, userId, details) - Update conversation details
    • supportStatus(params) - Update support-specific settings

Socket.IO Events​

While not directly emitted in this controller, status changes trigger real-time updates:

  • Event: conversation:status
    • Triggered when user status changes
    • Broadcasts to all team members
  • Event: conversation:details
    • Triggered when conversation details update
    • Notifies affected users

Multi-tenant Isolation​

All operations are scoped by account_id from JWT:

const accountId = req.auth.account_id;
const userId = req.auth.uid;

This ensures users can only access conversations within their account.


Performance Considerations​

Optimization Strategies​

  1. Status History:

    • Status array grows over time
    • Consider archiving old status entries periodically
    • Current implementation keeps full history
  2. Favorite Lists:

    • Favorite arrays can grow large
    • No pagination currently implemented
    • Consider limiting favorites or implementing pagination
  3. Associated Conversations Query:

    • Can return many results for large teams
    • Implement pagination if needed
    • Consider caching team member lists

Use Cases​

Team Chat Application​

  1. User Login:

    User logs in → getConv() → Initialize conversation state
    → Display user's status, DND settings, favorites
  2. Status Management:

    User changes status → updateStatus() → Broadcast to team
    → Update presence indicators in UI
  3. Finding Team Members:

    User searches team → getAssociated() with search param
    → Display filtered team member list

Support System​

  1. Agent Availability:

    Agent goes online → supportStatus({ status: 'available' })
    → Enable routing to this agent
  2. Routing Configuration:

    Admin assigns default conversations → supportStatus()
    → New email/SMS leads route to specified agent
  3. Live Seat Management:

    Agent reaches capacity → supportStatus({ live_seat: false })
    → Prevent new assignments until capacity available

Security Considerations​

  1. Authentication:

    • All endpoints require valid JWT token
    • Token provides account_id, user_id, and conversation.id
  2. Authorization:

    • Users can only update their own conversation details
    • supportStatus can update other conversations (admin functionality)
    • Validation should ensure proper permissions
  3. Data Isolation:

    • All queries filtered by account_id
    • Prevents cross-account data leakage

Testing Recommendations​

Unit Tests​

describe('Conversation Controller', () => {
describe('getConv', () => {
it('should return user conversation', async () => {});
it('should handle non-existent conversation', async () => {});
});

describe('updateStatus', () => {
it('should append new status', async () => {});
it('should reject duplicate status', async () => {});
it('should update last_activity', async () => {});
});

describe('updateDetails', () => {
it('should update DND settings', async () => {});
it('should update favorites', async () => {});
it('should handle partial updates', async () => {});
});
});

Integration Tests​

  • Test status change propagation to Socket.IO
  • Verify multi-tenant isolation
  • Test concurrent status updates
  • Validate favorite list management

Last Updated: October 8, 2025
Documented By: AI Documentation System
Source: internal/api/v1/conversation-v2/controllers/conversation.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