renombrado nucleoClient y nucleoActions por whatsappCliente y whatsappActions
All checks were successful
Deploy conversation layer / deploy (push) Successful in 2m4s

This commit is contained in:
2025-06-06 23:06:59 -06:00
parent 781b4e809f
commit 0671cc9445
4 changed files with 73 additions and 73 deletions

View File

@@ -1,6 +1,6 @@
import express from 'express';
import dotenv from 'dotenv';
import { registerConversationRoutes } from './routes/conversations';
import { registerConversationRoutes } from './routes/conversationActions';
import {
registerWebhookRoutes,
clearWebhooks,
@@ -8,7 +8,7 @@ import {
waitForGateway,
WebhookConfig,
} from './webhook';
import nucleoActionsRouter from './routes/nucleoActions'; // New import
import whatsappActionsRouter from './routes/whatsappActions'; // New import
dotenv.config();
@@ -52,8 +52,8 @@ const config: WebhookConfig = {
registerConversationRoutes(app, openWaUrl);
registerWebhookRoutes(app, config, openWaUrl, agentUrl);
// Register new nucleoActions routes
app.use('/nucleo', nucleoActionsRouter); // New line
// Register new whatsappActions routes
app.use('/whatsapp', whatsappActionsRouter); // New line
app.listen(port, async () => {
console.log(`WhatsApp router listening on ${port}`);

View File

@@ -1,5 +1,5 @@
import express, { Router, Request, Response, NextFunction } from 'express';
import * as nucleoClient from '../nucleoClient';
import * as whatsappClient from '../whatsappClient';
// Assuming OPEN_WA_URL is set in the environment.
// For local development, dotenv would typically be used in the main app entry point (e.g., index.ts)
// require('dotenv').config(); // Potentially, but better if handled by the main application loader
@@ -14,7 +14,7 @@ const openWaUrl = process.env.OPEN_WA_URL;
// This runs for every request to this router
router.use((req: Request, res: Response, next: NextFunction) => {
if (!openWaUrl) {
console.error('[routes/nucleoActions] Service OPEN_WA_URL not configured');
console.error('[routes/whatsappActions] Service OPEN_WA_URL not configured');
return res.status(500).json({ error: 'Service OPEN_WA_URL not configured. Please set the environment variable.' });
}
// Pass openWaUrl to subsequent handlers via res.locals if preferred,
@@ -33,11 +33,11 @@ router.post('/send-text', async (req: Request, res: Response) => {
return res.status(400).json({ error: 'Missing "to" or "content" in request body' });
}
// openWaUrl is checked by middleware and available in module scope
const result = await nucleoClient.sendTextMessage(openWaUrl!, to, content);
const result = await whatsappClient.sendTextMessage(openWaUrl!, to, content);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /send-text:', error.message);
// Check if the error message is already a JSON string from nucleoClient's error handling
console.error('[routes/whatsappActions] Error in /send-text:', error.message);
// Check if the error message is already a JSON string from whatsappClient's error handling
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -55,10 +55,10 @@ router.post('/send-image', async (req: Request, res: Response) => {
if (!to || !path) {
return res.status(400).json({ error: 'Missing "to" or "path" in request body' });
}
const result = await nucleoClient.sendImageMessage(openWaUrl!, to, path, caption);
const result = await whatsappClient.sendImageMessage(openWaUrl!, to, path, caption);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /send-image:', error.message);
console.error('[routes/whatsappActions] Error in /send-image:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -75,10 +75,10 @@ router.post('/send-file', async (req: Request, res: Response) => {
if (!to || !path) {
return res.status(400).json({ error: 'Missing "to" or "path" in request body' });
}
const result = await nucleoClient.sendFileMessage(openWaUrl!, to, path, filename, caption);
const result = await whatsappClient.sendFileMessage(openWaUrl!, to, path, filename, caption);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /send-file:', error.message);
console.error('[routes/whatsappActions] Error in /send-file:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -95,10 +95,10 @@ router.get('/chats/:chatId', async (req: Request, res: Response) => {
if (!chatId) {
return res.status(400).json({ error: 'Missing "chatId" in request params' });
}
const result = await nucleoClient.getChatById(openWaUrl!, chatId);
const result = await whatsappClient.getChatById(openWaUrl!, chatId);
res.json(result);
} catch (error: any) {
console.error(`[routes/nucleoActions] Error in /chats/${req.params.chatId}:`, error.message);
console.error(`[routes/whatsappActions] Error in /chats/${req.params.chatId}:`, error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -115,10 +115,10 @@ router.post('/groups', async (req: Request, res: Response) => {
if (!groupName || !contactIds || !Array.isArray(contactIds) || contactIds.length === 0) {
return res.status(400).json({ error: 'Missing "groupName" or "contactIds" (must be a non-empty array) in request body' });
}
const result = await nucleoClient.createGroup(openWaUrl!, groupName, contactIds);
const result = await whatsappClient.createGroup(openWaUrl!, groupName, contactIds);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /groups:', error.message);
console.error('[routes/whatsappActions] Error in /groups:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -135,10 +135,10 @@ router.get('/contacts/:contactId', async (req: Request, res: Response) => {
if (!contactId) {
return res.status(400).json({ error: 'Missing "contactId" in request params' });
}
const result = await nucleoClient.getContact(openWaUrl!, contactId);
const result = await whatsappClient.getContact(openWaUrl!, contactId);
res.json(result);
} catch (error: any) {
console.error(`[routes/nucleoActions] Error in /contacts/${req.params.contactId}:`, error.message);
console.error(`[routes/whatsappActions] Error in /contacts/${req.params.contactId}:`, error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -151,10 +151,10 @@ router.get('/contacts/:contactId', async (req: Request, res: Response) => {
// GET /blocklist
router.get('/blocklist', async (req: Request, res: Response) => {
try {
const result = await nucleoClient.getBlocklist(openWaUrl!);
const result = await whatsappClient.getBlocklist(openWaUrl!);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /blocklist:', error.message);
console.error('[routes/whatsappActions] Error in /blocklist:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -171,10 +171,10 @@ router.post('/blocklist/block', async (req: Request, res: Response) => {
if (!contactId) {
return res.status(400).json({ error: 'Missing "contactId" in request body' });
}
const result = await nucleoClient.blockContact(openWaUrl!, contactId);
const result = await whatsappClient.blockContact(openWaUrl!, contactId);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /blocklist/block:', error.message);
console.error('[routes/whatsappActions] Error in /blocklist/block:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -191,10 +191,10 @@ router.post('/blocklist/unblock', async (req: Request, res: Response) => {
if (!contactId) {
return res.status(400).json({ error: 'Missing "contactId" in request body' });
}
const result = await nucleoClient.unblockContact(openWaUrl!, contactId);
const result = await whatsappClient.unblockContact(openWaUrl!, contactId);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /blocklist/unblock:', error.message);
console.error('[routes/whatsappActions] Error in /blocklist/unblock:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -207,10 +207,10 @@ router.post('/blocklist/unblock', async (req: Request, res: Response) => {
// GET /chats
router.get('/chats', async (req: Request, res: Response) => {
try {
const result = await nucleoClient.getAllChats(openWaUrl!);
const result = await whatsappClient.getAllChats(openWaUrl!);
res.json(result);
} catch (error: any) {
console.error('[routes/nucleoActions] Error in /chats:', error.message);
console.error('[routes/whatsappActions] Error in /chats:', error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });
@@ -241,7 +241,7 @@ router.get('/chats/:chatId/messages', async (req: Request, res: Response) => {
const boolIncludeMe: boolean | undefined = includeMe ? (includeMe as string).toLowerCase() === 'true' : undefined;
const boolIncludeNotifications: boolean | undefined = includeNotifications ? (includeNotifications as string).toLowerCase() === 'true' : undefined;
const result = await nucleoClient.getChatMessages(
const result = await whatsappClient.getChatMessages(
openWaUrl!,
chatId,
numLimit,
@@ -250,7 +250,7 @@ router.get('/chats/:chatId/messages', async (req: Request, res: Response) => {
);
res.json(result);
} catch (error: any) {
console.error(`[routes/nucleoActions] Error in /chats/${req.params.chatId}/messages:`, error.message);
console.error(`[routes/whatsappActions] Error in /chats/${req.params.chatId}/messages:`, error.message);
try {
const parsedError = JSON.parse(error.message.substring(error.message.indexOf('{')));
return res.status(parsedError.status || 500).json({ error: parsedError });

View File

@@ -32,13 +32,13 @@ export async function sendTextMessage(
// Prioritizing response.data.response if it exists.
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error sending text message to ${to}:`, error.message);
console.error(`[whatsappClient] Error sending text message to ${to}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
// Log more detailed error from OpenWA if available
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/sendText): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/sendText): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/sendText): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/sendText): ${error.message}`);
}
}
@@ -64,12 +64,12 @@ export async function sendImageMessage(
const response = await axios.post(`${openWaUrl}/sendImage`, { args });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error sending image message to ${to}:`, error.message);
console.error(`[whatsappClient] Error sending image message to ${to}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/sendImage): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/sendImage): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/sendImage): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/sendImage): ${error.message}`);
}
}
@@ -100,12 +100,12 @@ export async function sendFileMessage(
const response = await axios.post(`${openWaUrl}/sendFile`, { args });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error sending file message to ${to}:`, error.message);
console.error(`[whatsappClient] Error sending file message to ${to}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/sendFile): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/sendFile): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/sendFile): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/sendFile): ${error.message}`);
}
}
@@ -123,12 +123,12 @@ export async function getChatById(
const response = await axios.post(`${openWaUrl}/getChatById`, { args: { chatId } });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error retrieving chat ${chatId}:`, error.message);
console.error(`[whatsappClient] Error retrieving chat ${chatId}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/getChatById): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/getChatById): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/getChatById): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/getChatById): ${error.message}`);
}
}
@@ -150,12 +150,12 @@ export async function createGroup(
});
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error creating group "${groupName}":`, error.message);
console.error(`[whatsappClient] Error creating group "${groupName}":`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/createGroup): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/createGroup): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/createGroup): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/createGroup): ${error.message}`);
}
}
@@ -173,12 +173,12 @@ export async function getContact(
const response = await axios.post(`${openWaUrl}/getContact`, { args: { contactId } });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error retrieving contact ${contactId}:`, error.message);
console.error(`[whatsappClient] Error retrieving contact ${contactId}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/getContact): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/getContact): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/getContact): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/getContact): ${error.message}`);
}
}
@@ -195,12 +195,12 @@ export async function getBlocklist(
const response = await axios.post(`${openWaUrl}/getBlocklist`);
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error retrieving blocklist:`, error.message);
console.error(`[whatsappClient] Error retrieving blocklist:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/getBlocklist): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/getBlocklist): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/getBlocklist): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/getBlocklist): ${error.message}`);
}
}
@@ -218,12 +218,12 @@ export async function blockContact(
const response = await axios.post(`${openWaUrl}/blockContact`, { args: { contactId } });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error blocking contact ${contactId}:`, error.message);
console.error(`[whatsappClient] Error blocking contact ${contactId}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/blockContact): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/blockContact): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/blockContact): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/blockContact): ${error.message}`);
}
}
@@ -241,12 +241,12 @@ export async function unblockContact(
const response = await axios.post(`${openWaUrl}/unblockContact`, { args: { contactId } });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error unblocking contact ${contactId}:`, error.message);
console.error(`[whatsappClient] Error unblocking contact ${contactId}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/unblockContact): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/unblockContact): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/unblockContact): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/unblockContact): ${error.message}`);
}
}
@@ -263,12 +263,12 @@ export async function getAllChats(
const response = await axios.post(`${openWaUrl}/getAllChats`);
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error retrieving all chats:`, error.message);
console.error(`[whatsappClient] Error retrieving all chats:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/getAllChats): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/getAllChats): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/getAllChats): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/getAllChats): ${error.message}`);
}
}
@@ -303,11 +303,11 @@ export async function getChatMessages(
const response = await axios.post(`${openWaUrl}/loadAndGetAllMessagesInChat`, { args });
return response.data?.response || response.data;
} catch (error: any) {
console.error(`[nucleoClient] Error retrieving messages for chat ${chatId}:`, error.message);
console.error(`[whatsappClient] Error retrieving messages for chat ${chatId}:`, error.message);
if (axios.isAxiosError(error) && error.response) {
console.error('[nucleoClient] Axios error details:', error.response.data);
throw new Error(`nucleoClient API error (${openWaUrl}/loadAndGetAllMessagesInChat): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
console.error('[whatsappClient] Axios error details:', error.response.data);
throw new Error(`whatsappClient API error (${openWaUrl}/loadAndGetAllMessagesInChat): ${error.response.status} - ${JSON.stringify(error.response.data)}`);
}
throw new Error(`nucleoClient error (${openWaUrl}/loadAndGetAllMessagesInChat): ${error.message}`);
throw new Error(`whatsappClient error (${openWaUrl}/loadAndGetAllMessagesInChat): ${error.message}`);
}
}