const express = require('express'); const router = express.Router(); const { getDb } = require('../database'); const { verifyApiKey } = require('../middleware/auth'); const { sendPrivateMessage } = require('../utils/nostr'); const logger = require('../utils/logger'); // Apply API key verification middleware to all routes router.use(verifyApiKey); // Send a private message router.post('/send', async(req, res) => { try { const { recipient, content, relays } = req.body; // Validate required fields if (!recipient || !content) { return res.status(400).json({ error: 'Bad Request', message: 'Recipient and content are required' }); } // Send private message const eventId = await sendPrivateMessage( recipient, content, Array.isArray(relays) ? relays : [] ); // Format relays as comma-separated string const relaysString = Array.isArray(relays) ? relays.join(',') : ''; // Save to database const db = getDb(); db.run( `INSERT INTO sent_messages (recipient_pubkey, message, timestamp, relays, event_id) VALUES (?, ?, ?, ?, ?)`, [recipient, content, Math.floor(Date.now() / 1000), relaysString, eventId], function(err) { if (err) { logger.error('Database error when saving sent message:', err); return res.status(500).json({ error: 'Internal Server Error', message: 'Message sent but failed to save to database' }); } // Return success response res.status(201).json({ message: 'Private message sent successfully', event_id: eventId, message_id: this.lastID }); } ); } catch (error) { logger.error('Error sending private message:', error); res.status(500).json({ error: 'Internal Server Error', message: 'Failed to send private message' }); } }); // List sent messages router.get('/sent', (req, res) => { try { // Query parameters const limit = parseInt(req.query.limit) || 50; const offset = parseInt(req.query.offset) || 0; const recipient = req.query.recipient; // Build query let query = `SELECT * FROM sent_messages`; const params = []; if (recipient) { query += ` WHERE recipient_pubkey = ?`; params.push(recipient); } query += ` ORDER BY timestamp DESC LIMIT ? OFFSET ?`; params.push(limit, offset); // Query database const db = getDb(); db.all(query, params, (err, messages) => { if (err) { logger.error('Database error when listing sent messages:', err); return res.status(500).json({ error: 'Internal Server Error', message: 'Failed to list sent messages' }); } // Format messages const formattedMessages = messages.map(msg => ({ id: msg.id, recipient_pubkey: msg.recipient_pubkey, message: msg.message, timestamp: msg.timestamp, relays: msg.relays ? msg.relays.split(',') : [], event_id: msg.event_id, created_at: msg.created_at })); // Return messages res.status(200).json({ count: formattedMessages.length, messages: formattedMessages }); }); } catch (error) { logger.error('Error listing sent messages:', error); res.status(500).json({ error: 'Internal Server Error', message: 'Failed to list sent messages' }); } }); module.exports = router;