# Architecture

## Couches

Le projet est un monolithe Laravel SSR organisé autour de quatre zones:

- `app/Domain`: règles métier pures, entités, value objects, services et exceptions. Cette couche ne dépend ni de Laravel, ni d'Eloquent, ni de Livewire ou HTTP.
- `app/Application`: use cases, DTO simples et contrats de frontières techniques. Elle orchestre le domaine.
- `app/Infrastructure`: Eloquent, persistence, filesystem, mail et services externes.
- `app/Http`, `app/Livewire` et `resources/views`: interface utilisateur, validation HTTP, Livewire et Blade.

La dépendance attendue est `UI -> Application -> Domain`. L'Infrastructure implémente les ports nécessaires sans être appelée depuis le domaine.

## Règles pragmatiques

- Ne pas créer une interface par classe, un repository par table ou un DTO sans contrat utile.
- Rich domain => entité Domain séparée du modèle Eloquent.
- CRUD simple => Eloquent direct acceptable dans Infrastructure/UI si cela reste lisible.
- Introduire une transaction applicative uniquement avec un use case qui coordonne plusieurs écritures. Le Domain ne connaît jamais `DB::transaction`.
- Les exceptions techniques sont traduites aux frontières et ne sont pas exposées directement à l'utilisateur.
- Chaque classe Domain et Application utilise `declare(strict_types=1)` et des types explicites.

## Conventions

Les classes et méthodes sont nommées en anglais, en PascalCase/camelCase. Les use cases décrivent une action (`VerbNoun`) et les DTO portent des données clairement typées. Les tests suivent la couche testée et ne dupliquent pas la logique d'un niveau inférieur.

## Authentification et hébergement

Breeze fournit l'authentification sessionnelle Blade: connexion, inscription, reset et vérification d'email. La production reste compatible avec un hébergement PHP/MySQL mutualisé; Docker ne fournit que l'environnement local.
