{"id":35162496,"url":"https://github.com/lka/client_server_einkaufsliste","last_synced_at":"2026-05-06T17:01:21.925Z","repository":{"id":321629328,"uuid":"1086582035","full_name":"lka/client_server_einkaufsliste","owner":"lka","description":"create and manage a shopping list","archived":false,"fork":false,"pushed_at":"2026-04-30T10:12:19.000Z","size":1566,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-30T12:13:38.897Z","etag":null,"topics":["linux","raspberry-pi","shoppinglist","windows"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-30T16:02:41.000Z","updated_at":"2026-04-30T10:12:21.000Z","dependencies_parsed_at":"2025-10-30T18:19:00.325Z","dependency_job_id":"5541531a-d8eb-430d-b919-0a6f95fc3342","html_url":"https://github.com/lka/client_server_einkaufsliste","commit_stats":null,"previous_names":["lka/client_server_einkaufsliste"],"tags_count":187,"template":false,"template_full_name":null,"purl":"pkg:github/lka/client_server_einkaufsliste","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lka%2Fclient_server_einkaufsliste","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lka%2Fclient_server_einkaufsliste/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lka%2Fclient_server_einkaufsliste/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lka%2Fclient_server_einkaufsliste/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lka","download_url":"https://codeload.github.com/lka/client_server_einkaufsliste/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lka%2Fclient_server_einkaufsliste/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32703532,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T08:33:17.875Z","status":"ssl_error","status_checked_at":"2026-05-06T08:33:17.221Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["linux","raspberry-pi","shoppinglist","windows"],"created_at":"2025-12-28T18:47:41.424Z","updated_at":"2026-05-06T17:01:21.914Z","avatar_url":"https://github.com/lka.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Client/Server Einkaufsliste\n\nEine moderne Shopping-List-Anwendung mit sicherer Benutzerauthentifizierung, persistenter Datenspeicherung, Mengenangaben und vollständig getesteter API.\n\nPython FastAPI Server + TypeScript Client mit JWT-Authentifizierung.\n\n## Was ist das Ziel dieser Anwendung?\n\n1. Meine Rezepte verwalte ich in einer App [My Recipe Box](https://www.myrecipebox.app/de/) sowohl auf Android als auch auf dem Ipad. Diese App kann die Rezepte auf einem Gerät in meinem Netzwerk speichern.\n2. Wir planen unsere Essen eine Woche im Voraus und kaufen 2-mal je Woche ein.\n3. Ich möchte die Rezepte aus der App im Wochenplan wiederfinden und die Zutaten in der Einkaufsliste.\n4. Wir haben mehrere Stamm-Geschäfte in denen wir regelmäßig einkaufen und ich möchte die Einkaufsliste so aufbereitet haben, dass sie die Zutaten auf dem Weg durch das jeweilige Geschäft in der richtigen Reihenfolge darstellt.\n5. Der Wochenplan und die Einkaufsliste sollen \u003cb\u003eausgedruckt\u003c/b\u003e werden.\n\n## Releases\n\nEine Liste der Releases finden Sie in [RELEASES.md](docs/RELEASES.md).\n\n## Features\n\nEine vollständige Liste aller Features finden Sie in [FEATURES.md](docs/FEATURES.md).\n\n## Schnellstart\n\nEine Schnellstartanleitung finden Sie in [QUICKSTART.md](docs/QUICKSTART.md).\n\n## Benutzung\n\nNach dem Aufruf der Seite in einem Browser Ihrer Wahl auf einem Tablet oder PC mit z.B. http://192.168.0.22:8000 (die IP-Adresse ihres Servers) landen Sie auf der Login-Seite. Nach dem Einloggen sind sie in der Einkaufsliste.\n![Screenshot](docs/images/Einkaufsliste.png)\n\n### Navigation im Benutzermenü\n\nDas Benutzermenü (⋮) im Header der Anwendung ist hierarchisch organisiert:\n![DropdownMenu](docs/images/Dropdownmenu.png)\n\n**[🗓️ Wochenplan](#wochenplan-nutzen)**: Wochenplan erstellen und pflegen\n\n**⚙️ Verwaltung** (Administration)\n- **🏪 Geschäfte verwalten**: Geschäfte und Abteilungen erstellen, bearbeiten und sortieren\n- **📦 Produkte verwalten**: Produkte in Geschäften verwalten\n- **📋 Vorlagen**: Einkaufslisten-Vorlagen erstellen und bearbeiten\n- **📏 Einheiten**: Maßeinheiten für Zutaten verwalten (Sortierung, Hinzufügen, Löschen)\n- **👥 Benutzer verwalten**: Benutzer freigeben und verwalten (Admin-Funktion)\n\n**⚙️ Einstellungen** (Settings)\n- **🔌 WebSocket de/aktivieren**: Live-Synchronisation zwischen Geräten ein/ausschalten\n- **🗓️ Vor Datum löschen**: löscht Daten aus der Einkaufsliste vor Datum\n- **💾 Datenbank-Backup**: Datenbank sichern und wiederherstellen\n- **☁️ Rezepte einlesen**: Zugriff auf Rezepte konfigurieren und importieren\n\n**📖 Dokumentation**: Öffnet ein neues Fenster im Browser mit dieser README.md\n\n**🚪Abmelden**: Alle Verbindungen werden geschlossen und Sie landen wieder auf der Login-Seite.\n\nDarunter sehen Sie die aktuelle Versionsnummer.\n\n### Einkaufsliste verwenden\n\nNach dem Login können Sie die Einkaufsliste verwenden:\n\n1. **Automatische Geschäfts-Auswahl**: Das erste Geschäft wird automatisch ausgewählt\n2. **Produkte hinzufügen**: Geben Sie den Produktnamen ein (z.B. \"Möhren\")\n3. **Automatisches Matching**: Das System findet automatisch das passende Produkt im Katalog\n4. **Abteilungs-Gruppierung**: Produkte werden automatisch nach Abteilungen gruppiert angezeigt\n5. **Items entfernen**: Klicken Sie auf das Papierkorb-Icon (🗑️) neben dem Produkt\n6. **Produktkatalog erweitern**: Produkte in \"Sonstiges\" können dem Produkte-Katalog hinzugefügt werden\n   - Klicken Sie auf das Bearbeiten-Icon (✏️) neben einem Produkt in \"Sonstiges\"\n   - Wählen Sie eine Abteilung aus dem Dialog\n   - Das Produkt wird automatisch dem Katalog hinzugefügt\n7. **Falsche Zuordnung**: Produkte, die falsch zugeordnet werden, können im Produkte-Katalog korrigiert werden.\n\n### Rezepte verwenden\n\n1. **WebDAV-Einstellungen konfigurieren** (einmalig):\n   - Klicken Sie auf das Menü (⋮) im Header\n   - Wählen Sie **\"☁️ Rezepte einlesen\"**\n   - Erstellen Sie eine neue WebDAV-Konfiguration mit Ihren Nextcloud-Zugangsdaten\n   - Geben Sie den Pfad zur recipes.json an (z.B. `/remote.php/dav/files/USERNAME/Recipes/recipes.json`)\n\n2. **Rezepte einlesen**:\n   - In den WebDAV-Einstellungen, klicken Sie auf **\"📥 Rezepte einlesen\"**\n   - **Echtzeit-Fortschrittsanzeige** zeigt den Import-Status:\n     - Download der ZIP-Datei vom WebDAV-Server\n     - Extrahieren der Rezept-Dateien\n     - Verarbeitung jeder Datei (~400 Rezepte pro Datei)\n     - Fortschrittsbalken mit Prozentanzeige und Rezept-Zähler\n     - Speichern in die Datenbank\n   - Erfolgsmeldung zeigt Anzahl importierter Rezepte\n   - Bei langsamen Servern kann der Import bis zu 30 Sekunden dauern\n\n3. **Rezepte im Wochenplan verwenden**:\n   - Gehen Sie zum **\"🗓️ Wochenplan\"**\n   - Geben Sie Rezeptname in ein Essensfeld ein\n   - Rezepte erscheinen in Autocomplete-Vorschlägen (nach Vorlagen)\n   - Wählen Sie ein Rezept aus\n\n4. **Rezeptdetails und Anpassungen**:\n   - Klicken Sie auf den Rezeptnamen im Wochenplan\n   - Modal zeigt alle Zutaten mit Mengen\n   - **Personenanzahl anpassen**: Eingabefeld ändert alle Mengen proportional\n   - **Zutaten deaktivieren**: Checkboxen zum Abwählen nicht benötigter Items\n   - **Zusätzliche Items**: Fügen Sie eigene Zutaten hinzu\n   - Alle Änderungen werden automatisch in der Einkaufsliste übernommen\n\n5. **Automatische Einkaufsliste**:\n   - Rezeptzutaten werden automatisch zur Einkaufsliste hinzugefügt\n   - Mengen werden basierend auf Personenanzahl berechnet\n   - Passende Einkaufstage werden automatisch zugewiesen\n   - Items werden mit bestehenden Einträgen intelligent zusammengeführt (siehe unten)\n\n### Intelligentes Item-Matching\n\nDie Anwendung verwendet eine **intelligente Matching-Strategie** beim Hinzufügen von Items zur Einkaufsliste:\n\n**Wie funktioniert es?**\n- **Item existiert in der Produktliste**: Verwendet **Exact Match** (exakte Übereinstimmung)\n  - Verhindert ungewolltes Zusammenführen ähnlicher aber unterschiedlicher Produkte\n  - Beispiel: \"Kürbiskerne\" wird NICHT mit \"Kürbiskernöl\" zusammengeführt\n\n- **Item existiert NICHT in der Produktliste**: Verwendet **Fuzzy Match** (ca. 80% Ähnlichkeit)\n  - Ermöglicht flexibles Zusammenführen bei Tippfehlern oder Variationen\n  - Beispiel: \"Möhre\" wird mit \"Möhren\" zusammengeführt\n\n**Konsistentes Verhalten überall:**\n\nDiese intelligente Strategie wird einheitlich angewendet bei:\n- ✅ Manuelles Hinzufügen von Items (Eingabefeld in der Einkaufsliste)\n- ✅ Rezepte aus dem Wochenplan\n- ✅ Vorlagen/Templates, die im Wochenplan verwendet werden\n\n**Vorteile:**\n- **Keine ungewollten Vermischungen** bei Produkten aus dem Katalog\n- **Flexible Zusammenführung** bei freien Texteingaben\n- **Einheitliches Verhalten** egal wie Items hinzugefügt werden\n\n\u003e **Für Entwickler:** Die technische Implementierung finden Sie in `server/src/routers/items.py` (`_find_item_by_match_strategy()`).\n\u003e Details zum Refactoring in [COMPLEXITY.md](docs/COMPLEXITY.md).\n\n### Geschäfte und Produkte verwalten\n\n**Geschäfte und Abteilungen verwalten:**\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"🏪 Geschäfte verwalten\"**\n3. Erstellen, bearbeiten oder löschen Sie Stores und Departments\n4. **Geschäftsreihenfolge ändern**: Nutzen Sie die ↑↓ Buttons im Store-Header\n5. **Abteilungsreihenfolge ändern**: Nutzen Sie die ↑↓ Buttons neben jeder Abteilung\n\n**Produkte verwalten:**\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"📦 Produkte verwalten\"**\n3. Wählen Sie ein Geschäft aus dem Dropdown\n4. Erstellen, bearbeiten oder löschen Sie Produkte\n5. **Herstellerbezeichnung hinzufügen** (optional):\n   - Beim Erstellen/Bearbeiten eines Produkts: Feld \"Produktbezeichnung\" ausfüllen\n   - Beispiel: Produkt \"Brötchen\" → Herstellerbezeichnung \"Harry's Dinkelkrüstchen\"\n   - Diese Bezeichnung erscheint auf der gedruckten Einkaufsliste\n\n**Einheiten verwalten:**\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"📏 Einheiten\"**\n3. **Reihenfolge ändern**: Nutzen Sie Drag \u0026 Drop oder die ↑↓ Buttons\n4. **Neue Einheit**: Geben Sie den Namen ein und klicken Sie auf \"Hinzufügen\"\n5. **Einheit bearbeiten**: Klicken Sie auf das Bearbeiten-Icon (✏️)\n6. **Einheit löschen**: Klicken Sie auf das Löschen-Icon (🗑️)\n7. Änderungen werden automatisch an alle verbundenen Clients übertragen (WebSocket)\n\n### Vorlagen verwenden\n\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"📋 Vorlagen\"**\n3. Erstellen Sie Vorlagen mit wiederkehrenden Einkaufslisten-Items\n   - **Name**: z.B. \"Pasta Carbonara\"\n   - **Beschreibung** (optional): Details zum Rezept\n   - **Personenanzahl**: Für wie viele Personen ist die Vorlage gedacht? (Standard: 2)\n   - **Artikel**: Fügen Sie Artikel mit Mengenangaben hinzu\n4. In der Shopping-Liste: Geben Sie den Vorlagen-Namen ein → alle Items werden automatisch hinzugefügt\n5. Im Wochenplan: Vorlage als Eintrag verwenden → Mengen können für andere Personenanzahl angepasst werden\n\n### Wochenplan nutzen\n\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"🗓️ Wochenplan\"**\n3. Fügen Sie Mahlzeiten für die Woche hinzu\n   - Sie können nur Texte in den Wochenplan einfügen, indem sie die Eingabe mit ⏎ Enter abschliessen, dann werden keine Zutaten in die Einkaufsliste hinzugefügt\n   - Ansonsten nutzen Sie das erscheinende Auswahlfeld für Vorlagen oder Rezepte\n4. Bei Vorlagen-Namen: Zutaten werden automatisch zur Einkaufsliste hinzugefügt\n5. Bei Rezept-Namen: Zutaten werden automatisch zur Einkaufsliste hinzugefügt\n6. Navigation zwischen Wochen mit Vor/Zurück-Buttons\n\n### WebSocket aktivieren (für Live-Updates)\n\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"Einstellungen\"** → **\"🔌 WebSocket aktivieren\"** (ist standardmäßig aktiv)\n3. Alle Änderungen werden jetzt live auf allen verbundenen Geräten synchronisiert\n\n### Datenbank-Backup erstellen\n\n1. Klicken Sie auf das Menü (⋮) im Header\n2. Wählen Sie **\"Einstellungen\"** → **\"💾 Datenbank-Backup\"**\n3. Laden Sie das Backup als JSON-Datei herunter\n4. Für Wiederherstellung: Backup-Datei hochladen auf der gleichen Seite\n\n## Authentifizierung\n\nDie Anwendung verwendet **JWT (JSON Web Tokens)** für sichere Authentifizierung:\n\n### Registrierung und Login\n\n1. **Registrierung**: Besuchen Sie http://localhost:8000/ und erstellen Sie einen Account\n   - Benutzername, E-Mail und Passwort eingeben\n   - Passwörter werden mit bcrypt sicher gehasht\n   - Passwortlänge: 6-72 Zeichen\n   - Neue Benutzer müssen von einem Administrator freigegeben werden\n\n2. **Login**: Melden Sie sich mit Ihren Zugangsdaten an\n   - Bei erfolgreicher Anmeldung erhalten Sie einen JWT-Token\n   - Token wird automatisch im localStorage gespeichert\n   - Token ist 30 Minuten gültig (konfigurierbar in `.env`)\n\n3. **Automatisches Token-Refresh**: Bei jedem API-Aufruf wird das Token automatisch erneuert\n   - Dies verlängert die Token-Gültigkeit bei jeder Aktivität\n   - Kein Timeout bei aktiver Nutzung\n\n4. **Inaktivitäts-Logout**: Nach Ablauf der Token-Gültigkeit bei Inaktivität werden Sie automatisch abgemeldet\n\n### Account-Verwaltung\n\n- Klicken Sie auf das **Drei-Punkte-Menü** (⋮) in der rechten oberen Ecke\n- **Abmelden**: Wählen Sie \"Abmelden\" um sich auszuloggen (Token wird gelöscht)\n- **Account löschen**: Gehen Sie zu \"👥 Benutzer verwalten\" → \"Eigenen Account löschen\" (nur für Nicht-Administratoren)\n\n### Sicherheitshinweise\n\n- **Ändern Sie `SECRET_KEY` in Produktion**: Der Standard-Wert ist nur für Development geeignet\n- **Sichere Passwörter**: Verwenden Sie starke Passwörter mit mindestens 8 Zeichen\n- **HTTPS in Produktion**: Verwenden Sie einen Reverse-Proxy (nginx, Apache) mit SSL/TLS-Zertifikaten\n- **Firewall**: Beschränken Sie den Zugriff auf Port 8000 auf vertrauenswürdige Netzwerke\n\n## Für Entwickler\n\nTechnische Dokumentation, Architektur-Details, API-Endpunkte, Testing und Entwickler-Workflows finden Sie in der [DEVELOPER.md](docs/DEVELOPER.md).\n\nInhalte:\n- Detaillierte Projektstruktur\n- Installation \u0026 Entwicklungsumgebung\n- API-Endpunkte Dokumentation\n- Code-Qualität (Black, Flake8)\n- Testing (pytest, jest)\n- Continuous Integration\n- Architektur (Server \u0026 Client)\n- Troubleshooting\n\n## Lizenz\n\nDieses Projekt ist Open Source. Siehe LICENSE-Datei für Details.\n\n## 📚 Dokumentation\n\n**📖 [Vollständiger Dokumentations-Index](docs/INDEX.md)** - Übersicht aller verfügbaren Dokumentationen\n\n### Schnellzugriff\n\n**Für Benutzer:**\n- 🚀 [QUICKSTART.md](docs/QUICKSTART.md) - Schnellstartanleitung\n- ✨ [FEATURES.md](docs/FEATURES.md) - Vollständige Feature-Liste\n- 📋 [RELEASES.md](docs/RELEASES.md) - Release-Liste\n\n**Für Entwickler:**\n- 👨‍💻 [DEVELOPER.md](docs/DEVELOPER.md) - Technische Dokumentation (Server)\n- 🗄️ [server/DATABASE_SCHEMA.md](docs/server/DATABASE_SCHEMA.md) - Datenbank-Schema\n- 📊 [COMPLEXITY.md](docs/COMPLEXITY.md) - Code-Qualität und Komplexitätsanalyse (Python)\n- 🏷️ [VERSIONING.md](docs/VERSIONING.md) - Release-Workflow und Semantic Versioning\n- 💻 [client/ARCHITECTURE.md](docs/client/ARCHITECTURE.md) - Client 4-Schichten-Architektur\n- 🔄 [client/STATE_LAYER.md](docs/client/STATE_LAYER.md) - State Management (TypeScript)\n- 🐳 [DOCKER.md](docs/DOCKER.md) - Docker Deployment\n- 🔌 [WEBSOCKET-DEBUG.md](docs/WEBSOCKET-DEBUG.md) - WebSocket Debugging\n\n**Externe Ressourcen:**\n- [FastAPI Dokumentation](https://fastapi.tiangolo.com/)\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/)\n- [Docker Container auf Dockerhub](https://hub.docker.com/r/lkaberlin/einkaufsliste)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flka%2Fclient_server_einkaufsliste","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flka%2Fclient_server_einkaufsliste","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flka%2Fclient_server_einkaufsliste/lists"}