# Guide de Contribution - Classeo ## Pre-requis - Docker Desktop 24+ - Git ## Setup Developpeur ### 1. Cloner et lancer ```bash git clone https://github.com/ClasseoEdu/classeo.git cd classeo docker compose up -d ``` ### 2. Verifier le setup ```bash # Tous les services doivent etre "healthy" docker compose ps # Backend repond (port 18000 pour eviter conflit avec services locaux) curl http://localhost:18000/api # Frontend repond (port 5174 pour eviter conflit avec services locaux) curl http://localhost:5174 ``` ## Regles de Code > **Important** : Lire le fichier `CLAUDE.md` a la racine du projet pour les conventions > specifiques (style d'imports PHP, format des messages de commit, etc.). ### PHP Backend 1. **`declare(strict_types=1);`** sur la premiere ligne de chaque fichier 2. **PHPStan level 9** - Zero erreur toleree 3. **Domain = PHP pur** - Aucune dependance Symfony/Doctrine dans `src/*/Domain/` 4. **Value Objects immutables** - `final readonly class` 5. **No null returns** - Utiliser exceptions ou Null Object ### TypeScript Frontend 1. **Strict mode** active 2. **Svelte 5 Runes uniquement** - `$state`, `$derived`, `$effect` 3. **Jamais** `writable()`, `on:click`, `export let` (Svelte 4) 4. **Composants PascalCase** - `MyComponent.svelte` ### Conventions Nommage | Element | Convention | Exemple | |---------|-----------|---------| | Classes PHP | PascalCase | `NoteRepository` | | Methodes | camelCase | `findByStudent()` | | Events | FR nom + EN verbe passe | `NoteRecorded` | | Value Objects | `final readonly class` | `NoteId` | | Composants Svelte | PascalCase.svelte | `GradeCard.svelte` | ## Workflow Git ### Branches - `main` - Production - `develop` - Integration - `feature/XXX` - Nouvelles fonctionnalites - `fix/XXX` - Corrections de bugs ### Commits Format : `type(scope): description` Types : - `feat` - Nouvelle fonctionnalite - `fix` - Correction de bug - `refactor` - Refactoring - `docs` - Documentation - `test` - Ajout de tests - `chore` - Maintenance Exemples : ``` feat(auth): add JWT authentication fix(notes): correct average calculation refactor(admin): extract user service ``` ## Tests ### Avant de commit ```bash # Backend docker compose exec php composer phpstan docker compose exec php composer test # Frontend docker compose exec frontend pnpm run lint docker compose exec frontend pnpm run check docker compose exec frontend pnpm run test ``` ### CI/CD GitHub Actions execute automatiquement : - PHPStan level 9 - PHPUnit tests - ESLint - TypeScript check - Vitest - Playwright E2E - BC isolation check - Naming conventions check ## Architecture ### Bounded Contexts Ne pas creer de dependances directes entre BC. Utiliser : - **Contracts** pour les interfaces partagees - **Domain Events** pour la communication async ### Domain Layer ```php // ✅ CORRECT - Pure PHP namespace App\Scolarite\Domain\Model; final readonly class NoteId extends EntityId {} // ❌ INCORRECT - Framework dependency use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] class Note {} ``` ### Infrastructure Layer Les mappings Doctrine vont dans `Infrastructure/Persistence/Mapping/`. ## Questions ? Ouvrir une issue sur GitHub ou contacter l'equipe sur le canal #classeo-dev.