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:
145
CONTRIBUTING.md
Normal file
145
CONTRIBUTING.md
Normal 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.
|
||||
Reference in New Issue
Block a user