ntfy-emergency-app/server.js

89 lines
2.5 KiB
JavaScript
Raw Normal View History

2025-10-16 09:50:36 +02:00
const express = require('express');
const axios = require('axios');
const path = require('path');
2025-10-17 19:35:19 +02:00
require('dotenv').config();
2025-10-16 09:50:36 +02:00
const app = express();
const PORT = process.env.PORT || 3000;
// Environment variables for ntfy configuration
const NTFY_URL = process.env.NTFY_URL;
const NTFY_USER = process.env.NTFY_USER;
const NTFY_PASSWORD = process.env.NTFY_PASSWORD;
2025-10-18 18:13:47 +02:00
const NTFY_TOPIC = process.env.NTFY_TOPIC;
2025-10-18 18:14:35 +02:00
const UI_MESSAGE = process.env.UI_MESSAGE || 'Emergency Message';
2025-10-16 09:50:36 +02:00
// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));
// Validate environment variables
if (!NTFY_URL || !NTFY_USER || !NTFY_PASSWORD) {
console.error('Missing required environment variables: NTFY_URL, NTFY_USER, NTFY_PASSWORD');
process.exit(1);
}
// Route to serve the main page
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
2025-10-18 18:13:47 +02:00
// Route to get UI configuration
app.get('/api/config', (req, res) => {
res.json({
uiMessage: UI_MESSAGE || 'Emergency Message'
});
});
2025-10-16 09:50:36 +02:00
// Route to handle message submission
app.post('/send-message', async (req, res) => {
try {
const { name, message } = req.body;
// Validate input
if (!name || !message) {
return res.status(400).json({
success: false,
2025-10-17 19:35:19 +02:00
error: 'Name and message are required'
2025-10-16 09:50:36 +02:00
});
}
// Concatenate name and message
const fullMessage = `${name}: ${message}`;
// Send to ntfy
const ntfyResponse = await axios.post(`${NTFY_URL}/${NTFY_TOPIC}`, fullMessage, {
auth: {
username: NTFY_USER,
password: NTFY_PASSWORD
},
headers: {
'Content-Type': 'text/plain'
}
});
if (ntfyResponse.status === 200) {
2025-10-17 19:35:19 +02:00
res.json({ success: true, message: 'Message sent successfully' });
2025-10-16 09:50:36 +02:00
} else {
res.status(500).json({
success: false,
2025-10-17 19:35:19 +02:00
error: 'Error sending message'
2025-10-16 09:50:36 +02:00
});
}
} catch (error) {
console.error('Error sending message:', error.message);
res.status(500).json({
success: false,
2025-10-17 19:35:19 +02:00
error: 'Internal server error'
2025-10-16 09:50:36 +02:00
});
}
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log(`Ntfy URL: ${NTFY_URL}`);
console.log(`Ntfy Topic: ${NTFY_TOPIC}`);
});