route('userCode'); // Validazione formato codice if (!preg_match('/^[A-Z0-9]{8}$/', $userCode)) { abort(404, 'Codice utente non valido'); } // Trova l'utente dal codice $targetUser = $this->findUserByCode($userCode); if (!$targetUser) { abort(404, 'Utente non trovato'); } // Verifica autorizzazione if (!Auth::check() || !$this->canAccessUserSpace(Auth::user(), $targetUser)) { return redirect()->route('login')->with('error', 'Accesso non autorizzato a questo spazio utente'); } // Aggiungi i dati dell'utente target alla request $request->merge([ 'targetUser' => $targetUser, 'targetUserCode' => $userCode ]); return $next($request); } /** * Trova utente dal codice * * @param string $code * @return User|null */ private function findUserByCode($code) { // Prima cerca negli amministratori $amministratore = Amministratore::where('codice', $code)->first(); if ($amministratore && $amministratore->user) { return $amministratore->user; } // Poi cerca nella tabella users (futuro sviluppo) // TODO: Aggiungere campo codice alla tabella users per condomini return null; } /** * Verifica se l'utente può accedere allo spazio * * @param User $loggedUser * @param User $targetUser * @return bool */ private function canAccessUserSpace($loggedUser, $targetUser) { // L'utente può accedere al proprio spazio if ($loggedUser->id === $targetUser->id) { return true; } // Super-admin può accedere a qualsiasi spazio if ($loggedUser->hasRole('super-admin')) { return true; } // Amministratori possono accedere solo al proprio spazio // (in futuro: gestire impersonificazione, deleghe, ecc.) return false; } }