import { MongoAPIError, ObjectId } from 'mongodb'; import bcrypt from 'bcrypt'; import { getCollections, update_pflux } from '../db/mongo.js'; export function registerApiRoutes(app, requireLogin) { const { usersCollection, prop_fluxCollection } = getCollections(); app.get('/api/check-email', async (req, res) => { const email = (req.query.email || '').toLowerCase().trim(); if (!email) return res.json({ exists: false }); try { const existingUser = await usersCollection.findOne({ email:`${email}` }); res.json({ exists: !!existingUser }); } catch (err) { console.error(err); res.status(500).json({ error: 'Fehler bei der E-Mail-Prüfung' }); } }); app.post('/api/save', requireLogin, async (req, res) => { let { espId, sensorNumber, name, description} = req.body; if (!espId || !sensorNumber) { return res.json({ error: 'ESP-ID und Sensornummer sind Pflichtfelder' }); } sensorNumber = parseInt(sensorNumber, 10); try { const doc = { id: espId, name: name || '', description: description || '', lastUpdatedAt: new Date() }; await update_pflux(sensorNumber, doc) res.json({ success: true }); } catch (err) { console.error(err); res.status(500).json({ error: 'Fehler beim Speichern' }); } }); app.get('/api/list', requireLogin, async (req, res) => { const { id } = req.query; if (id) { try { const item = await prop_fluxCollection.findOne({ _id: parseInt(id) }); if (item) return res.json([item]); return res.json([]); } catch (err) { console.error(err); return res.status(500).json({ error: 'Fehler beim Laden' }); } } let gesamtZahl = 0 try { gesamtZahl = await prop_fluxCollection.countDocuments({chip: {$exists: true}}) } catch (err) { console.error(err); } const page = parseInt(req.query.page) || 1; const limit = parseInt(req.query.limit) || 50; const skip = (page - 1) * limit; try { const items = await prop_fluxCollection.find({chip: {$exists: true}}) .sort({ "chip.lastUpdatedAt": -1 }) .skip(skip) .limit(limit) .toArray(); const data = {items: items, anzahl: gesamtZahl} res.json(data); } catch (err) { console.error(err); res.status(500).json({ error: 'Fehler beim Laden' }); } }); app.delete('/api/delete/:id', requireLogin, async (req, res) => { await prop_fluxCollection.deleteOne({ _id: parseInt(req.params.id) }); res.json({ success: true }); }); app.post('/api/createUser', requireLogin, async (req, res) => { if (!req.session.isAdmin) return res.status(403).json({ error: 'Nur Admins erlaubt' }); const { username, password, role } = req.body; if (!username || !password) return res.status(400).json({ error: 'Benutzername und Passwort erforderlich' }); try { const hash = await bcrypt.hash(password, 10); await usersCollection.insertOne({ email: username.toLowerCase(), passwordHash: hash, role: role || 'user' }); res.json({ success: true }); } catch (err) { res.status(500).json({ error: 'Fehler beim Anlegen' }); } }); }