⚙️ Chat Handlers
Chat handlers provide core business logic functions for chat management operations in Nodeblocks applications. These handlers encapsulate common patterns for chat database operations, data transformation, and response formatting.
🎯 Overview
Chat handlers are designed to:
- Encapsulate chat business logic in reusable functions
- Handle chat database operations with proper error management
- Transform chat data between different formats
- Ensure type safety with TypeScript integration
- Support composition with other chat blocks
📋 Chat Handler Types
Channel Handlers
Functions that perform channel-related operations (creation, retrieval, updates, deletion).
Message Handlers
Functions that perform message-related operations (sending, retrieving, updating, deleting).
Subscription Handlers
Functions that perform subscription-related operations (managing user subscriptions to channels).
Terminator Handlers
Functions that format and return the final chat response.
🔧 Available Chat Handlers
📺 Channel Handlers
Core Channel Operations
createChatChannel
Creates a new chat channel in the database with validation and entity management.
Purpose: Handles creation of chat channels with validation and entity management
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with channelId or error
Example Usage:
// Used in composition:
compose(createChatChannel, terminator);
Key Features:
- Validates request body presence
- Creates base entity with metadata
- Returns channel ID on success
- Handles database insertion errors
getChatChannelById
Retrieves a single channel by ID with existence validation.
Purpose: Fetches channel data with existence validation
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with channel or error
Example Usage:
// Used in composition:
compose(getChatChannelById, normalizeTerminator);
Key Features:
- Validates channel ID presence
- Checks channel existence
- Returns full channel object
- Handles database query errors
findChatChannels
Finds multiple channels with optional filtering.
Purpose: Handles querying channels with filter support
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with channels array or error
Example Usage:
// Used in composition:
compose(findChatChannels, listTerminator);
Key Features:
- Accepts optional filter parameters
- Returns all channels if no filter provided
- Supports complex MongoDB queries
- Handles database query errors
updateChatChannel
Updates an existing channel by ID with validation and conflict detection.
Purpose: Handles updating channels with validation and conflict detection
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with update result or error
Example Usage:
// Used in composition:
compose(updateChatChannel, terminator);
Key Features:
- Validates channel ID and request body
- Checks channel existence before update
- Updates base entity metadata
- Returns update operation result
deleteChatChannel
Deletes a channel by ID with safe deletion and existence validation.
Purpose: Handles safe deletion of channels with existence validation
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with deletion result or error
Example Usage:
// Used in composition:
compose(deleteChatChannel, deleteTerminator);
Key Features:
- Validates channel ID presence
- Checks channel existence before deletion
- Returns deletion operation result
- Handles database deletion errors
Channel Terminator Functions
createChatChannelTerminator
Terminates channel creation with proper response formatting.
Purpose: Formats successful channel creation response with 201 status
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Formatted response object with data and statusCode
Example Usage:
// Used in composition:
compose(createChatChannel, createChatChannelTerminator);
Key Features:
- Returns 201 status code for successful creation
- Removes database-specific fields
- Returns formatted channel data
normalizeChatChannelTerminator
Normalizes channel data by removing database-specific fields.
Purpose: Cleans channel data for API response
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Normalized channel object
Example Usage:
// Used in composition:
compose(getChatChannelById, normalizeChatChannelTerminator);
Key Features:
- Removes
_idfield from channel - Throws error if channel not found
- Returns clean channel object
normalizeChatChannelsListTerminator
Normalizes channels list by removing database-specific fields from each item.
Purpose: Cleans channels array data for API response with validation
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Array of normalized channel objects
Example Usage:
// Used in composition:
compose(findChatChannels, normalizeChatChannelsListTerminator);
Key Features:
- Removes
_idfield from all channels - Validates channels array existence
- Maps over channels array
- Returns clean channels array
deleteChatChannelTerminator
Terminates channel deletion with proper status code.
Purpose: Formats successful deletion response with 204 status
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Response object with 204 statusCode
Example Usage:
// Used in composition:
compose(deleteChatChannel, deleteChatChannelTerminator);
Key Features:
- Returns 204 status code for successful deletion
- Validates deletion operation result
- Throws error if deletion failed
💬 Message Handlers
Core Message Operations
createChatMessage
Creates a new chat message in the database.
Purpose: Handles creation of chat messages with validation and entity management
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with messageId or error
Example Usage:
// Used in route composition:
const createMessageRoute = withRoute({
handler: compose(createChatMessage, nextHandler)
});
Key Features:
- Validates request body presence
- Creates base entity with metadata
- Returns message ID on success
- Handles database insertion errors
getChatMessageById
Retrieves a chat message by its ID from the database.
Purpose: Fetches message data with existence validation
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with chatMessage or error
Example Usage:
// Used in route composition:
const getMessageRoute = withRoute({
handler: compose(getChatMessageById, nextHandler)
});
Key Features:
- Validates message ID presence
- Checks message existence
- Returns full message object
- Handles database query errors
findChatMessages
Finds chat messages in the database using optional filter criteria.
Purpose: Handles querying messages with filter support and sorting
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with chatMessages array or error
Example Usage:
// Used in route composition:
const findMessagesRoute = withRoute({
handler: compose(findChatMessages, nextHandler)
});
Key Features:
- Accepts optional filter parameters
- Sorts messages by creation date (newest first)
- Returns all messages if no filter provided
- Supports complex MongoDB queries
updateChatMessage
Updates an existing chat message in the database.
Purpose: Handles updating messages with validation and conflict detection
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with update result or error
Example Usage:
// Used in route composition:
const updateMessageRoute = withRoute({
handler: compose(updateChatMessage, nextHandler)
});
Key Features:
- Validates message ID and request body
- Checks message existence before update
- Updates base entity metadata
- Returns update operation result
deleteChatMessage
Deletes a chat message from the database by its ID.
Purpose: Handles safe deletion of messages with existence validation
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with delete result or error
Example Usage:
// Used in route composition:
const deleteMessageRoute = withRoute({
handler: compose(deleteChatMessage, nextHandler)
});
Key Features:
- Validates message ID presence
- Checks message existence before deletion
- Returns deletion operation result
- Handles database deletion errors
Message Terminator Functions
createChatMessageTerminator
Formats chat message creation response for API response.
Purpose: Formats successful message creation response with 201 status
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Object with formatted chat message data and 201 status code
Example Usage:
// Used in route composition:
const createMessageRoute = withRoute({
handler: compose(createChatMessage, lift(createChatMessageTerminator))
});
Key Features:
- Returns 201 status code for successful creation
- Removes database-specific fields
- Returns formatted message data
normalizeChatMessageTerminator
Normalizes single chat message data for API response.
Purpose: Cleans message data for API response
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Normalized chat message object without _id field
Example Usage:
// Used in route composition:
const getMessageRoute = withRoute({
handler: compose(getChatMessageById, lift(normalizeChatMessageTerminator))
});
Key Features:
- Removes
_idfield from message - Throws error if message not found
- Returns clean message object
normalizeChatMessagesListTerminator
Normalizes chat messages list data for API response.
Purpose: Cleans messages array data for API response
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Array of normalized chat message objects without _id fields
Example Usage:
// Used in route composition:
const findMessagesRoute = withRoute({
handler: compose(findChatMessages, lift(normalizeChatMessagesListTerminator))
});
Key Features:
- Removes
_idfield from all messages - Validates messages array existence
- Maps over messages array
- Returns clean messages array
deleteChatMessageTerminator
Formats chat message deletion response for API response.
Purpose: Formats successful deletion response with 204 status
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Object with 204 status code indicating successful deletion
Example Usage:
// Used in route composition:
const deleteMessageRoute = withRoute({
handler: compose(deleteChatMessage, lift(deleteChatMessageTerminator))
});
Key Features:
- Returns 204 status code for successful deletion
- Validates deletion operation result
- Throws error if deletion failed
🔔 Subscription Handlers
Core Subscription Operations
createChatSubscription
Creates a new subscription in the database.
Purpose: Handles creation of chat subscriptions with validation and entity management
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with subscriptionId or error
Example Usage:
// Used in composition:
compose(createChatSubscription, terminator);
Key Features:
- Validates request body presence
- Creates base entity with metadata
- Returns subscription ID on success
- Handles database insertion errors
getChatSubscriptionById
Retrieves a single subscription by ID.
Purpose: Fetches subscription data with existence validation
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with subscription or error
Example Usage:
// Used in composition:
compose(getChatSubscriptionById, normalizeTerminator);
Key Features:
- Validates subscription ID presence
- Checks subscription existence
- Returns full subscription object
- Handles database query errors
findChatSubscriptions
Finds multiple subscriptions with optional filtering.
Purpose: Handles querying subscriptions with filter support
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with subscriptions array or error
Example Usage:
// Used in composition:
compose(findChatSubscriptions, listTerminator);
Key Features:
- Accepts optional filter parameters
- Returns all subscriptions if no filter provided
- Supports complex MongoDB queries
- Handles database query errors
deleteChatSubscription
Deletes a subscription by ID.
Purpose: Handles safe deletion of subscriptions with existence validation
Parameters:
payload: RouteHandlerPayload containing request context and data
Returns: Result<RouteHandlerPayload, Error> - success with deletion result or error
Example Usage:
// Used in composition:
compose(deleteChatSubscription, deleteTerminator);
Key Features:
- Validates subscription ID presence
- Checks subscription existence before deletion
- Returns deletion operation result
- Handles database deletion errors
Subscription Terminator Functions
createChatSubscriptionTerminator
Terminates subscription creation with proper response formatting.
Purpose: Formats successful subscription creation response with 201 status
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Formatted response object with data and statusCode
Example Usage:
// Used in composition:
compose(createChatSubscription, createChatSubscriptionTerminator);
Key Features:
- Returns 201 status code for successful creation
- Removes database-specific fields
- Returns formatted subscription data
normalizeChatSubscriptionTerminator
Normalizes subscription data by removing database-specific fields.
Purpose: Cleans subscription data for API response
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Normalized subscription object
Example Usage:
// Used in composition:
compose(getChatSubscriptionById, normalizeChatSubscriptionTerminator);
Key Features:
- Removes
_idfield from subscription - Throws error if subscription not found
- Returns clean subscription object
normalizeChatSubscriptionsListTerminator
Normalizes subscriptions list by removing database-specific fields from each item.
Purpose: Cleans subscriptions array data for API response with validation
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Array of normalized subscription objects
Example Usage:
// Used in composition:
compose(findChatSubscriptions, normalizeChatSubscriptionsListTerminator);
Key Features:
- Removes
_idfield from all subscriptions - Validates subscriptions array existence
- Maps over subscriptions array
- Returns clean subscriptions array
deleteChatSubscriptionTerminator
Terminates subscription deletion with proper status code.
Purpose: Formats successful deletion response with 204 status
Parameters:
result: Result containing RouteHandlerPayload or Error
Returns: Response object with 204 statusCode
Example Usage:
// Used in composition:
compose(deleteChatSubscription, deleteChatSubscriptionTerminator);
Key Features:
- Returns 204 status code for successful deletion
- Validates deletion operation result
- Throws error if deletion failed