122 lines
4.0 KiB
JavaScript
122 lines
4.0 KiB
JavaScript
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; |