corrige le code de classe (caractères ambigus) et fige l'image Uptime Kuma par digest

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-12 21:50:53 +02:00
parent 97c04f1ad6
commit f899aac48a
11 changed files with 92 additions and 15 deletions

View file

@ -2,13 +2,13 @@
namespace App\Models;
use App\Support\CodeLisible;
use Carbon\Carbon;
use Database\Factories\ClasseFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Str;
class Classe extends Model
{
@ -31,7 +31,7 @@ class Classe extends Model
public static function genererCodeUnique(): string
{
do {
$code = Str::upper(Str::random(6));
$code = CodeLisible::genere(6);
} while (static::where('code_classe', $code)->exists());
return $code;

View file

@ -4,6 +4,7 @@ namespace App\Services;
use App\Models\Classe;
use App\Models\Eleve;
use App\Support\CodeLisible;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
@ -13,9 +14,6 @@ use Illuminate\Support\Str;
*/
class GenerateurCompteEleve
{
// Sans 0/O ni 1/I/L, pour qu'un élève ne confonde pas à la lecture.
private const ALPHABET_CODE = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
public function genererIdentifiant(string $prenom, ?string $nom): string
{
$base = Str::slug($prenom, '');
@ -35,12 +33,7 @@ class GenerateurCompteEleve
public function genererCodeSecret(): string
{
$code = '';
for ($i = 0; $i < 6; $i++) {
$code .= self::ALPHABET_CODE[random_int(0, strlen(self::ALPHABET_CODE) - 1)];
}
return $code;
return CodeLisible::genere(6);
}
/**

View file

@ -0,0 +1,26 @@
<?php
namespace App\Support;
/**
* Codes courts qu'un élève doit pouvoir lire et retaper sans erreur :
* sans 0/O ni 1/I/L, qui se confondent facilement à l'écran comme à voix
* haute. Utilisé pour le code secret de l'élève (GenerateurCompteEleve) et,
* depuis le 2026-10-12, pour le code de classe (Classe) — qui utilisait
* jusque-là un alphabet différent et ambigu (dette notée le 2026-10-09).
*/
final class CodeLisible
{
public const ALPHABET = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
public static function genere(int $longueur): string
{
$code = '';
for ($i = 0; $i < $longueur; $i++) {
$code .= self::ALPHABET[random_int(0, strlen(self::ALPHABET) - 1)];
}
return $code;
}
}

View file

@ -65,3 +65,9 @@ test("l'inscription échoue si les mots de passe ne correspondent pas", function
expect(User::count())->toBe(0);
});
test('le code de classe ne contient aucun caractère ambigu (0/O, 1/I/L)', function () {
$codes = collect(range(1, 100))->map(fn () => Classe::genererCodeUnique());
expect($codes->every(fn ($code) => preg_match('/^[ABCDEFGHJKMNPQRSTUVWXYZ23456789]{6}$/', $code) === 1))->toBeTrue();
});

View file

@ -11,11 +11,12 @@ use App\Models\Etablissement;
use App\Models\Lab;
use App\Models\Seance;
use App\Models\User;
use App\Support\CodeLisible;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
$motDePasse = Str::password(24, symbols: false);
$code = Str::upper(Str::random(6));
$code = CodeLisible::genere(6);
$etablissement = Etablissement::create(['nom' => 'Lycée Test Étape 11', 'ville' => 'Test']);
$prof = User::create(['name' => 'Prof Test 11', 'email' => 'prof11@syllabus.test', 'password' => $motDePasse, 'etablissement_id' => $etablissement->id]);

View file

@ -10,6 +10,7 @@ use App\Models\Etablissement;
use App\Models\Lab;
use App\Models\Seance;
use App\Models\User;
use App\Support\CodeLisible;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
@ -19,7 +20,7 @@ $prof = User::create(['name' => 'Prof Visio', 'email' => 'prof-visio@syllabus.te
$classe = Classe::create(['etablissement_id' => $etablissement->id, 'user_id' => $prof->id, 'nom' => 'Classe Test Visio', 'formation' => 'Test']);
$eleves = [];
foreach ([['Lea', 'Martin', 'lea.visio'], ['Yanis', 'Bernard', 'yanis.visio']] as [$prenom, $nom, $identifiant]) {
$code = Str::upper(Str::random(6));
$code = CodeLisible::genere(6);
Eleve::create(['classe_id' => $classe->id, 'prenom' => $prenom, 'nom' => $nom, 'identifiant' => $identifiant, 'code_secret' => Hash::make($code), 'jeton_qr' => Str::random(32)]);
$eleves[] = ['identifiant' => $identifiant, 'code' => $code];
}