exists('isInstalled') && session('isInstalled'); // For HTMX and API requests, trust the session -- install state can't change mid-session. // This avoids a cache/DB lookup on every partial request. if ($session_says && ($request->isHtmxRequest() || $request->isApiOrCronRequest())) { return $next($request); } $config_says = app()->make(SettingRepository::class)->checkIfInstalled(); if (! $session_says && ! $config_says) { $this->setUninstalled(); if (! $response = $this->redirectToInstall($request)) { return $next($request); } return $response; } if ($session_says && ! $config_says) { $this->setUninstalled(); if (! $response = $this->redirectToInstall($request)) { return $next($request); } return $response; } if (! $session_says) { $this->setInstalled(); } self::dispatchEvent('after_install'); $route = $request->getCurrentRoute(); if ($session_says && $route == 'install') { return Frontcontroller::redirect(BASE_URL.'/auth/logout'); } return $next($request); } /** * Set installed */ private function setInstalled(): void { session(['isInstalled' => true]); } /** * Set uninstalled */ private function setUninstalled(): void { session(['isInstalled' => false]); if (session()->exists('userdata')) { session()->forget('userdata'); } } /** * Redirect to install * * @throws \Illuminate\Contracts\Container\BindingResolutionException */ private function redirectToInstall(IncomingRequest $request): Response|false { $frontController = app()->make(Frontcontroller::class); $allowedRoutes = ['install', 'install.update', 'api.i18n']; $allowedRoutes = self::dispatchFilter('allowedRoutes', $allowedRoutes); $route = $request->getCurrentRoute(); if (in_array($request->getCurrentRoute(), $allowedRoutes)) { return false; } $route = BASE_URL.'/install'; $route = self::dispatchFilter('redirectroute', $route); return $frontController::redirect($route); } }