Files
whatsappNucleo/server/api/messages/[instanceId]/[chatId]/send.post.ts
josedario87 95a93a1a10
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 51s
Fix: guardar mensaje enviado en la base de datos
El evento messages.upsert no siempre se dispara para mensajes enviados.
Guardar manualmente el mensaje en el endpoint de envio.
2025-12-02 20:01:35 -06:00

82 lines
2.1 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
}
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
try {
const result = await baileysManager.sendMessage(instanceId!, jid, {
text: messageText
})
// 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
) VALUES ($1, $2, $3, $4, $5, $6, $7, NOW(), $8)
ON CONFLICT (instance_id, message_id) DO NOTHING`,
[
instanceId,
chatId,
result.key.id,
'me',
true,
'text',
messageText,
'sent'
]
)
// 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}`
})
}
})