require('dotenv').config(); const express = require('express'); const cors = require('cors'); const { MongoClient, ObjectId } = require('mongodb'); const app = express(); app.use(cors()); app.use(express.json()); // Statische Dateien (z.B. global.js, CSS) ausliefern app.use(express.static('public')); // Pug als Template Engine einrichten app.set('view engine', 'pug'); app.set('views', './views'); const PORT = process.env.PORT || 3000; const MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017'; const DB_NAME = process.env.DB_NAME || 'espdb'; let db, entriesCollection; // MongoDB-Verbindung herstellen async function initMongo() { const client = new MongoClient(MONGO_URI); await client.connect(); db = client.db(DB_NAME); entriesCollection = db.collection('entries'); console.log(`MongoDB verbunden: ${MONGO_URI}/${DB_NAME}`); } initMongo().catch(err => { console.error('MongoDB Verbindungsfehler:', err); process.exit(1); }); function formatDate(date) { const d = new Date(date); const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // --- Web-Seite (Pug) rendern --- app.get('/', (req, res) => { res.render('index'); }); // --- API --- app.post('/api/save', async (req, res) => { const { espId, sensorNumber } = req.body; if (!espId || !sensorNumber) { return res.status(400).json({ ok: false, error: 'ESP-ID und Sensornummer sind erforderlich' }); } try { const doc = { espId: String(espId).trim(), sensorNumber: String(sensorNumber).trim(), createdAt: new Date() }; const result = await entriesCollection.insertOne(doc); return res.json({ ok: true, id: result.insertedId, entry: doc }); } catch (err) { console.error(err); return res.status(500).json({ ok: false, error: 'DB Fehler' }); } }); app.get('/api/list', async (req, res) => { const page = Math.max(1, parseInt(req.query.page) || 1); const limit = Math.max(1, Math.min(100, parseInt(req.query.limit) || 50)); try { const total = await entriesCollection.countDocuments(); const rawItems = await entriesCollection.find({}) .sort({ createdAt: -1 }) .skip((page - 1) * limit) .limit(limit) .toArray(); const items = rawItems.map(it => ({ ...it, createdAt: formatDate(it.createdAt) })); return res.json({ ok: true, page, limit, total, items }); } catch (err) { console.error(err); return res.status(500).json({ ok: false, error: 'DB Fehler' }); } }); app.delete('/api/entry/:id', async (req, res) => { try { await entriesCollection.deleteOne({ _id: new ObjectId(req.params.id) }); return res.json({ ok: true }); } catch (err) { console.error(err); return res.status(500).json({ ok: false }); } }); app.listen(PORT, () => { console.log(`Server läuft auf http://localhost:${PORT}`); });