# Design — Webapp Gestion Jardin

**Date :** 2026-02-21
**Stack :** FastAPI + Vue 3 + SQLite + Docker Compose + Tailwind CSS
**Langue :** Français
**Thème :** Gruvbox Dark Seventies

---

## Architecture globale

Monorepo avec deux services distincts orchestrés par Docker Compose :
- `backend/` : API FastAPI (Python), SQLite, gestion des uploads
- `frontend/` : SPA Vue 3/Vite, servie par Nginx en production
- `data/` : volume persistant (SQLite + images uploadées)

```
jardin/
├── backend/
│   ├── app/
│   │   ├── main.py
│   │   ├── database.py
│   │   ├── models/
│   │   └── routers/
│   ├── tests/
│   ├── seed.py
│   ├── requirements.txt
│   └── Dockerfile
├── frontend/
│   ├── src/
│   │   ├── views/
│   │   ├── components/
│   │   ├── router/
│   │   ├── stores/
│   │   └── api/
│   ├── tailwind.config.js
│   ├── package.json
│   └── Dockerfile
├── data/
├── docker-compose.yml
└── README.md
```

---

## Backend FastAPI

### Modèles SQLModel

| Fichier | Tables |
|---|---|
| `models/garden.py` | `Garden`, `GardenCell`, `GardenImage`, `Measurement` |
| `models/plant.py` | `PlantVariety`, `PlantImage` |
| `models/planting.py` | `Planting`, `PlantingEvent` |
| `models/task.py` | `Task` |
| `models/settings.py` | `UserSettings`, `LunarCalendarEntry` |

### Routers API (préfixe `/api`)

| Router | Endpoints |
|---|---|
| `gardens.py` | CRUD `/gardens`, `/gardens/{id}/cells`, `/gardens/{id}/measurements` |
| `varieties.py` | CRUD `/varieties` |
| `plantings.py` | CRUD `/plantings`, `/plantings/{id}/events` |
| `tasks.py` | CRUD `/tasks` |
| `settings.py` | GET/PUT `/settings`, GET `/lunar?month=YYYY-MM` |
| `media.py` | POST `/upload`, DELETE `/upload/{filename}` |

### Choix techniques

- SQLModel synchrone (pas d'async DB, compatible SQLite sans friction)
- `lifespan` FastAPI : création des tables au démarrage, seed si DB vide
- CORS ouvert (`*`) configurable via `.env`
- Validation Pydantic native via SQLModel
- Sans authentification pour le MVP (module prévu, non implémenté)

---

## Frontend Vue 3

### Stack

Vue 3 + Vite + TypeScript + Pinia + Vue Router + Tailwind CSS

### Routes

| Route | Vue | Rôle |
|---|---|---|
| `/` | `DashboardView` | Tâches du jour, mesures récentes, plantations actives |
| `/jardins` | `JardinsView` | Liste des jardins + création |
| `/jardins/:id` | `JardinDetailView` | Fiche jardin + grille 2D |
| `/varietes` | `VarietesView` | Catalogue des variétés |
| `/plantations` | `PlantationsView` | Liste filtrable des plantations |
| `/planning` | `PlanningView` | Calendrier mois/semaine |
| `/taches` | `TachesView` | Liste / Kanban des tâches |
| `/lunaire` | `LunaireView` | Calendrier lunaire |
| `/reglages` | `ReglagesView` | Paramètres, export/import |

### Layout

- `AppHeader.vue` — navigation fixe, liens actifs, icônes
- `AppDrawer.vue` — menu burger slide-in sur mobile
- Toutes les vues dans le layout principal `App.vue`

### Thème Tailwind Gruvbox

```js
// tailwind.config.js
colors: {
  bg:         '#282828',
  'bg-soft':  '#3c3836',
  text:       '#ebdbb2',
  'text-muted': '#a89984',
  green:      '#b8bb26',
  yellow:     '#fabd2f',
  blue:       '#83a598',
  orange:     '#fe8019',
  red:        '#fb4934',
}
```

### Stores Pinia

Un store par domaine (`useGardensStore`, `useVarietesStore`, `usePlantationsStore`, `useTasksStore`).
Les appels API sont centralisés dans `src/api/` (un fichier par ressource).

---

## Périmètre de la session

Livrable : scaffold complet + étape 1 fonctionnelle

- [x] `docker-compose.yml` + Dockerfiles
- [x] Backend FastAPI : structure + modèles + CRUD complet (jardins, variétés, plantations, tâches)
- [x] Seed de démo (1 jardin, variétés, plantations, tâches)
- [x] Frontend Vue 3 : structure + navigation + pages (squelettes avec appels API réels)
- [x] README d'installation
