Systeme d'alarme IoT evenementiel : hexagonal, CQRS, Kafka

Backend d'un systeme de video-surveillance dont le capteur est un iPhone
recycle. Le probleme est simple, la structure est le sujet :

- domain/ sans aucun import de framework (verifie par 7 regles ArchUnit
  qui tournent aussi pendant le docker build)
- CQRS strict : write et read ne partagent ni modele ni port
- AlarmDecision en sealed interface -> switch exhaustif verifie a la
  compilation, plutot qu'une chaine de if
- Kafka en KRaft (Zookeeper est supprime depuis Kafka 4.0), cle de
  partition = deviceId pour garantir l'ordre par capteur
- ErrorHandlingDeserializer + DLQ : un message malforme ne bloque pas
  le flux des evenements suivants
- notification WebSocket differee apres commit, pour ne jamais afficher
  une intrusion qui partirait en rollback

31 tests au vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-09-12 17:32:45 +02:00
commit 63ead8a966
81 changed files with 5051 additions and 0 deletions

16
.env.example Normal file
View file

@ -0,0 +1,16 @@
# Copier en .env et renseigner avant le premier demarrage :
# cp .env.example .env && sed -i "s/CHANGEME/$(openssl rand -hex 24)/" .env
# Mot de passe PostgreSQL. Obligatoire : le compose refuse de demarrer sans.
DB_PASSWORD=CHANGEME
# Simulateur de capteur. A desactiver le jour ou le vrai iPhone POSTe
# sur /api/v1/sensor-events.
SIMULATOR_ENABLED=true
SIMULATOR_INTERVAL=8s
# Reglages de sensibilite de l'alarme.
ALARM_EXIT_DELAY=30s
ALARM_MIN_CONFIDENCE=60
LOG_LEVEL=INFO