All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m8s
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.
102 lines
2.7 KiB
TypeScript
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}`
|
|
})
|
|
}
|
|
})
|