*/ 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(); } }