Commit the app code currently running in Docker, including scheduler, store status, journal reminder, maintenance mode, and Foodsharing API check updates. Remove generated runtime logs from version control and ignore local runtime captures.
pickup-config
Foodsharing pickup-config ist eine kombinierte React/Express-Anwendung, mit der Teams ihre Pickup-Slots konfigurieren, Benachrichtigungen pflegen und das Store-Watch-Monitoring (Team-Status) steuern können. Die App synchronisiert regelmäßig Betriebe, unterstützt Admin-spezifische Einstellungen und speichert benutzerbezogene Präferenzen (z. B. Geokoordinaten) lokal im config/-Verzeichnis.
Inhalt
- Architekturüberblick
- Voraussetzungen
- Installation & Entwicklung
- Konfiguration & Umgebungsvariablen
- Wichtige npm-Skripte
- Testing
- Verzeichnisstruktur
- Produktions-Build & Deployment
- Häufige Workflows
Architekturüberblick
| Bereich | Beschreibung |
|---|---|
| Client (React) | Lives unter src/ (CRA). Ansicht „Slots buchen“ verwaltet Pickup-Konfigurationen, „Betriebs-Monitoring“ bündelt Store-Watch. Komponenten sind funktionsorientiert, Hooks kapseln API-Logik. |
| Server (Express) | server.js liefert Produktions-Builds, proxied API-Aufrufe zur Foodsharing-API, persistiert Configs on-disk (config/) und betreibt den Scheduler (services/). |
| Scheduler / Services | services/ enthält Cron-Jobs (Pickup & Store-Watch), Notification-Integrationen sowie Stores für Config, Watcher, Preferences, etc. |
| Datenablage | config/ (lokal verbleibend, gitignored) speichert Laufzeitdaten wie pickup-config.json, Admin-Settings, Store-Watch-Status u. a. |
| Deployment | Dockerfile + docker-compose.yml ermöglichen containerisierte Builds. |
Voraussetzungen
- Node.js v24.11.0 (siehe
.nvmrcfürnvm use) - npm ≥ 11 (im Node-Release enthalten)
Für konsistente Builds immer mit exakt dieser Version arbeiten.
Installation & Entwicklung
- Abhängigkeiten installieren
npm ci - Lokale Entwicklung (React-Devserver)
npm start- Läuft auf Port 3000 (CRA Defaults).
- Nutzt Live-Reloading & Proxy-Konfiguration zu den Express-APIs.
- Express-Server (Produktion, lokal)
npm run build node server.js- Baut das Frontend (nach
build/) und startet den Express-Server (PortPORToder 3000). - Server lädt beim Start bestehende Sessions, Scheduler, Configs.
- Baut das Frontend (nach
⚠️ Die Foodsharing-APIs erfordern gültige Credentials. Hinterlege sie per UI (Login) oder
config/.
Konfiguration & Umgebungsvariablen
| Variable | Beschreibung |
|---|---|
PORT |
Port für node server.js. Default: 3000. |
ADMIN_EMAIL |
E-Mail-Adresse, die Admin-Rechte erhält (Vergleich in server.js). |
Weitere Laufzeitdaten:
config/– persistente JSON-Dateien (nicht ins Repo einchecken).data/– ggf. Seeds (defaultConfig.js)..env/.env.example– ggf. ergänzen, wenn neue Variablen eingeführt werden.
Wichtige npm-Skripte
| Script | Zweck |
|---|---|
npm start |
CRA-Devserver inkl. Live-Reload. |
npm run build |
Produktionsbundle (CRA). |
npm test |
Jest/RTL-Tests (Watch-Mode). Für CI CI=true npm test. |
npm run check:foodsharing-api |
Prüft die genutzten Foodsharing-Endpunkte gegen https://foodsharing.de/api/doc. |
node server.js |
Express-Server (liefert build/, API & Scheduler). |
Docker:
docker-compose up --build
Testing
Standardtests laufen mit:
CI=true npm test
- Nutzt React Testing Library.
- Ergänzende Tests pro Komponente (Datei
*.test.jsneben den Komponenten). - Für Scheduler/Services sind Integrationstests sinnvoll (derzeit nicht vorhanden).
Verzeichnisstruktur
| Pfad | Inhalt |
|---|---|
src/ |
React-Quellcode (Komponenten, Hooks, Utils). |
public/ |
CRA-Statics. |
services/ |
Node-Services (Scheduler, Notification, Stores, AdminConfig). |
config/ |
Laufzeitdaten (JSON). Gitignored – niemals commiten. |
build/ |
Output von npm run build. Niemals manuell anpassen. |
docker-compose.yml, Dockerfile, rebuildContainer.sh |
Deployment-Artefakte. |
Produktions-Build & Deployment
- Frontend bauen
npm run build - Server starten
node server.js - Container (optional)
docker-compose up --build- Container läuft mit dem gebauten Bundle & Express-Server.
- Nach relevanten Änderungen an
server.js,services/,src/,Dockerfileoderdocker-compose.ymlden Container immer neu bauen und neu starten:oder alternativ:docker compose up -d --build./rebuildContainer.sh
Abschluss-Checkliste nach relevanten Änderungen
Bei Änderungen an server.js, services/, src/, Dockerfile, docker-compose.yml oder der Foodsharing-API-Integration immer vollständig ausführen:
- Tests:
CI=true npm test -- --watch=false - Produktions-Build:
npm run build - Falls Foodsharing-Endpunkte oder Payloads betroffen sind:
npm run check:foodsharing-api - Container neu bauen und starten:
docker compose up -d --build - Laufenden Dienst prüfen:
Erwartet wird ein JSON mit
curl http://localhost:3005/api/health\"status\":\"ok\".
Beachte: config/ muss beschreibbar sein, da dort u. a. Session- und Watcher-Infos landen.
Häufige Workflows
Slots buchen (Dashboard, „Slots buchen“ Tab)
- Login -> Slots konfigurieren (Aktivieren/Deaktivieren, Wochentage, Datumsspannen).
- Änderungen via „Konfiguration speichern“ persistieren.
- Standort ermitteln für Entfernungssortierung (wird in
userPreferencesabgelegt und durch/api/location/nearest-storeergänzt).
Store-Watch
- Tab „Betriebs-Monitoring“.
- Regionen laden, Team-Status verfolgen, Watchlist pflegen.
- Admin-Buttons („Regionen neu laden“ etc.) erscheinen nur für Admins.
Notifications
- Zahnrad-Button öffnet das Notification-Panel (auf beiden Tabs).
- Erlaubt ntfy- und Telegram-Einstellungen, Standortverwaltung sowie Testversand.
Admin-Settings
- Tab „Admin“ (nur Admin-E-Mail).
- Globale Cron-/Delay-Einstellungen, Notifications für alle, Ignored Slots.
- „Zu Slots buchen“-Button führt zurück zum Hauptdashboard.
Hilfe / Troubleshooting
- Node-Version mismatch →
nvm use(siehe.nvmrc). - Leere Daten / keine Betriebe →
npm run build && node server.jsoder in der UI „Betriebe aktualisieren“ (Admin), ggf. Logs prüfen. - Standortbestimmung → Browser muss Geolocation erlauben; Backend nutzt
/api/location/nearest-store, benötigt entsprechende Store-Daten (Regionen).
Bei neuen Features:
- Update
.env.examplefalls Variablen hinzugefügt werden. config/nicht committen.- README + Tests aktualisieren.