Replace Referer-based redirects in Admin Index back() and switchUser() with named routes (admin.index and dashboard) for consistent navigation behavior independent of the request header. Add tests verifying back() returns to admin.index, switchUser routes to the dashboard, and the Referer header is no longer consulted.
94 lines
2.3 KiB
PHP
94 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Admin;
|
|
|
|
use App\Models\Team;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Livewire\Component;
|
|
|
|
class Index extends Component
|
|
{
|
|
public int $activeSubscribers;
|
|
|
|
public int $inactiveSubscribers;
|
|
|
|
public Collection $foundUsers;
|
|
|
|
public string $search = '';
|
|
|
|
public function mount()
|
|
{
|
|
if (! isCloud() && ! isDev()) {
|
|
abort(403);
|
|
}
|
|
$this->authorizeAdminAccess();
|
|
$this->getSubscribers();
|
|
}
|
|
|
|
public function back()
|
|
{
|
|
$this->authorizeAdminAccess();
|
|
if (session('impersonating')) {
|
|
session()->forget('impersonating');
|
|
$user = User::find(0);
|
|
$team_to_switch_to = $user->teams->first();
|
|
Auth::login($user);
|
|
refreshSession($team_to_switch_to);
|
|
|
|
return redirect()->route('admin.index');
|
|
}
|
|
}
|
|
|
|
public function submitSearch()
|
|
{
|
|
$this->authorizeAdminAccess();
|
|
if ($this->search !== '') {
|
|
$this->foundUsers = User::where(function ($query) {
|
|
$query->where('name', 'like', "%{$this->search}%")
|
|
->orWhere('email', 'like', "%{$this->search}%");
|
|
})->get();
|
|
}
|
|
}
|
|
|
|
public function getSubscribers()
|
|
{
|
|
$this->inactiveSubscribers = Team::whereRelation('subscription', 'stripe_invoice_paid', false)->count();
|
|
$this->activeSubscribers = Team::whereRelation('subscription', 'stripe_invoice_paid', true)->count();
|
|
}
|
|
|
|
public function switchUser(int $user_id)
|
|
{
|
|
$this->authorizeRootOnly();
|
|
session(['impersonating' => true]);
|
|
$user = User::find($user_id);
|
|
if (! $user) {
|
|
abort(404);
|
|
}
|
|
$team_to_switch_to = $user->teams->first();
|
|
Auth::login($user);
|
|
refreshSession($team_to_switch_to);
|
|
|
|
return redirect()->route('dashboard');
|
|
}
|
|
|
|
private function authorizeAdminAccess(): void
|
|
{
|
|
if (! Auth::check() || (Auth::id() !== 0 && ! session('impersonating'))) {
|
|
abort(403);
|
|
}
|
|
}
|
|
|
|
private function authorizeRootOnly(): void
|
|
{
|
|
if (! Auth::check() || Auth::id() !== 0) {
|
|
abort(403);
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.admin.index');
|
|
}
|
|
}
|