Mongo-Zugriff passt jetzt

Adresse wird richtig geholt
Daten werden in prop_flux gespeichert
This commit is contained in:
2025-08-18 13:35:59 +00:00
parent 81c92dcd5c
commit 61f8dec32f
3 changed files with 76 additions and 29 deletions

View File

@@ -1,10 +1,12 @@
import { MongoClient } from 'mongodb';
import dotenv from 'dotenv';
dotenv.config();
const MONGO_ROOT_USER = process.env.MONGO_ROOT_USER;
const MONGO_ROOT_PASSWORD = process.env.MONGO_ROOT_PASSWORD;
let MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017';
if (MONGO_ROOT_USER && MONGO_ROOT_PASSWORD) {
/* if (MONGO_ROOT_USER && MONGO_ROOT_PASSWORD) {
const uriParts = MONGO_URI.split('://');
if (uriParts.length === 2) {
const protocol = uriParts[0];
@@ -12,9 +14,11 @@ if (MONGO_ROOT_USER && MONGO_ROOT_PASSWORD) {
MONGO_URI = `${protocol}://${encodeURIComponent(MONGO_ROOT_USER)}:${encodeURIComponent(MONGO_ROOT_PASSWORD)}@${rest}`;
}
}
*/
const DB_NAME = process.env.DB_NAME || 'espdb';
let db, entriesCollection, usersCollection;
let db, entriesCollection, usersCollection, prop_fluxCollection;
export async function initMongo() {
const client = new MongoClient(MONGO_URI);
@@ -22,9 +26,20 @@ export async function initMongo() {
db = client.db(DB_NAME);
entriesCollection = db.collection('entries');
usersCollection = db.collection('users');
prop_fluxCollection = db.collection('prop_flux');
return { db, entriesCollection, usersCollection };
}
export function getCollections() {
return { db, entriesCollection, usersCollection };
}
export const update_pflux = async(sn, doc) => {
try {
let r = await prop_fluxCollection.findOne({_id: sn})
await prop_fluxCollection.updateOne({_id: sn},{ $set: { 'chip': doc}})
return {"error": null}
} catch (e) {
return { "error": true, "what": e}
}
}

View File

@@ -1,4 +1,5 @@
import { getCollections } from '../db/mongo.js';
import { MongoClient } from 'mongodb';
import { update_pflux } from '../db/mongo.js';
export function registerAddressRoute(app, requireLogin) {
const ADDRESS_SERVICE_URL = process.env.ADDRESS_SERVICE_URL || 'https://noise.fuerst-stuttgart.de/srv/getaddress';
@@ -8,26 +9,59 @@ export function registerAddressRoute(app, requireLogin) {
if (isNaN(sensorNumber)) {
return res.status(400).json({ error: 'Ungültige Sensornummer' });
}
const url = ADDRESS_SERVICE_URL + `?sensorid=${encodeURIComponent(sensorNumber)}`;
try {
const r = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (!r.ok) {
return res.status(502).json({ error: `Adressdienst Fehler (${r.status})` });
}
const data = await r.json();
const addrObj = data?.erg?.address || data?.address || {};
const street = addrObj.street ?? '';
const plz = addrObj.plz ?? '';
const city = addrObj.city ?? '';
const rightPart = [plz, city].filter(Boolean).join(' ').trim();
const addressString = [street, rightPart].filter(Boolean).join(', ');
return res.json({
address: addressString,
parts: { street, plz, city }
});
} catch (err) {
console.error('Address lookup failed:', err);
return res.status(504).json({ error: 'Adressdienst nicht erreichbar' });
// Verbindung zur sensor_data DB
const mongoUri = process.env.MONGO_URI || 'mongodb://localhost:27017';
const client = new MongoClient(mongoUri);
await client.connect();
const sensorDb = client.db('sensor_data');
const properties = sensorDb.collection('properties');
const propFlux = sensorDb.collection('prop_flux');
// Suche nach Sensornummer als _id
const propEntry = await properties.findOne({ _id: sensorNumber });
if (!propEntry) {
await client.close();
return res.status(404).json({ error: 'Sensor nicht gefunden' });
}
// Kopiere nach prop_flux mit sensorNumber als _id
try {
await propFlux.replaceOne(
{ _id: sensorNumber },
{ ...propEntry, _id: sensorNumber },
{ upsert: true }
);
} catch (err) {
console.error('Fehler beim Kopieren nach prop_flux:', err);
// Kein Abbruch, nur Logging
}
// Adresse wie bisher holen (über die Sensornummer via nominative)
let addressString = '';
let addrParts = {};
try {
const url = ADDRESS_SERVICE_URL + `?sensorid=${encodeURIComponent(propEntry._id)}`;
const r = await fetch(url, { headers: { 'Accept': 'application/json' } });
if (r.ok) {
const data = await r.json();
const addrObj = data?.erg?.address || data?.address || {};
const street = addrObj.street ?? '';
const plz = addrObj.plz ?? '';
const city = addrObj.city ?? '';
const rightPart = [plz, city].filter(Boolean).join(' ').trim();
addressString = [street, rightPart].filter(Boolean).join(', ');
addrParts = { street, plz, city };
}
} catch (err) {
console.error('Address lookup failed:', err);
}
await client.close();
return res.json({
address: addressString,
parts: addrParts,
propEntry
});
});
}

View File

@@ -1,6 +1,6 @@
import { ObjectId } from 'mongodb';
import { MongoAPIError, ObjectId } from 'mongodb';
import bcrypt from 'bcrypt';
import { getCollections } from '../db/mongo.js';
import { getCollections, update_pflux } from '../db/mongo.js';
export function registerApiRoutes(app, requireLogin) {
const { entriesCollection, usersCollection } = getCollections();
@@ -25,14 +25,12 @@ export function registerApiRoutes(app, requireLogin) {
sensorNumber = parseInt(sensorNumber, 10);
try {
const doc = {
espId,
sensorNumber,
id: espId,
name: name || '',
description: description || '',
address: address || '',
createdAt: new Date()
};
await entriesCollection.insertOne(doc);
await update_pflux(sensorNumber, doc)
res.json({ success: true });
} catch (err) {
console.error(err);