auth tests
This commit is contained in:
82
backend/app/Actions/PurgeUserAction.php
Normal file
82
backend/app/Actions/PurgeUserAction.php
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Exceptions\CannotDeleteSystemUserException;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Cancellazione definitiva di un utente conforme al GDPR (diritto all'oblio).
|
||||
*
|
||||
* Non rimuove la riga (va preservata l'integrità referenziale verso i contenuti
|
||||
* e la traccia di audit): i contenuti posseduti vengono riassegnati all'utente
|
||||
* di sistema e i dati personali anonimizzati in-place. Il record resta
|
||||
* soft-deleted ma, marcato `anonymized_at`, esce dal cestino e dalle liste.
|
||||
*
|
||||
* Idempotente: un utente già anonimizzato viene ignorato.
|
||||
*/
|
||||
class PurgeUserAction
|
||||
{
|
||||
/**
|
||||
* Modelli posseduti (con colonna `user_id`) da riassegnare all'utente di
|
||||
* sistema prima dell'anonimizzazione. Aggiungere qui i modelli di contenuto
|
||||
* man mano che vengono creati (devono usare SoftDeletes).
|
||||
*
|
||||
* @var list<class-string>
|
||||
*/
|
||||
private const OWNED_MODELS = [];
|
||||
|
||||
public function execute(User $user): void
|
||||
{
|
||||
if ($user->is_system) {
|
||||
throw CannotDeleteSystemUserException::make();
|
||||
}
|
||||
|
||||
if ($user->anonymized_at !== null) {
|
||||
return; // già anonimizzato: idempotente
|
||||
}
|
||||
|
||||
$system = User::where('is_system', true)->firstOrFail();
|
||||
|
||||
DB::transaction(function () use ($user, $system) {
|
||||
$this->reassignContent($user, $system);
|
||||
$this->anonymize($user);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Riassegna all'utente di sistema tutti i contenuti posseduti, inclusi
|
||||
* quelli a loro volta nel cestino.
|
||||
*/
|
||||
private function reassignContent(User $user, User $system): void
|
||||
{
|
||||
foreach (self::OWNED_MODELS as $model) {
|
||||
$model::withTrashed()
|
||||
->where('user_id', $user->id)
|
||||
->update(['user_id' => $system->id]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Azzera i dati personali mantenendo la riga per l'integrità referenziale.
|
||||
*/
|
||||
private function anonymize(User $user): void
|
||||
{
|
||||
$user->forceFill([
|
||||
'name' => 'Deleted user',
|
||||
'email' => "deleted-{$user->id}@anonymized.invalid",
|
||||
'password' => Hash::make(Str::random(60)),
|
||||
'two_factor_secret' => null,
|
||||
'two_factor_recovery_codes' => null,
|
||||
'two_factor_confirmed_at' => null,
|
||||
'two_factor_setup_completed_at' => null,
|
||||
'email_verified_at' => null,
|
||||
'remember_token' => null,
|
||||
'must_change_password' => false,
|
||||
'anonymized_at' => now(),
|
||||
])->save();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user