@@ -32,28 +32,33 @@ Navigateur ──HTTP──> Next.js (Node) ──> SQLite (node:sqlite)
3232src/
3333 app/
3434 layout.tsx Racine : thème, providers, nav, script anti-FOUC
35- page.tsx Accueil « Ce mois-ci »
36- calendrier/ Calendrier annuel
35+ page.tsx Accueil « Ce mois-ci » (+ onboarding)
36+ calendrier/ Calendrier annuel (imprimable)
3737 plantes/ Liste + fiches (génération statique)
38- potager/ Plan du potager
39- mon-jardin/ Plantations + météo + notifications
38+ potager/ Plan du potager (rotation, modèles, distances)
39+ mon-jardin/ Plantations + récolte prévue + tâches + météo
4040 journal/ Journal de jardin
41+ courses/ Liste de courses du mois
4142 login/ Écran de connexion
4243 actions/auth.ts Server Actions login / logout (+ anti-brute-force)
43- api/ Route Handlers (garden, plots, journal, push, notify)
44+ api/ Route Handlers (garden, plots, journal, tasks, push, notify)
4445 manifest.ts Manifest PWA
4546 components/ Composants UI (client pour l'interactif)
4647 lib/
4748 plants.ts Catalogue statique (38 plantes)
4849 types.ts Types + libellés
4950 calendar.ts Logique calendaire (décalage zone, tâches, compat.)
51+ garden-calc.ts Récolte prévisionnelle (logique pure)
52+ quantities.ts Quantités conseillées par personne (logique pure)
53+ shopping.ts Liens d'achat / comparateur (logique pure)
54+ plot-logic.ts Rotation, suggestions, modèles de carrés (pure)
55+ weather.ts Arrosage + géocodage Open-Meteo (logique pure)
5056 climate.tsx Contexte zone climatique (localStorage)
51- db.ts Connexion SQLite paresseuse + schéma
57+ db.ts Connexion SQLite paresseuse + schéma + migrations
5258 session.ts Sessions (cookie + DB)
5359 login-throttle.ts Anti-brute-force (logique pure)
54- *-store.ts Accès DB côté serveur (garden, plots, journal, push…)
55- garden.ts/plots.ts/journal.ts Hooks client (cache optimiste + fetch)
56- weather.ts Conseils d'arrosage (logique pure) + Open-Meteo
60+ *-store.ts Accès DB côté serveur (garden, plots, journal, tasks, push…)
61+ garden.ts/plots.ts/journal.ts/tasks.ts Hooks client (cache optimiste + fetch)
5762 proxy.ts Garde des routes (ex-middleware)
5863public/
5964 sw.js Service worker (push + cache hors-ligne)
@@ -78,14 +83,28 @@ Créé automatiquement au démarrage (`CREATE TABLE IF NOT EXISTS`, voir `db.ts`
7883| --- | --- |
7984| ` sessions ` | jetons de session (token, expiration) |
8085| ` plantations ` | plantes installées (Mon jardin) |
81- | ` plots ` | parcelles du plan (grille ` cells ` en JSON) |
86+ | ` plots ` | parcelles du plan ; ` cells ` (année courante) + ` layouts ` ( JSON par année) + ` year ` |
8287| ` journal_entries ` | journal (récolte/semis/observation…) |
88+ | ` task_done ` | tâches cochées (clé ` uid:année-mois:libellé ` ) |
8389| ` push_subscriptions ` | abonnements Web Push |
8490| ` login_attempts ` | compteur anti-brute-force par IP |
8591
8692Connexion ** paresseuse** (ouverte à la première requête, pas à l'import) pour
8793éviter les verrous entre les workers du build ; ` PRAGMA busy_timeout ` + WAL.
8894
95+ ** Migrations** : ` node:sqlite ` n'a pas de système de versions ; ` db.ts ` applique
96+ des ` ALTER TABLE ` idempotents (try/catch) au démarrage — c'est ainsi que les
97+ colonnes ` year ` /` layouts ` ont été ajoutées à ` plots ` .
98+
99+ ### Plan du potager & rotation
100+
101+ Chaque carré stocke un ** layout par année** (` layouts: { "2025": cells, … } ` ).
102+ Le sélecteur d'année change le layout édité. ` plot-logic.ts ` calcule :
103+ ` rotationConflicts ` (même famille au même endroit dans les 3 ans précédents),
104+ ` suggestionsForPlot ` (bonnes voisines compatibles) et ` PLOT_TEMPLATES ` (carrés
105+ tout faits, sans conflit). Les distances de plantation viennent du champ
106+ ` espacement ` des fiches.
107+
89108## Flux de données (client ↔ serveur)
90109
91110Les hooks ` useGarden ` / ` usePlots ` / ` useJournal ` suivent le même patron :
@@ -127,10 +146,12 @@ partir des plantations.
127146
128147## Météo
129148
130- ` weather.ts ` contient la ** logique pure** (` wateringAdvice ` , ` summarize ` ) testée
131- unitairement. Le composant ` WeatherAdvice ` géolocalise le navigateur et appelle
132- ** Open-Meteo** (gratuit, sans clé, CORS) côté client, puis affiche un conseil
133- d'arrosage. La position est mémorisée en ` localStorage ` .
149+ ` weather.ts ` contient la ** logique pure** (` wateringAdvice ` , ` summarize ` ,
150+ ` geocodeUrl ` , ` firstGeocode ` ) testée unitairement. Le composant ` WeatherAdvice `
151+ obtient la position par ** géolocalisation** ou par ** recherche de ville**
152+ (géocodage Open-Meteo), appelle ** Open-Meteo** (gratuit, sans clé, CORS) côté
153+ client, puis affiche un conseil d'arrosage. La position est mémorisée en
154+ ` localStorage ` .
134155
135156## PWA
136157
@@ -149,11 +170,15 @@ applique le thème avant le premier paint (anti-FOUC) et `<html>` porte
149170
150171## Tests
151172
152- ** Vitest** (environnement ` node ` ). Couvre la logique pure :
173+ ** Vitest** (environnement ` node ` ). Couvre la logique pure (48 tests) :
153174
154175- ` calendar.test.ts ` — décalage de zone, tâches du mois, compatibilités.
155176- ` login-throttle.test.ts ` — verrou/fenêtre/réinitialisation.
156- - ` weather.test.ts ` — conseils d'arrosage, agrégation Open-Meteo.
177+ - ` weather.test.ts ` — arrosage, agrégation et géocodage Open-Meteo.
178+ - ` garden-calc.test.ts ` — récolte prévisionnelle.
179+ - ` quantities.test.ts ` — quantités conseillées.
180+ - ` shopping.test.ts ` — liens d'achat.
181+ - ` plot-logic.test.ts ` — rotation, suggestions, validité des modèles.
157182
158183` npm test ` (CI) / ` npm run test:watch ` (dev).
159184
0 commit comments