Parraindex est une application web qui visualise les relations de parrainage entre étudiants de l'IUT Lyon 1. Chaque étudiant peut créer son profil, voir les liens qui existent entre les personnes, et soumettre des demandes de parrainage validées par les administrateurs.
L'application suit une architecture SPA découplée :
parraindex/
├── backend/ # API Symfony 8 + admin EasyAdmin — FrankenPHP
├── frontend/ # SPA React 19 — Vite
├── e2e/ # Tests end-to-end Playwright
├── docker/ # Dockerfile + Caddyfile (prod)
├── justfile # Tâches courantes (e2e, build Docker)
└── compose.yaml # Orchestration Docker (prod)
Backend — backend/
| Technologie | Version | Rôle |
|---|---|---|
| PHP | 8.5 | Runtime |
| Symfony | 8 | Framework HTTP + DI |
| FrankenPHP | 1.12 | Serveur HTTP (Caddy, remplace PHP-FPM) |
| Doctrine ORM | 3 | Accès base de données |
| EasyAdmin | 5 | Interface d'administration (/admin) |
| MySQL | 9 | Base de données |
Structure interne du backend :
backend/src/
Api/ # Wrappers de réponse JSON (ApiResponse, ApiError, ErrorCode)
Controller/Api/ # Controllers API (orchestration uniquement, pas de logique métier)
Controller/Admin/# Back-office EasyAdmin (CRUD, dashboard, import CSV, fusion)
Command/ # Commandes console (reset déploiement, reset mot de passe)
Dto/ # DTOs de requête et réponse (Person, Sponsor, Contact, Auth…)
Entity/ # Entités Doctrine
EventListener/ # Listeners Doctrine (nettoyage des logos)
Fixture/ # Données de démonstration
Form/ # Types de formulaires Symfony (back-office)
Repository/ # Accès aux données
Security/ # Voters + handlers d'authentification API
Service/ # Logique métier (PersonService, ContactResolver…)
Frontend — frontend/
| Technologie | Version | Rôle |
|---|---|---|
| React | 19 | UI |
| Vite | 8 | Bundler / dev server |
| TypeScript | 6 strict | Typage |
| Tailwind CSS | 4 | Styles |
| React Router | 7 | Routing SPA |
| TanStack Query | 5 | Cache & data fetching API |
| Vitest | 4 | Tests unitaires |
Structure interne du frontend :
frontend/src/
components/ # Composants React purs (UI uniquement)
context/ # Contextes React (AuthContext…)
hooks/ # Hooks React (useAuth, useCarousel, usePersonFilter…)
lib/ # Fonctions pures sans React (api client, utils)
pages/ # Un dossier par route
types/ # Types TypeScript partagés (DTOs, enums)
router.tsx # Définition des routes React Router
main.tsx # Point d'entrée
En production, un conteneur unique FrankenPHP (basé sur Caddy) sert à la fois l'API et la SPA. Le build Docker compile le frontend (vite build) et copie le dist/ dans l'image ; Caddy route les requêtes :
FrankenPHP / Caddy :80
├── /api/* → Symfony (API JSON)
├── /admin/*→ Symfony (back-office EasyAdmin)
└── /* → dist/ React (SPA fallback index.html)
- PHP 8.5+ avec extensions
pdo_mysql,intl,ctype,iconv - Composer 2
- Node.js 22+ et npm
- MySQL 9 (ou MariaDB 10.11+)
- Symfony CLI (recommandé pour le serveur de développement)
git clone https://github.com/LukaMrt/Parraindex.git
cd Parraindexcd backend
composer installCréer le fichier .env.local (jamais commité). La configuration utilise des variables séparées (pas de DSN) :
APP_ENV=dev
APP_SECRET=une_chaine_aleatoire_longue
DATABASE_DRIVER=mysql
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
DATABASE_USER=parraindex
DATABASE_PASSWORD=parraindex
DATABASE_NAME=parraindex
MAIL_HOST=localhost
MAIL_PORT=1025 # Mailpit en local
MAIL_USER=admin@localhost.com
MAIL_PASSWORD=password
MAIL_NAME=ParraindexInitialiser la base de données :
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate
php bin/console doctrine:fixtures:load # données de test (optionnel)Démarrer le serveur backend :
symfony serve --port=8000
# ou sans la CLI Symfony :
php -S localhost:8000 public/index.phpL'API répond sur http://localhost:8000/api/.
cd ../frontend
npm installLe frontend appelle des URL relatives (/api, /admin, /uploads…) : en développement, le serveur Vite les proxifie vers le backend (cf. vite.config.ts). La cible par défaut est https://127.0.0.1:8000 ; pour viser un autre backend, définir VITE_API_BASE_URL dans .env.local :
VITE_API_BASE_URL=http://localhost:8000Démarrer le serveur de développement :
npm run devLe frontend répond sur http://localhost:3000 avec hot-reload.
Backend :
# Qualité
composer phpstan # Analyse statique (PHPStan niveau 10)
composer phpcs # Style de code (PHP-CS)
composer test # Tests PHPUnit (Unit / Integration / Functional)
php vendor/bin/infection # Tests de mutation
# Base de données
composer migration:run # Appliquer les migrations
composer migration:new # Générer une migration (make:migration)
composer database:reset # Drop + create + migrate + fixturesFrontend :
npm run dev # Serveur de développement
npm run typecheck # Vérification TypeScript
npm run lint # ESLint (0 warning toléré)
npm run format # Prettier
npm run test # Vitest (watch mode)
npm run test:coverage # Rapport de couverture
npm run build # Build de productionTests end-to-end (Playwright) :
Les tests e2e tournent contre la stack Docker complète. Les recettes sont dans le justfile :
just e2e # Stack de test + install + run (idempotent)
just e2e-up-dev # Stack en mode dev (hot-reload Vite sur :3000)
just e2e-test-dev # Lancer les tests contre la stack dev
just e2e-ui # Mode interactif Playwright (watch, traces)- Docker Engine 24+
- Docker Compose v2
Créer un fichier .env à la racine du projet (à côté de compose.yaml) :
DATABASE_NAME=parraindex
DATABASE_USER=app
DATABASE_PASSWORD=mot_de_passe_securise
APP_SECRET=une_chaine_aleatoire_longue_32_chars
MAIL_WEB_PORT=8025 # Port de l'interface web Mailpit
MAIL_SMTP_PORT=1025 # Port SMTP exposé par Mailpitdocker compose up --build -dLes services démarrés :
| Service | Image | Port exposé |
|---|---|---|
app |
build local (FrankenPHP/Caddy) | 80 |
database |
mysql:9 | 3306 |
mail |
axllent/mailpit | MAIL_WEB_PORT (8025) / MAIL_SMTP_PORT (1025) |
docker compose exec app php bin/console doctrine:migrations:migrate --no-interaction- Application :
http://localhost - Interface mail (Mailpit) :
http://localhost:8025
docker compose down # Arrêter sans supprimer les volumes
docker compose down -v # Arrêter et supprimer les donnéesLes contributions sont les bienvenues. Merci de lire CONTRIBUTING.md avant d'ouvrir une pull request.
Thanks goes to these wonderful people (emoji key):
Luka Maret 💻 🚇 📆 |
Lilian Baudry 💻 👀 🤔 🎨 |
Melvyn Delpree 💻 🎨 📖 |
Vincent Chavot-Dambrun 💻 |
![]() dvachette 💻 |
This project follows the all-contributors specification. Contributions of any kind welcome!
Parraindex est distribué sous la licence MIT.
