Initial commit
CI / test (push) Canceled after 0s

This commit is contained in:
2026-09-12 22:22:17 +02:00
commit 904d14b64c
314 changed files with 31884 additions and 0 deletions
+121
View File
@@ -0,0 +1,121 @@
# Gardomatic — Projektbeschreibung und Fahrplan
*Planungsstand: 01.09.2026*
## Projektbeschreibung
Gardomatic ist eine mobile, mehrbenutzerfähige Webanwendung zur Organisation von
Gärten. Nutzer verwalten Gärten, Arten und Sorten, konkrete Pflanzen, Pflanzorte und
anstehende Arbeiten. Artenbezogene Aufgabenvorlagen erzeugen passend zum Kalender,
zum Pflanzdatum oder zur letzten Erledigung automatisch konkrete Aufgaben. Ein Garten
bildet dabei einen abgeschlossenen Daten- und Berechtigungsraum.
Die Anwendung besteht aus einer JSON-API und einem serverseitig gerenderten
Web-Client in Go. PostgreSQL ist die einzige unterstützte Datenbank. Das Frontend
ist mobile-first, funktioniert in den wesentlichen Abläufen ohne JavaScript und
nutzt htmx für komfortable Teilaktualisierungen. Die installierbare PWA bietet eine
Offline-App-Shell; die eigentlichen Gartendaten bleiben serverseitig geführt.
Gardomatic richtet sich an Einzelpersonen und kleine Gruppen, die einen oder mehrere
Gärten gemeinsam pflegen. Zeitfenster statt starrer Einzeltermine bilden
gärtnerische Arbeiten realistisch ab. Rollen, Einladungen und konsequente
Gartenisolierung ermöglichen eine sichere Zusammenarbeit.
## Verbindliche Leitplanken
- Go mit `internal/`-Layout und getrennten Binaries für API, Web und Administration.
- PostgreSQL 16 mit `database/sql`, `lib/pq` und versionierten SQL-Migrationen.
- Garten-ID im Pfad (`/v1/gardens/{gardenID}/...` und `/g/{gardenID}/...`).
- Fremde Garten-IDs liefern 404; unzulässige Aktionen innerhalb eines sichtbaren
Gartens liefern 403.
- Gartenrollen sind `owner`, `admin`, `member` und `viewer`.
- Artenstammdaten und konkrete Pflanzen bleiben getrennt; Pflanzen dürfen ohne Art
angelegt werden.
- Aufgaben verwenden Fälligkeitsfenster. Wiederkehrende Zeiträume dürfen den
Jahreswechsel überspannen.
- Aus Vorlagen erzeugte Aufgaben bleiben idempotent. Ein separater Scheduler wird
erst bei nachgewiesenem Bedarf eingeführt.
- Authentifizierung und Autorisierung liegen in der API. Das Web reicht nur das
Session-Cookie über einen request-spezifischen API-Client weiter.
- Neue Facharbeit wird als vollständiger Vertical Slice aus Migration, Storage,
API, Client, Web und Tests umgesetzt.
## Weiterer Fahrplan
### 1. Kalenderbereitstellung über CalDAV
**Ziel:** Anstehende Aufgaben können in vorhandenen Kalender- und
Aufgabenanwendungen abonniert werden.
Vorgeschlagene Umsetzung:
1. Zuerst einen technischen Prototyp mit einer nur lesbaren Collection pro Nutzer
und Garten erstellen. Die Collection erhält stabile Ressourcen-IDs, ETags und
separat widerrufbare Zugangsdaten.
2. Aufgaben als `VTODO` abbilden: Titel, Beschreibung, Fälligkeitsfenster,
Priorität, Status sowie Pflanzen- und Ortsbezug. Gartenrollen begrenzen auch hier
die sichtbaren Daten.
3. Optional eine schreibgeschützte `VEVENT`-Ansicht für Clients ergänzen, die
`VTODO` nicht sinnvoll darstellen. Mehrtägige Fälligkeitsfenster bleiben dabei
als Zeiträume erkennbar.
4. Einrichtung und Widerruf im Benutzerkonto ergänzen und mindestens mit DAVx⁵,
Apple Kalender/Erinnerungen und Thunderbird prüfen.
5. Schreibzugriffe bewusst zurückstellen, bis Konfliktauflösung, Optimistic
Locking, Zeitzonen und die Semantik externer Erledigungen festgelegt sind.
**Abnahmekriterien:** Eine gartenbezogene, nur lesbare Collection lässt sich in
mindestens zwei unterstützten Clients einrichten; Änderungen erscheinen nach der
Synchronisation; widerrufene Zugänge und Zugriffe auf fremde Gärten funktionieren
nicht.
### 2. Erstes Erweiterungsmodul: Bewässerung
**Ziel:** Den modularen Ausbau mit einem klar abgegrenzten Anwendungsfall erproben.
Vorgeschlagener Umfang:
1. Bewässerungszonen und deren Zuordnung zu vorhandenen Orten modellieren.
2. Manuelle Laufzeiten sowie einfache, ausführbare Zeitprogramme bereitstellen.
3. Tabellen mit `mod_irrigation_` benennen und Routen, Migrationen und
Berechtigungsprüfungen vom Kern abgrenzen.
4. Maximale Laufzeit, konkurrierende Programme und Verhalten bei fehlender
Geräteverbindung definieren, bevor reale Ventile angesteuert werden.
5. Hardware-Anbindung und Wetterautomatik erst nach einer nutzbaren manuellen
Planung auswählen. Ein allgemeines Modul-Interface erst einführen, wenn ein
zweites Modul tatsächlich gemeinsame Hooks benötigt.
**Abnahmekriterien:** Das Modul kann deaktiviert werden, ohne Kernfunktionen zu
beeinträchtigen; Planung und manuelle Ausführung sind nutzbar; Sicherheitsgrenzen
sind automatisiert getestet.
### 3. Aufgabenhistorie und Auswertung
**Ziel:** Wiederkehrende Gartenarbeit später auswertbar machen, ohne den aktuellen
Aufgabenablauf unnötig zu verkomplizieren.
Vorgeschlagene Umsetzung:
1. Vorab entscheiden, welche Fragen beantwortet werden sollen, beispielsweise
Erledigungen pro Zeitraum, Pflanze oder Ort.
2. Erst danach ein append-only Ereignismodell für Erledigen, Wiederöffnen und
Terminänderungen entwerfen.
3. Einen kompakten Export und wenige zielgerichtete Auswertungen vor komplexen
Dashboards priorisieren.
**Abnahmekriterien:** Historische Daten verändern den aktuellen Aufgabenstatus nicht
und bleiben gartenisoliert; die gewählten Auswertungen sind durch reale
Nutzerfragen begründet.
## Empfohlene Reihenfolge
1. Als nächstes den lesenden CalDAV-Prototypen umsetzen und früh mit realen Clients
testen. Das reduziert das größte technische Kompatibilitätsrisiko.
2. Danach den CalDAV-Zugang im Benutzerkonto produktionsreif machen und
dokumentieren.
3. Anschließend das Bewässerungsmodul zunächst ohne Hardwareintegration liefern.
4. Aufgabenhistorie und Reporting erst beginnen, wenn konkrete Auswertungsfragen
gesammelt wurden.
Bidirektionales CalDAV, herstellerspezifische Bewässerungshardware und eine
allgemeine Plugin-Architektur sind ausdrücklich keine Bestandteile der jeweils
ersten Ausbaustufe.