119 lines
3.5 KiB
PHP
119 lines
3.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Filament\Concerns;
|
|
|
|
use App\Models\ManagedEnvironment;
|
|
use App\Support\OperateHub\OperateHubShell;
|
|
use Filament\Facades\Filament;
|
|
use Illuminate\Http\Request;
|
|
use RuntimeException;
|
|
|
|
trait ResolvesPanelTenantContext
|
|
{
|
|
protected static function resolveTenantContextForCurrentPanel(): ?ManagedEnvironment
|
|
{
|
|
$request = request();
|
|
|
|
if (static::currentPanelId($request) === 'admin') {
|
|
$tenant = app(OperateHubShell::class)->tenantOwnedPanelContext(request());
|
|
|
|
return $tenant instanceof ManagedEnvironment ? $tenant : null;
|
|
}
|
|
|
|
$tenant = ManagedEnvironment::current();
|
|
|
|
return $tenant instanceof ManagedEnvironment ? $tenant : null;
|
|
}
|
|
|
|
public static function panelTenantContext(): ?ManagedEnvironment
|
|
{
|
|
return static::resolveTenantContextForCurrentPanel();
|
|
}
|
|
|
|
public static function trustedPanelTenantContext(): ?ManagedEnvironment
|
|
{
|
|
return static::panelTenantContext();
|
|
}
|
|
|
|
protected static function resolveTenantContextForCurrentPanelOrFail(): ManagedEnvironment
|
|
{
|
|
$tenant = static::resolveTenantContextForCurrentPanel();
|
|
|
|
if (! $tenant instanceof ManagedEnvironment) {
|
|
throw new RuntimeException('No tenant context selected.');
|
|
}
|
|
|
|
return $tenant;
|
|
}
|
|
|
|
protected static function resolveTrustedPanelTenantContextOrFail(): ManagedEnvironment
|
|
{
|
|
return static::resolveTenantContextForCurrentPanelOrFail();
|
|
}
|
|
|
|
private static function currentPanelId(mixed $request): ?string
|
|
{
|
|
$panelId = Filament::getCurrentPanel()?->getId();
|
|
|
|
if (is_string($panelId) && $panelId !== '') {
|
|
return $panelId;
|
|
}
|
|
|
|
$routeName = is_object($request) && method_exists($request, 'route')
|
|
? $request->route()?->getName()
|
|
: null;
|
|
|
|
if (is_string($routeName) && $routeName !== '') {
|
|
if (str_contains($routeName, '.admin.')) {
|
|
return 'admin';
|
|
}
|
|
|
|
if (str_contains($routeName, '.system.')) {
|
|
return 'system';
|
|
}
|
|
}
|
|
|
|
$path = is_object($request) && method_exists($request, 'path')
|
|
? '/'.ltrim((string) $request->path(), '/')
|
|
: null;
|
|
|
|
$panelId = static::panelIdFromPath($path);
|
|
|
|
if ($panelId !== null) {
|
|
return $panelId;
|
|
}
|
|
|
|
if (! $request instanceof Request || ! static::isLivewireRequest($request, $path)) {
|
|
return null;
|
|
}
|
|
|
|
$refererPath = parse_url((string) $request->headers->get('referer', ''), PHP_URL_PATH);
|
|
if (! is_string($refererPath) || $refererPath === '') {
|
|
return null;
|
|
}
|
|
|
|
return static::panelIdFromPath('/'.ltrim($refererPath, '/'));
|
|
}
|
|
|
|
private static function panelIdFromPath(?string $path): ?string
|
|
{
|
|
if (! is_string($path) || $path === '') {
|
|
return null;
|
|
}
|
|
|
|
return match (true) {
|
|
$path === '/admin', str_starts_with($path, '/admin/') => 'admin',
|
|
$path === '/system', str_starts_with($path, '/system/') => 'system',
|
|
default => null,
|
|
};
|
|
}
|
|
|
|
private static function isLivewireRequest(Request $request, ?string $path): bool
|
|
{
|
|
return $request->headers->has('x-livewire')
|
|
|| (is_string($path) && preg_match('#^/(?:livewire(?:-[^/]+)?/update|livewire-unit-test-endpoint)(?:/|$)#', $path) === 1);
|
|
}
|
|
}
|