Configure l'environnement de développement complet avec Docker Compose, structure DDD 4 Bounded Contexts, et pipeline CI/CD GitHub Actions. Corrections compatibilité CI: - Symfony 8 nécessite monolog-bundle ^4.0 (la v3.x ne supporte que jusqu'à Symfony 7) - ESLint v9 nécessite flat config (eslint.config.js) - le format .eslintrc.cjs est obsolète
146 lines
3.2 KiB
Markdown
146 lines
3.2 KiB
Markdown
# 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.
|