video-surveillance-app/src/main/java/me/belkacemi/iotalarm/domain/event/DomainEvent.java
Adam Belkacemi 63ead8a966 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>
2026-09-12 17:32:45 +02:00

20 lines
592 B
Java

package me.belkacemi.iotalarm.domain.event;
import java.time.Instant;
/**
* Fait metier avere, au passe, immuable.
*
* <p>Scellee : la liste des faits que ce domaine sait produire est fermee et
* connue du compilateur. Toute exhaustivite (routage, projection, audit) est
* donc verifiee a la compilation.</p>
*/
public sealed interface DomainEvent
permits IntrusionDetected, AlarmArmed, AlarmDisarmed {
/** Zone concernee. Ici une seule : le studio. */
String zoneId();
/** Quand le fait s'est produit, du point de vue du domaine. */
Instant occurredAt();
}