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>
54 lines
1.8 KiB
PHP
54 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\Classe;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
/**
|
|
* RGPD (CLAUDE.md, étape 14) : supprime les classes archivées depuis
|
|
* 90 jours, avec en cascade leurs élèves, séances, sessions de lab, machines
|
|
* et corrections. Le compte du prof est conservé. Le journal ne garde que
|
|
* des identifiants et des nombres, jamais de nom d'élève.
|
|
*
|
|
* Les sauvegardes chiffrées contenant encore ces données expirent d'elles-
|
|
* mêmes au plus 4 semaines plus tard (rotation, docs/runbooks/sauvegardes.md).
|
|
*/
|
|
class PurgerClassesArchivees extends Command
|
|
{
|
|
protected $signature = 'classes:purger-archivees';
|
|
|
|
protected $description = 'Supprime les classes archivées depuis 90 jours et les données de leurs élèves';
|
|
|
|
public function handle(): void
|
|
{
|
|
$classes = Classe::whereNotNull('archivee_a')
|
|
->where('archivee_a', '<=', now()->subDays(Classe::DELAI_PURGE_JOURS))
|
|
->withCount('eleves')
|
|
->get();
|
|
|
|
$purgees = 0;
|
|
|
|
foreach ($classes as $classe) {
|
|
// Ne peut arriver qu'en cas d'anomalie (un lab expire en 45 min) :
|
|
// on ne supprime pas une session dont la stack Heat vivrait encore.
|
|
if ($classe->aDesLabsEnCours()) {
|
|
Log::warning('Purge RGPD reportée : lab en cours', ['classe_id' => $classe->id]);
|
|
|
|
continue;
|
|
}
|
|
|
|
DB::transaction(fn () => $classe->delete());
|
|
Log::info('Purge RGPD : classe supprimée', [
|
|
'classe_id' => $classe->id,
|
|
'eleves' => $classe->eleves_count,
|
|
'archivee_a' => $classe->archivee_a->toDateString(),
|
|
]);
|
|
$purgees++;
|
|
}
|
|
|
|
$this->info("{$purgees} classe(s) purgée(s).");
|
|
}
|
|
}
|