# Arcadia API Arcadia API est une application construite en respectant les principes de la **Clean Architecture** et du **Domain-Driven Design (DDD)**. ## Sommaire - [Architecture](#architecture) - [Principes d'implémentation](#principes-dimplémentation) - [Tests & Assurance Qualité](#tests--assurance-qualité) --- ## Architecture ![Arcadia API Architecture](resources/architecture.jpg) L'application est découpée en couches strictes respectant la règle de dépendance vers l'intérieur : 1. **Domain** : Le coeur métier de l'application utilisant un language commun. Ne dépend de rien d'autre (**Shared** autorisé). Contient les *Entités*, *Value Objects*, et les interfaces (*Ports*) pour interagir avec le monde extérieur. 2. **Application** : Les *Use Cases*. Orchestre la logique métier en utilisant le Domaine. Ne dépend d'aucune infrastructure ou framework (sauf `Shared`). 3. **Presentation** : Les points d'entrée de l'application (*API Controllers*, *Presenters*). Formate les données pour l'extérieur et gère les requêtes HTTP ou une interface cli. 4. **Infra** : L'implémentation technique (Eloquent, base de données, réseau, etc.). Implémente les interfaces définies par le Domaine. 5. **Shared** : Le socle technique commun (interfaces DDD de base, *Value Objects* génériques comme `Pagination`). ## Principes d'implémentation - **API Read-only** : Pour l'instant, l'API ne fait qu'exposer des données. Nous utilisons donc le pattern `Directory` (lecture seule) plutôt que `Repository` (lecture/écriture) dans nos Ports de Domaine. - **Pattern Presenter** : Les Use Cases (dans `Application`) retournent un `Output` agnostique. La couche `Presentation` utilise ensuite des `Presenters` spécifiques (ex: API) pour transformer cet `Output` en une vue exploitable par l'interface finale (JSON). - **Validation** : La validation stricte du format (ex: HTTP) est gérée dans la couche `Presentation` (via les `FormRequest`). La validation des règles métier est garantie au coeur du `Domain` par les `Value Objects`, qui lèvent des exceptions de type `InvalidArgumentException` traduites en HTTP 422 par le gestionnaire d'erreurs global. ## Tests & Assurance Qualité Consulter le document [TEST.md](TEST.md) pour la stratégie de test en pyramide (Unit, Integration, Feature, Arch) et les commandes d'exécution avec couverture de code.