56 lines
1.9 KiB
PHP
56 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Enums\Portal;
|
|
use App\Services\CurrentPortalContext;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
/**
|
|
* Setzt den Portal-Kontext für den aktuellen Request.
|
|
*
|
|
* Reihenfolge der Auflösung:
|
|
* 1. Admin-Session-Override: Ein angemeldeter Admin kann über die Session ein
|
|
* bestimmtes Portal forcieren (für die Filteransicht im Admin-Bereich).
|
|
* 2. Domain-Konfiguration: Das aktive Theme (gesetzt vom ThemeServiceProvider)
|
|
* bestimmt das Portal über den config('app.theme')-Wert.
|
|
* 3. Kein Kontext: Portal-Scope filtert nicht (z.B. CLI, Tests).
|
|
*
|
|
* Theme → Portal-Mapping:
|
|
* 'presseecho' → Portal::Presseecho
|
|
* 'businessportal24'→ Portal::Businessportal24
|
|
* 'main' / andere → null (Admin-Domain; Super-Admin sieht alles)
|
|
*/
|
|
class SetCurrentPortal
|
|
{
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
$portal = $this->resolvePortal($request);
|
|
CurrentPortalContext::set($portal);
|
|
|
|
return $next($request);
|
|
}
|
|
|
|
private function resolvePortal(Request $request): ?Portal
|
|
{
|
|
// Admin-Session-Override hat höchste Priorität
|
|
if ($request->hasSession() && $request->session()->has('admin_portal_filter')) {
|
|
$overrideValue = $request->session()->get('admin_portal_filter');
|
|
$override = Portal::tryFrom((string) $overrideValue);
|
|
if ($override !== null) {
|
|
return $override;
|
|
}
|
|
}
|
|
|
|
// Domain-basierte Auflösung via ThemeServiceProvider
|
|
$theme = config('app.theme', 'main');
|
|
|
|
return match ($theme) {
|
|
'presseecho' => Portal::Presseecho,
|
|
'businessportal24' => Portal::Businessportal24,
|
|
default => null, // Admin/Portal-Domain → kein automatischer Filter
|
|
};
|
|
}
|
|
}
|