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:
parent
97c04f1ad6
commit
f899aac48a
11 changed files with 92 additions and 15 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
26
portail/app/Support/CodeLisible.php
Normal file
26
portail/app/Support/CodeLisible.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue