Files
whatsappNucleo/server/api/messages/[instanceId]/[chatId]/send.post.ts
josedario87 09d3c5398a
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m8s
Fix: Pasar quoted como opción de Baileys, no dentro del content
El campo quoted debe ir en el tercer parámetro (opciones) de sendMessage,
no dentro del objeto content. Esto corrige el envío de respuestas.
2025-12-03 11:07:06 -06:00

102 lines
2.7 KiB
TypeScript

/**
* POST /api/messages/:instanceId/:chatId/send
* Send a message to a chat (from UI)
*/
import { query } from '../../../../utils/database'
import { baileysManager } from '../../../../services/baileys/manager'
interface SendMessageBody {
content?: string
message?: string
quotedMessageId?: string
}
export default defineEventHandler(async (event) => {
const username = getHeader(event, 'x-authentik-username')
if (!username) {
throw createError({ statusCode: 401, message: 'Unauthorized' })
}
const instanceId = getRouterParam(event, 'instanceId')
const chatId = getRouterParam(event, 'chatId')
const body = await readBody<SendMessageBody>(event)
// Accept both 'content' and 'message' fields
const messageText = body.content || body.message
if (!messageText?.trim()) {
throw createError({ statusCode: 400, message: 'Message content is required' })
}
// Get chat JID
const chatResult = await query<{ jid: string }>(
'SELECT jid FROM chats WHERE id = $1 AND instance_id = $2',
[chatId, instanceId]
)
if (chatResult.rows.length === 0) {
throw createError({ statusCode: 404, message: 'Chat not found' })
}
const jid = chatResult.rows[0].jid
// Get quoted message if provided
let quotedMessage = null
if (body.quotedMessageId) {
const quotedResult = await query(
'SELECT raw_message FROM messages WHERE message_id = $1 AND instance_id = $2',
[body.quotedMessageId, instanceId]
)
if (quotedResult.rows.length > 0) {
quotedMessage = quotedResult.rows[0].raw_message
}
}
try {
// Build message content and options
const content: any = { text: messageText }
const options: any = {}
if (quotedMessage) {
options.quoted = quotedMessage
}
const result = await baileysManager.sendMessage(instanceId!, jid, content, options)
// Save sent message to database
await query(
`INSERT INTO messages (
instance_id, chat_id, message_id, from_jid, from_me,
message_type, content, timestamp, status, raw_message, quoted_message_id
) VALUES ($1, $2, $3, $4, $5, $6, $7, NOW(), $8, $9, $10)
ON CONFLICT (instance_id, message_id) DO NOTHING`,
[
instanceId,
chatId,
result.key.id,
'me',
true,
'text',
messageText,
'sent',
JSON.stringify(result),
body.quotedMessageId || null
]
)
// Update chat last message time
await query(
`UPDATE chats SET last_message_at = NOW() WHERE id = $1`,
[chatId]
)
return {
success: true,
messageId: result.key.id
}
} catch (error) {
throw createError({
statusCode: 500,
message: `Failed to send message: ${(error as Error).message}`
})
}
})