Application web responsive de consultation, signalement, validation et gestion des observations d'espèces à enjeux pour la santé humaine et l'environnement en Bretagne. Réalisée pour Fredon Bretagne.
Le grand public consulte la carte et signale des observations ; les observateurs agréés produisent des signalements certifiés ; les gestionnaires valident les observations et pilotent les foyers et interventions sur leur territoire ; l'administrateur supervise l'ensemble (référentiel espèces, utilisateurs, statistiques).
Prototype de démonstration : l'authentification est simulée côté client via un sélecteur de profil (5 rôles). Il n'y a pas de connexion réelle.
- Fonctionnalités
- Rôles
- Pages
- Règles métier
- Stack technique
- Structure du dépôt
- Démarrage
- Scripts
- Base de données
- Sources de données externes
- Contrat d'API
- Carte des observations (Leaflet) avec regroupement de marqueurs (clustering), filtres (commune, espèce, statut de validation, masquage des invalides) et légende par espèce.
- Signalement d'une observation : localisation par clic sur la carte, date, nombre d'individus, photo, commentaire, méthode d'observation.
- Validation des signalements par les gestionnaires (certain / probable / douteux / invalide).
- Gestion des foyers : polygones sur carte, surface estimée, modification du périmètre, fusion de foyers, historique des interventions et statistiques annuelles.
- Affectation automatique d'une observation certifiée au foyer actif de la même espèce qui la contient (calcul point-dans-polygone).
- Notifications pour les gestionnaires.
- Référentiel officiel des EEE (espèces exotiques envahissantes réglementées, source TaxRef / INPN), recherche et filtrage flore/faune.
- Administration : référentiel espèces, utilisateurs, statistiques globales.
- Interface entièrement en français, responsive (bureau et mobile).
Un sélecteur de profil dans l'en-tête permet de basculer entre 5 profils de démonstration :
| Rôle | Capacités |
|---|---|
| Non inscrit | Consultation de la carte et des fiches ; signalement anonyme |
| Inscrit | Signalement nominatif |
| Observateur agréé | Signalements certifiés : statut automatique « Certain - très probable », photo non obligatoire pour la flore |
| Gestionnaire | Validation des observations, création/modification des foyers, interventions, notifications |
| Administrateur | Accès à l'administration : référentiel espèces, utilisateurs, statistiques globales |
| Page | Contenu |
|---|---|
/ |
Accueil : présentation, accès carte et signalement |
/observations |
Carte des observations avec filtres, légende et couche des foyers |
/observations/new |
Formulaire de signalement |
/observations/:id |
Fiche observation : détails, mini-carte, validation, création de foyer |
/foyers |
Carte des foyers avec filtres, recherche de lieu, fond OSM/satellite, géolocalisation |
/foyers/:id |
Fiche foyer : périmètre, surface, modification, fusion, interventions, statistiques |
/admin |
Administration : espèces, utilisateurs, statistiques (administrateur uniquement) |
/especes-eee |
Référentiel officiel des espèces exotiques envahissantes réglementées |
Signalement
- Flore : photo obligatoire, sauf observateur agréé (certifié).
- Faune : la méthode d'observation est obligatoire.
- Statut automatique : observateur certifié → « Certain - très probable » ; sinon → « En attente de validation ».
Foyers
- Création possible depuis une observation (génération automatique d'un hexagone autour du point).
- Interdiction de chevauchement entre foyers de la même espèce (contrôlée à la création, à la modification et à la fusion).
- Modification du périmètre directement sur la carte ; surface et centre recalculés automatiquement.
- Fusion de deux foyers de la même espèce : réunion des périmètres, regroupement des observations et interventions.
- Monorepo pnpm workspaces, Node.js 24, TypeScript 5.9
- Frontend : React 19 + Vite, wouter (routing), TanStack Query, react-hook-form + Zod, Tailwind CSS v4, Radix UI / shadcn, Leaflet + react-leaflet (+ clustering), Recharts
- API : Express 5, Pino (logs)
- Base de données : PostgreSQL + Drizzle ORM
- Contrat d'API : OpenAPI → génération de hooks React Query et schémas Zod (Orval)
- Géométrie : Turf.js (point-dans-polygone, surfaces, hexagones)
.
├── artifacts/
│ ├── alerte-especes/ # Application web (React + Vite)
│ ├── api-server/ # API REST (Express)
│ └── mockup-sandbox/ # Bac à sable de composants
├── lib/
│ ├── db/ # Schéma Drizzle + accès Postgres
│ ├── api-spec/ # Spécification OpenAPI + codegen
│ ├── api-zod/ # Schémas Zod générés
│ └── api-client-react/ # Hooks React Query générés
├── scripts/ # Scripts d'amorçage et d'import de données
├── pnpm-workspace.yaml
└── tsconfig.base.json
Prérequis : Node.js 24, pnpm, une base PostgreSQL.
# 1. Installer les dépendances
pnpm install
# 2. Configurer la connexion à la base
export DATABASE_URL="postgres://user:pass@host:5432/dbname"
# 3. Créer le schéma
pnpm --filter @workspace/db run push
# 4. Charger les données de démonstration
pnpm --filter @workspace/scripts run import-eee # référentiel EEE officiel
pnpm --filter @workspace/scripts run seed-demo # espèces, foyers, observations de démo
pnpm --filter @workspace/scripts run import-inaturalist # observations réelles (iNaturalist)
# 5. Lancer l'API puis le frontend (deux terminaux)
pnpm --filter @workspace/api-server run dev
pnpm --filter @workspace/alerte-especes run devVérification et build (à la racine) :
| Commande | Description |
|---|---|
pnpm run typecheck |
Vérification TypeScript de tous les paquets |
pnpm run build |
Vérification + build de tous les paquets |
Par paquet :
| Commande | Description |
|---|---|
pnpm --filter @workspace/api-server run dev |
Lance l'API |
pnpm --filter @workspace/alerte-especes run dev |
Lance le frontend |
pnpm --filter @workspace/db run push |
Applique le schéma en base (développement) |
pnpm --filter @workspace/api-spec run codegen |
Régénère hooks et schémas Zod depuis l'OpenAPI |
pnpm --filter @workspace/scripts run seed-demo |
Réinitialise et recharge les données de démonstration |
pnpm --filter @workspace/scripts run import-eee |
(Re)charge la liste officielle des EEE (TaxRef) |
pnpm --filter @workspace/scripts run import-inaturalist |
Ajoute des observations réelles depuis iNaturalist |
Le schéma Drizzle (source de vérité) se trouve dans lib/db/src/schema/ : especes, especes-eee, observations, foyers, interventions, notifications, users.
À noter :
observations.statutValidationest un enum strict :Certain - très probable|Probable|Douteux|Invalide|En attente de validation.seed-demovide toutes les tables (saufespeces_eee), y compris les observations iNaturalist : relancerimport-inaturalistaprès un reseed.
- TaxRef / INPN — référentiel officiel des espèces exotiques envahissantes réglementées.
- iNaturalist — observations réelles. Les coordonnées
geojson.coordinatessont au format[lng, lat]. - Nominatim (OpenStreetMap) — recherche de communes et de lieux.
- OpenStreetMap / Esri — fonds de carte.
Le projet suit une approche contrat d'abord : la spécification OpenAPI (lib/api-spec) génère les hooks React Query (lib/api-client-react) et les schémas de validation Zod (lib/api-zod). Après toute modification de la spécification :
pnpm --filter @workspace/api-spec run codegenLe serveur valide les entrées/sorties avec les schémas Zod ; le client utilise les hooks générés.
Développé par Natural Solutions pour Fredon Bretagne.
© Fredon Bretagne — Alerte Espèces