bp/app/Filters/OrganizationFilter.php

79 lines
3.1 KiB
PHP

<?php
namespace App\Filters;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
class OrganizationFilter implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
$session = session();
$uri = $request->getUri();
$currentPath = $uri->getPath();
// === БЛОК ДЛЯ ГОСТЕЙ (НЕЗАЛОГИНЕННЫХ) ===
if (!$session->get('isLoggedIn')) {
// Список публичных маршрутов для гостей
$publicRoutes = [
'/',
'/login',
'/register',
'/register/success',
'/auth/verify',
'/auth/resend-verification',
];
if (!in_array($currentPath, $publicRoutes)) {
// Если гость лезет не туда (например /organizations) — на главную
return redirect()->to('/');
}
// Иначе пропускаем
return;
}
// =======================================
// === БЛОК ДЛЯ ЗАЛОГИНЕННЫХ ===
// Список маршрутов, доступных БЕЗ выбранной организации
$publicAuthRoutes = [
'/login',
'/register',
'/logout',
'/register/success',
'/auth/verify',
'/auth/resend-verification',
'/organizations',
'/organizations/create',
'/organizations/switch' // Начало пути для переключения
];
// Если мы на этих маршрутах — проверка orgId не нужна (мы просто выбираем её)
if (in_array($currentPath, $publicAuthRoutes) || strpos($currentPath, '/organizations/switch') === 0) {
return;
}
// Если мы попадаем сюда — значит пользователь идет на закрытую страницу (например /crm)
// или на главную (/).
// Главную страницу (/) мы проверяем на уровне контроллера Home::index,
// поэтому фильтр для '/' можно пропускать, ИЛИ проверить здесь.
// Пропустим '/', чтобы контроллер сам решил: редиректить на /organizations или показывать дашборд.
if ($currentPath === '/') {
return;
}
// Для всех остальных закрытых страниц проверяем active_org_id
if (empty(session()->get('active_org_id'))) {
return redirect()->to('/organizations');
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// Do nothing
}
}