Eingabe und Listing funktionieren erst mal
This commit is contained in:
19
db/mongo.js
19
db/mongo.js
@@ -16,9 +16,9 @@ let MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017';
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const DB_NAME = process.env.DB_NAME || 'espdb';
|
const DB_NAME = process.env.DB_NAME || 'sensor_data';
|
||||||
|
|
||||||
let db, entriesCollection, usersCollection, prop_fluxCollection;
|
let db, entriesCollection, usersCollection, prop_fluxCollection, propertiesCollection;
|
||||||
|
|
||||||
export async function initMongo() {
|
export async function initMongo() {
|
||||||
const client = new MongoClient(MONGO_URI);
|
const client = new MongoClient(MONGO_URI);
|
||||||
@@ -27,11 +27,12 @@ export async function initMongo() {
|
|||||||
entriesCollection = db.collection('entries');
|
entriesCollection = db.collection('entries');
|
||||||
usersCollection = db.collection('users');
|
usersCollection = db.collection('users');
|
||||||
prop_fluxCollection = db.collection('prop_flux');
|
prop_fluxCollection = db.collection('prop_flux');
|
||||||
|
propertiesCollection = db.collection('properties')
|
||||||
return { db, entriesCollection, usersCollection };
|
return { db, entriesCollection, usersCollection };
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCollections() {
|
export function getCollections() {
|
||||||
return { db, entriesCollection, usersCollection };
|
return { db, entriesCollection, usersCollection, prop_fluxCollection };
|
||||||
}
|
}
|
||||||
|
|
||||||
export const update_pflux = async(sn, doc) => {
|
export const update_pflux = async(sn, doc) => {
|
||||||
@@ -43,3 +44,15 @@ export const update_pflux = async(sn, doc) => {
|
|||||||
return { "error": true, "what": e}
|
return { "error": true, "what": e}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const get_pflux = async(sn) => {
|
||||||
|
try {
|
||||||
|
let r = await prop_fluxCollection.findOne({_id: sn})
|
||||||
|
if (r == null) {
|
||||||
|
return { "error": true, "what": "Not found", "erg": r}
|
||||||
|
}
|
||||||
|
return {"error": null, "what": null, "erg": r}
|
||||||
|
} catch (e) {
|
||||||
|
return { "error": true, "what": e, "erg": null}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -57,6 +57,16 @@ async function fetchAddressIfValid() {
|
|||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (!data.error && data.address) {
|
if (!data.error && data.address) {
|
||||||
addressInput.value = data.address;
|
addressInput.value = data.address;
|
||||||
|
// Felder automatisch füllen, wenn props vorhanden
|
||||||
|
if (!data.props.error) {
|
||||||
|
if(data.props.erg.chip !== undefined) {
|
||||||
|
let pp = data.props.erg.chip
|
||||||
|
espIdInput.value = pp.id || ''
|
||||||
|
nameInput.value = pp.name || ''
|
||||||
|
descriptionInput.value = pp.description || ''
|
||||||
|
// Weitere Felder nach Bedarf
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
addressInput.value = '';
|
addressInput.value = '';
|
||||||
sensorNumberInput.disabled = true;
|
sensorNumberInput.disabled = true;
|
||||||
@@ -145,19 +155,14 @@ sensorNumberInput.addEventListener('blur', fetchAddressIfValid);
|
|||||||
|
|
||||||
tableBody.innerHTML = '';
|
tableBody.innerHTML = '';
|
||||||
items.forEach(item => {
|
items.forEach(item => {
|
||||||
const date = new Date(item.createdAt).toISOString().split('T')[0];
|
const date = new Date(item.chip.createdAt).toISOString().split('T')[0];
|
||||||
const tr = document.createElement('tr');
|
const tr = document.createElement('tr');
|
||||||
tr.innerHTML = `
|
tr.innerHTML = `
|
||||||
<td>${item.espId}</td>
|
<td>${item._id}</td>
|
||||||
<td>${item.sensorNumber}</td>
|
<td>${item.chip.id}</td>
|
||||||
<td>${item.name || ''}</td>
|
<td>${item.chip.name || ''}</td>
|
||||||
<td>${item.description || ''}</td>
|
<td id="tdBeschreibung">${item.chip.description || ''}</td>
|
||||||
<td>${item.address || ''}</td>
|
<td id="tdDate">${date}</td>
|
||||||
<td>${date}</td>
|
|
||||||
<td>
|
|
||||||
<button data-id="${item._id}" class="editBtn">Bearbeiten</button>
|
|
||||||
<button data-id="${item._id}" class="deleteBtn">Löschen</button>
|
|
||||||
</td>
|
|
||||||
`;
|
`;
|
||||||
tableBody.appendChild(tr);
|
tableBody.appendChild(tr);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -103,6 +103,18 @@ th, td {
|
|||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#tdDate {
|
||||||
|
width: 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tdBeschreibung {
|
||||||
|
width: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tdAktionen {
|
||||||
|
width: 20em;
|
||||||
|
}
|
||||||
|
|
||||||
.controls input#page,
|
.controls input#page,
|
||||||
.controls input#limit {
|
.controls input#limit {
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { MongoClient } from 'mongodb';
|
import { MongoClient } from 'mongodb';
|
||||||
import { update_pflux } from '../db/mongo.js';
|
import { get_pflux } from '../db/mongo.js';
|
||||||
|
|
||||||
export function registerAddressRoute(app, requireLogin) {
|
export function registerAddressRoute(app, requireLogin) {
|
||||||
const ADDRESS_SERVICE_URL = process.env.ADDRESS_SERVICE_URL || 'https://noise.fuerst-stuttgart.de/srv/getaddress';
|
const ADDRESS_SERVICE_URL = process.env.ADDRESS_SERVICE_URL || 'https://noise.fuerst-stuttgart.de/srv/getaddress';
|
||||||
@@ -25,7 +25,10 @@ export function registerAddressRoute(app, requireLogin) {
|
|||||||
return res.status(404).json({ error: 'Sensor nicht gefunden' });
|
return res.status(404).json({ error: 'Sensor nicht gefunden' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kopiere nach prop_flux mit sensorNumber als _id
|
// Sensor bekannt -> Wurde der schon rüber kopiert?
|
||||||
|
const propsF = await get_pflux(sensorNumber)
|
||||||
|
if(!propsF.erg) {
|
||||||
|
// nein, also kopieren nach prop_flux mit sensorNumber als _id
|
||||||
try {
|
try {
|
||||||
await propFlux.replaceOne(
|
await propFlux.replaceOne(
|
||||||
{ _id: sensorNumber },
|
{ _id: sensorNumber },
|
||||||
@@ -36,6 +39,7 @@ export function registerAddressRoute(app, requireLogin) {
|
|||||||
console.error('Fehler beim Kopieren nach prop_flux:', err);
|
console.error('Fehler beim Kopieren nach prop_flux:', err);
|
||||||
// Kein Abbruch, nur Logging
|
// Kein Abbruch, nur Logging
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Adresse wie bisher holen (über die Sensornummer via nominative)
|
// Adresse wie bisher holen (über die Sensornummer via nominative)
|
||||||
let addressString = '';
|
let addressString = '';
|
||||||
@@ -58,10 +62,11 @@ export function registerAddressRoute(app, requireLogin) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await client.close();
|
await client.close();
|
||||||
|
|
||||||
return res.json({
|
return res.json({
|
||||||
address: addressString,
|
address: addressString,
|
||||||
parts: addrParts,
|
parts: addrParts,
|
||||||
propEntry
|
props: propsF
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import bcrypt from 'bcrypt';
|
|||||||
import { getCollections, update_pflux } from '../db/mongo.js';
|
import { getCollections, update_pflux } from '../db/mongo.js';
|
||||||
|
|
||||||
export function registerApiRoutes(app, requireLogin) {
|
export function registerApiRoutes(app, requireLogin) {
|
||||||
const { entriesCollection, usersCollection } = getCollections();
|
const { entriesCollection, usersCollection, prop_fluxCollection } = getCollections();
|
||||||
|
|
||||||
app.get('/api/check-email', async (req, res) => {
|
app.get('/api/check-email', async (req, res) => {
|
||||||
const email = (req.query.email || '').toLowerCase().trim();
|
const email = (req.query.email || '').toLowerCase().trim();
|
||||||
@@ -46,7 +46,7 @@ export function registerApiRoutes(app, requireLogin) {
|
|||||||
}
|
}
|
||||||
sensorNumber = parseInt(sensorNumber, 10);
|
sensorNumber = parseInt(sensorNumber, 10);
|
||||||
try {
|
try {
|
||||||
await entriesCollection.updateOne(
|
await prop_fluxCollection.updateOne(
|
||||||
{ _id: new ObjectId(id) },
|
{ _id: new ObjectId(id) },
|
||||||
{ $set: { espId, sensorNumber, name, description, address } }
|
{ $set: { espId, sensorNumber, name, description, address } }
|
||||||
);
|
);
|
||||||
@@ -61,7 +61,7 @@ export function registerApiRoutes(app, requireLogin) {
|
|||||||
const { id } = req.query;
|
const { id } = req.query;
|
||||||
if (id) {
|
if (id) {
|
||||||
try {
|
try {
|
||||||
const item = await entriesCollection.findOne({ _id: new ObjectId(id) });
|
const item = await prop_fluxCollection.findOne({ _id: new ObjectId(id) });
|
||||||
if (item) return res.json([item]);
|
if (item) return res.json([item]);
|
||||||
return res.json([]);
|
return res.json([]);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -73,8 +73,8 @@ export function registerApiRoutes(app, requireLogin) {
|
|||||||
const limit = parseInt(req.query.limit) || 10;
|
const limit = parseInt(req.query.limit) || 10;
|
||||||
const skip = (page - 1) * limit;
|
const skip = (page - 1) * limit;
|
||||||
try {
|
try {
|
||||||
const items = await entriesCollection.find({})
|
const items = await prop_fluxCollection.find({chip: {$exists: true}})
|
||||||
.sort({ createdAt: -1 })
|
.sort({ "chip.createdAt": -1 })
|
||||||
.skip(skip)
|
.skip(skip)
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
.toArray();
|
.toArray();
|
||||||
@@ -86,7 +86,7 @@ export function registerApiRoutes(app, requireLogin) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.delete('/api/delete/:id', requireLogin, async (req, res) => {
|
app.delete('/api/delete/:id', requireLogin, async (req, res) => {
|
||||||
await entriesCollection.deleteOne({ _id: new ObjectId(req.params.id) });
|
await prop_fluxCollection.deleteOne({ _id: new ObjectId(req.params.id) });
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ html(lang="de")
|
|||||||
textarea#description
|
textarea#description
|
||||||
|
|
||||||
label(for="address") Anschrift:
|
label(for="address") Anschrift:
|
||||||
input#address(type="text" placeholder="Wird automatisch ausgefüllt" readonly)
|
input#address(type="text" placeholder="Wird automatisch ausgefüllt" readonly disabled)
|
||||||
|
|
||||||
button#saveBtn(type="button") Speichern
|
button#saveBtn(type="button") Speichern
|
||||||
div#result
|
div#result
|
||||||
@@ -50,9 +50,7 @@ html(lang="de")
|
|||||||
th ESP-ID
|
th ESP-ID
|
||||||
th Bezeichnung
|
th Bezeichnung
|
||||||
th Beschreibung
|
th Beschreibung
|
||||||
th Anschrift
|
|
||||||
th Datum
|
th Datum
|
||||||
th Aktionen
|
|
||||||
tbody
|
tbody
|
||||||
script(type="module" src="/global.js")
|
script(type="module" src="/global.js")
|
||||||
script.
|
script.
|
||||||
|
|||||||
Reference in New Issue
Block a user