Files
whatsappNucleo/server/api/messages/[instanceId]/[chatId]/send.post.ts
josedario87 e8b74e71de
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m30s
Fix: Agregar soporte para mensajes de respuesta (reply) en envío de texto
El endpoint send.post.ts ignoraba el campo quotedMessageId que el frontend
enviaba, causando que los mensajes de respuesta llegaran como mensajes normales.
2025-12-03 10:56:10 -06:00

101 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
const content: any = { text: messageText }
if (quotedMessage) {
content.quoted = quotedMessage
}
const result = await baileysManager.sendMessage(instanceId!, jid, content)
// 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}`
})
}
})