All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 51s
El evento messages.upsert no siempre se dispara para mensajes enviados. Guardar manualmente el mensaje en el endpoint de envio.
82 lines
2.1 KiB
TypeScript
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}`
|
|
})
|
|
}
|
|
})
|