Files
SGF/app/Shared/Context/RequireModuleContext.php
T
2026-11-02 08:06:45 +02:00

28 lines
1.5 KiB
PHP

<?php
namespace App\Shared\Context;
use Illuminate\Http\Request;
final class RequireModuleContext
{
public function check(Request $request, CompanyContext $context): void
{
$owner = ModuleNavigation::owner($request->path());
if ($owner === null) return;
$selected = $request->session()->get('company_context', []);
$active = $selected['module_id'] ?? null;
abort_unless($active, 409, 'Seleccione explicitamente um módulo antes de abrir este percurso.');
$available = array_column(app(ModuleNavigation::class)->available($context), 'id');
abort_unless(in_array($active, $available, true), 403, 'O acesso ao módulo foi revogado ou a configuração mudou.');
$shared = $request->is('api/a/*','api/b1/*','api/document-preview/draft/*','api/document-preview/history/*','api/document-preparation/*');
abort_unless($active === $owner || $shared, 409, 'Este percurso pertence a outro módulo. Mude de módulo antes de o abrir.');
$request->attributes->set('sgf_module',$active);
// Reads also carry the generation: stale tabs and late requests cannot mix contexts.
// Standalone HTML pages use the current session; their APIs must carry the token.
if ($request->is('api/*') && !$request->is('api/service-invoices/*/pdf')) {
abort_unless(hash_equals($selected['token'] ?? '', (string)$request->header('X-SGF-Context')), 409, 'O contexto mudou. Reabra este percurso.');
}
}
}