# 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.
