ajoute le portail Laravel : connexion prof/élève, session unique, gestion de classe, salle d'attente
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
aa31b6112f
commit
30e14b1c54
191 changed files with 25324 additions and 0 deletions
131
portail/app/Http/Controllers/ClasseController.php
Normal file
131
portail/app/Http/Controllers/ClasseController.php
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Classe;
|
||||
use App\Models\Eleve;
|
||||
use App\Services\GenerateurCompteEleve;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class ClasseController extends Controller
|
||||
{
|
||||
public function __construct(private readonly GenerateurCompteEleve $generateur) {}
|
||||
|
||||
public function index(): View
|
||||
{
|
||||
$classes = Auth::guard('web')->user()->classes()->withCount('eleves')->latest()->get();
|
||||
|
||||
return view('mes-classes.index', ['classes' => $classes]);
|
||||
}
|
||||
|
||||
public function show(Classe $classe): View
|
||||
{
|
||||
$this->verifierProprietaire($classe);
|
||||
|
||||
return view('mes-classes.show', [
|
||||
'classe' => $classe->load('eleves'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function storeEleve(Request $request, Classe $classe): RedirectResponse
|
||||
{
|
||||
$this->verifierProprietaire($classe);
|
||||
|
||||
$donnees = $request->validate([
|
||||
'prenom' => ['required', 'string', 'max:100'],
|
||||
'nom' => ['nullable', 'string', 'max:100'],
|
||||
]);
|
||||
|
||||
$fiche = $this->creerEleve($classe, $donnees['prenom'], $donnees['nom'] ?? null);
|
||||
|
||||
return redirect()->route('mes-classes.show', $classe)
|
||||
->with('fiches', [$fiche]);
|
||||
}
|
||||
|
||||
public function importerCsv(Request $request, Classe $classe): RedirectResponse
|
||||
{
|
||||
$this->verifierProprietaire($classe);
|
||||
|
||||
$request->validate([
|
||||
'fichier' => ['required', 'file', 'mimes:csv,txt'],
|
||||
]);
|
||||
|
||||
$lignes = file($request->file('fichier')->getRealPath(), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
$fiches = [];
|
||||
|
||||
foreach ($lignes as $ligne) {
|
||||
$colonnes = str_getcsv($ligne);
|
||||
$prenom = trim($colonnes[0] ?? '');
|
||||
|
||||
if ($prenom === '' || Str::lower($prenom) === 'prenom') {
|
||||
continue; // ligne vide ou en-tête
|
||||
}
|
||||
|
||||
$nom = trim($colonnes[1] ?? '') ?: null;
|
||||
$fiches[] = $this->creerEleve($classe, $prenom, $nom);
|
||||
}
|
||||
|
||||
return redirect()->route('mes-classes.show', $classe)
|
||||
->with('fiches', $fiches)
|
||||
->with('nombre_importes', count($fiches));
|
||||
}
|
||||
|
||||
public function regenererCode(Classe $classe, Eleve $eleve): RedirectResponse
|
||||
{
|
||||
$this->verifierProprietaire($classe);
|
||||
abort_if($eleve->classe_id !== $classe->id, 404);
|
||||
|
||||
$codeSecret = $this->generateur->genererCodeSecret();
|
||||
$jetonQr = Str::random(32);
|
||||
|
||||
$eleve->forceFill([
|
||||
'code_secret' => Hash::make($codeSecret),
|
||||
'jeton_qr' => $jetonQr,
|
||||
])->save();
|
||||
|
||||
return redirect()->route('mes-classes.show', $classe)
|
||||
->with('fiches', [[
|
||||
'identifiant' => $eleve->identifiant,
|
||||
'prenom' => $eleve->prenom,
|
||||
'nom' => $eleve->nom,
|
||||
'code_secret' => $codeSecret,
|
||||
'jeton_qr' => $jetonQr,
|
||||
]]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{identifiant: string, prenom: string, nom: ?string, code_secret: string, jeton_qr: string}
|
||||
*/
|
||||
private function creerEleve(Classe $classe, string $prenom, ?string $nom): array
|
||||
{
|
||||
$identifiant = $this->generateur->genererIdentifiant($prenom, $nom);
|
||||
$codeSecret = $this->generateur->genererCodeSecret();
|
||||
$jetonQr = Str::random(32);
|
||||
|
||||
$classe->eleves()->create([
|
||||
'prenom' => $prenom,
|
||||
'nom' => $nom,
|
||||
'identifiant' => $identifiant,
|
||||
'code_secret' => Hash::make($codeSecret),
|
||||
'jeton_qr' => $jetonQr,
|
||||
]);
|
||||
|
||||
return [
|
||||
'identifiant' => $identifiant,
|
||||
'prenom' => $prenom,
|
||||
'nom' => $nom,
|
||||
'code_secret' => $codeSecret,
|
||||
'jeton_qr' => $jetonQr,
|
||||
];
|
||||
}
|
||||
|
||||
private function verifierProprietaire(Classe $classe): void
|
||||
{
|
||||
abort_if($classe->user_id !== Auth::guard('web')->id(), 403);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue