First commit - V 1.0.0

This commit is contained in:
rxf
2025-08-12 13:44:06 +00:00
commit 52fb37517a
11 changed files with 1814 additions and 0 deletions

102
server.js Normal file
View File

@@ -0,0 +1,102 @@
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}`);
});