Files
Nostr-post-scheduler/src/routes/message.js
T
2025-03-01 16:46:45 +01:00

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;