/** * 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(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}` }) } })