Erste ansprechende Version

This commit is contained in:
rxf
2025-11-24 14:25:24 +01:00
commit 3745a8f728
25 changed files with 1625 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
node_modules
npm-debug.log
.env
.git
.gitignore

View File

@@ -0,0 +1,3 @@
# Environment variables for Docker Compose
MONGO_ROOT_USER=root
MONGO_ROOT_PASSWD=SFluorit

View File

@@ -0,0 +1,24 @@
{
"name": "seniorendienst-backend",
"type": "module",
"version": "1.0.0",
"vdate": "2025-11-24 13:00 UTC",
"description": "",
"main": "index.js",
"scripts": {
"start": "node src/server.js",
"dev": "nodemon src/server.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^17.2.3",
"express": "^5.1.0",
"mongodb": "^7.0.0"
},
"devDependencies": {
"nodemon": "^3.1.11"
}
}

View File

@@ -0,0 +1,40 @@
// src/db/db.js
import 'dotenv/config'; // Importiert und lädt Umgebungsvariablen
import { MongoClient } from 'mongodb';
// MongoDB Verbindungs-URI aus der .env-Datei
const uri = process.env.MONGO_URI;
let db;
/**
* Stellt die Verbindung zur MongoDB her.
* @returns {db} Die verbundene Datenbankinstanz.
*/
export async function connectToDb() {
try {
const client = new MongoClient(uri, {
});
await client.connect();
// Die Datenbankinstanz speichern
db = client.db();
console.log(`✅ Erfolgreich mit MongoDB verbunden.`);
return db;
} catch (error) {
console.error("❌ Fehler bei der Verbindung zur MongoDB:", error);
process.exit(1);
}
}
/**
* Gibt die gespeicherte Datenbankinstanz zurück.
* @returns {db} Die Datenbankinstanz.
*/
export function getDb() {
return db;
}

View File

@@ -0,0 +1,124 @@
// seniorendienst-backend/src/server.js
import 'dotenv/config';
import express from 'express';
import cors from 'cors';
import { connectToDb, getDb } from './db/db.js';
import { ObjectId } from 'mongodb';
const app = express();
const PORT = process.env.PORT || 3002;
// NEU: Nur Service-API
const SERVICE_API = '/api/services';
const COLLECTION_NAME = 'serviceentries';
// --- Middleware ---
app.use(cors({
// Stellen Sie sicher, dass dies 5173 oder den Port Ihres neuen Frontends ist!
origin: 'http://localhost:5173',
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
credentials: true,
}));
app.use(express.json());
// -----------------------------------------------------
// API ROUTEN FÜR SENIORENDIENST
// -----------------------------------------------------
// 1. READ: Alle Einträge abrufen
app.get(SERVICE_API, async (req, res) => {
try {
const db = getDb();
const entries = await db.collection(COLLECTION_NAME)
.find({})
.sort({ appointmentDate: 1 })
.toArray();
res.json(entries);
} catch (error) {
console.error("Fehler beim Abrufen der Service-Einträge:", error);
res.status(500).json({ message: "Interner Serverfehler." });
}
});
// 2. CREATE: Neuen Eintrag erstellen
app.post(SERVICE_API, async (req, res) => {
try {
const db = getDb();
const entryData = req.body;
if (!entryData.name || !entryData.appointmentDate) {
return res.status(400).json({ message: "Name und Termin sind erforderlich." });
}
const result = await db.collection(COLLECTION_NAME).insertOne(entryData);
const newEntry = { _id: result.insertedId, ...entryData };
res.status(201).json(newEntry);
} catch (error) {
console.error("Fehler beim Erstellen des Service-Eintrags:", error);
res.status(500).json({ message: "Interner Serverfehler." });
}
});
// 3. UPDATE: Eintrag aktualisieren
app.put(`${SERVICE_API}/:id`, async (req, res) => {
try {
const db = getDb();
const { id } = req.params;
const updatedFields = req.body;
const filter = { _id: new ObjectId(id) };
delete updatedFields._id;
const result = await db.collection(COLLECTION_NAME).updateOne(
filter,
{ $set: updatedFields }
);
if (result.matchedCount === 0) {
return res.status(404).json({ message: "Eintrag nicht gefunden." });
}
const updatedEntry = await db.collection(COLLECTION_NAME).findOne(filter);
res.json(updatedEntry);
} catch (error) {
console.error(`Fehler beim Aktualisieren des Eintrags ${req.params.id}:`, error);
res.status(400).json({ message: "Ungültige ID oder Serverfehler." });
}
});
// 4. DELETE: Eintrag löschen
app.delete(`${SERVICE_API}/:id`, async (req, res) => {
try {
const db = getDb();
const { id } = req.params;
const filter = { _id: new ObjectId(id) };
const result = await db.collection(COLLECTION_NAME).deleteOne(filter);
if (result.deletedCount === 0) {
return res.status(404).json({ message: "Eintrag nicht gefunden." });
}
res.status(204).send();
} catch (error) {
console.error(`Fehler beim Löschen des Eintrags ${req.params.id}:`, error);
res.status(400).json({ message: "Ungültige ID oder Serverfehler." });
}
});
// --- Server Start Logik (Bleibt unverändert) ---
async function startServer() {
try {
await connectToDb();
app.listen(PORT, () => {
console.log(`🚀 Service Server läuft auf Port ${PORT}`);
});
} catch (error) {
console.error("Fehler beim Starten des Servers:", error);
}
}
startServer();