diff --git a/whatsapp-router/src/index.ts b/whatsapp-router/src/index.ts index b4314b6..28e6e47 100644 --- a/whatsapp-router/src/index.ts +++ b/whatsapp-router/src/index.ts @@ -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}`); diff --git a/whatsapp-router/src/routes/conversations.ts b/whatsapp-router/src/routes/conversationActions.ts similarity index 100% rename from whatsapp-router/src/routes/conversations.ts rename to whatsapp-router/src/routes/conversationActions.ts diff --git a/whatsapp-router/src/routes/nucleoActions.ts b/whatsapp-router/src/routes/whatsappActions.ts similarity index 81% rename from whatsapp-router/src/routes/nucleoActions.ts rename to whatsapp-router/src/routes/whatsappActions.ts index 4c3c585..a288b3b 100644 --- a/whatsapp-router/src/routes/nucleoActions.ts +++ b/whatsapp-router/src/routes/whatsappActions.ts @@ -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 }); diff --git a/whatsapp-router/src/nucleoClient.ts b/whatsapp-router/src/whatsappClient.ts similarity index 68% rename from whatsapp-router/src/nucleoClient.ts rename to whatsapp-router/src/whatsappClient.ts index da7eae9..ea3b369 100644 --- a/whatsapp-router/src/nucleoClient.ts +++ b/whatsapp-router/src/whatsappClient.ts @@ -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}`); } }