Paillasse/portail/routes/web.php
Adam Belkacemi e4a6aaebb1 ajoute les pages légales, la purge RGPD et sert polices et scripts depuis le portail
Pages /legal et /confidentialite réécrites d'après le système réel, purge
des classes archivées depuis 90 jours (prouvée par Pest), archivage côté
prof. Polices, xterm.js et CodeMirror ne sont plus chargés depuis Google
ni jsDelivr. Pages d'aperçu signalées, sans vrais établissements ni faux
chiffres. Journaux Laravel gardés 14 jours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:07:25 +02:00

103 lines
6.9 KiB
PHP

<?php
use App\Http\Controllers\Auth\ConnexionController;
use App\Http\Controllers\ClasseController;
use App\Http\Controllers\ConsoleController;
use App\Http\Controllers\CorrectionController;
use App\Http\Controllers\EleveTableauDeBordController;
use App\Http\Controllers\InscriptionController;
use App\Http\Controllers\RapportCspController;
use App\Http\Controllers\SeanceController;
use Illuminate\Foundation\Http\Middleware\ValidateCsrfToken;
use Illuminate\Support\Facades\Route;
Route::view('/', 'accueil')->name('accueil');
Route::view('/labs', 'labs.index')->name('labs.index');
Route::view('/labs/essai', 'labs.essai')->name('labs.essai');
Route::view('/cours', 'cours.index')->name('cours.index');
Route::view('/cours/adressage-ipv4', 'cours.show')->name('cours.show');
Route::view('/etablissements', 'etablissements')->name('etablissements');
Route::view('/tarifs', 'tarifs')->name('tarifs');
Route::view('/connexion', 'auth.connexion')->name('login');
Route::view('/inscription', 'auth.inscription')->name('register');
// Démo marketing (données fictives) : la vraie gestion de classe est sous /mes-classes.
Route::view('/classes/suivi', 'classes.suivi')->name('suivi');
Route::view('/examen', 'examen')->name('examen');
// À brancher sur l'envoi d'e-mail (Mail::to('adam@belkacemi.me')->send(...)).
// Envoyé par les navigateurs eux-mêmes (pas de jeton CSRF possible).
Route::post('/csp-rapport', RapportCspController::class)
->withoutMiddleware(ValidateCsrfToken::class)
->middleware('throttle:30,1')
->name('csp.rapport');
Route::post('/contact', fn () => back()->with('contact_ok', true))->name('contact');
Route::view('/fonctionnalites', 'fonctionnalites')->name('fonctionnalites');
Route::view('/legal', 'legal')->name('legal');
Route::view('/confidentialite', 'confidentialite')->name('confidentialite');
Route::redirect('/statut', 'https://status.syllabuslab.fr')->name('statut');
Route::view('/cours/adressage-ipv4/cm', 'cours.cm')->name('cours.cm');
Route::view('/banque', 'banque')->name('banque');
Route::view('/quiz/projection', 'quiz.projection')->name('quiz.projection');
Route::view('/quiz', 'quiz.eleve')->name('quiz.eleve');
Route::view('/ide', 'ide')->name('ide');
Route::view('/bibliotheque', 'bibliotheque')->name('bibliotheque');
Route::view('/generateur', 'generateur')->name('generateur');
Route::view('/labs/web', 'labs.web')->name('labs.web');
Route::view('/maison', 'maison')->name('maison');
Route::view('/devoirs', 'devoirs')->name('devoirs');
Route::view('/td/imprimer', 'td.imprimable')->name('td.imprimable');
Route::view('/cockpit', 'cockpit')->name('cockpit');
// Démo marketing (données fictives), distincte de /eleve (vrai tableau de bord).
Route::view('/mon-espace', 'espace-eleve')->name('espace.eleve');
Route::view('/vie-scolaire', 'vie-scolaire')->name('vie.scolaire');
Route::view('/eleves/fiche', 'fiche-eleve')->name('fiche.eleve');
Route::view('/correction', 'correction')->name('correction');
Route::view('/sujets/creer', 'sujet-creer')->name('sujet.creer');
Route::view('/messagerie', 'messagerie')->name('messagerie');
Route::view('/exports', 'export-ent')->name('export.ent');
Route::view('/aide', 'aide')->name('aide');
Route::view('/academie', 'academie')->name('academie');
Route::view('/paiement', 'paiement')->name('paiement');
Route::view('/paiement/confirme', 'paiement-ok')->name('paiement.ok');
Route::view('/compte/facturation', 'facturation')->name('facturation');
Route::view('/cours/fiche', 'cours.fiche')->name('cours.fiche');
Route::view('/etablissement', 'espace-etablissement')->name('espace.etablissement');
Route::view('/integration', 'integration')->name('integration');
Route::view('/cohortes', 'cohortes')->name('cohortes');
Route::view('/ressources/outil', 'ressource')->name('ressource');
Route::view('/visio', 'visio')->name('visio');
// --- Authentification (étape 8) ---
Route::post('/connexion/prof', [ConnexionController::class, 'connexionProf'])->name('connexion.prof');
Route::post('/connexion/eleve', [ConnexionController::class, 'connexionEleve'])->name('connexion.eleve');
Route::get('/connexion/qr/{jeton}', [ConnexionController::class, 'connexionParQr'])->name('connexion.qr');
Route::post('/inscription', [InscriptionController::class, 'store'])->name('inscription.store');
Route::post('/deconnexion', [ConnexionController::class, 'deconnexion'])->name('deconnexion');
// --- Espace élève (protégé, session unique) ---
Route::middleware(['auth:eleve', 'session.unique:eleve'])->group(function () {
Route::get('/eleve', [EleveTableauDeBordController::class, 'show'])->name('eleve');
Route::post('/seances/{seance}/rejoindre', [SeanceController::class, 'rejoindre'])->name('seances.rejoindre');
Route::get('/seances/{seance}/attente-eleve', [SeanceController::class, 'attenteEleve'])->name('seances.eleve.attente');
Route::get('/seances/{seance}/etat-eleve', [SeanceController::class, 'etatEleve'])->name('seances.eleve.etat');
Route::post('/lab-sessions/{labSession}/corriger', [CorrectionController::class, 'corriger'])
->middleware('throttle:6,1')
->name('lab-sessions.corriger');
Route::post('/lab-sessions/{labSession}/machines/{labSessionMachine}/console', [ConsoleController::class, 'pourEleve'])->name('console.eleve');
});
// --- Espace prof (protégé, session unique) ---
Route::middleware(['auth:web', 'session.unique:web'])->group(function () {
Route::get('/mes-classes', [ClasseController::class, 'index'])->name('mes-classes.index');
Route::get('/mes-classes/{classe}', [ClasseController::class, 'show'])->name('mes-classes.show');
Route::post('/mes-classes/{classe}/eleves', [ClasseController::class, 'storeEleve'])->name('mes-classes.eleves.store');
Route::post('/mes-classes/{classe}/eleves/import', [ClasseController::class, 'importerCsv'])->name('mes-classes.eleves.importer');
Route::post('/mes-classes/{classe}/eleves/{eleve}/regenerer-code', [ClasseController::class, 'regenererCode'])->name('mes-classes.eleves.regenererCode');
Route::post('/mes-classes/{classe}/archiver', [ClasseController::class, 'archiver'])->name('mes-classes.archiver');
Route::post('/mes-classes/{classe}/desarchiver', [ClasseController::class, 'desarchiver'])->name('mes-classes.desarchiver');
Route::post('/mes-classes/{classe}/seances', [SeanceController::class, 'store'])->name('mes-classes.seances.store');
Route::get('/seances/{seance}/attente', [SeanceController::class, 'attente'])->name('seances.attente');
Route::post('/seances/{seance}/ouvrir', [SeanceController::class, 'ouvrir'])->name('seances.ouvrir');
Route::post('/seances/{seance}/admettre/{labSession}', [SeanceController::class, 'admettre'])->name('seances.admettre');
Route::get('/seances/{seance}/labsessions/{labSession}/console', [SeanceController::class, 'consoleProf'])->name('seances.console.prof.page');
Route::post('/seances/{seance}/labsessions/{labSession}/machines/{labSessionMachine}/console', [ConsoleController::class, 'pourProf'])->name('console.prof');
});