Skip to content

Repository files navigation

Alerte Espèces V2

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.


Sommaire


Fonctionnalités

  • 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).

Rôles

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

Pages

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

Règles métier

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.

Stack technique

  • 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)

Structure du dépôt

.
├── 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

Démarrage

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 dev

Scripts

Vé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

Base de données

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.statutValidation est un enum strict : Certain - très probable | Probable | Douteux | Invalide | En attente de validation.
  • seed-demo vide toutes les tables (sauf especes_eee), y compris les observations iNaturalist : relancer import-inaturalist après un reseed.

Sources de données externes

  • TaxRef / INPN — référentiel officiel des espèces exotiques envahissantes réglementées.
  • iNaturalist — observations réelles. Les coordonnées geojson.coordinates sont au format [lng, lat].
  • Nominatim (OpenStreetMap) — recherche de communes et de lieux.
  • OpenStreetMap / Esri — fonds de carte.

Contrat d'API

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 codegen

Le serveur valide les entrées/sorties avec les schémas Zod ; le client utilise les hooks générés.

Crédits

Développé par Natural Solutions pour Fredon Bretagne.


© Fredon Bretagne — Alerte Espèces

Releases

Packages

Contributors

Languages