feat: Setup projet Classeo avec infrastructure Docker et architecture DDD

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
This commit is contained in:
2026-01-30 09:55:58 +01:00
parent ddefa927c7
commit 6da5996340
125 changed files with 10032 additions and 0 deletions

145
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,145 @@
# 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.