40 lines
1.9 KiB
PHP
40 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Modules\Identity\Http;
|
|
|
|
use App\Shared\Context\CompanyContext;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
final class RequireCompanyContext
|
|
{
|
|
public function __construct(private CompanyContext $context) {}
|
|
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
$this->context->clear();
|
|
try {
|
|
$selection = $request->session()->get('company_context', []);
|
|
$tenant = $selection['tenant_id'] ?? null;
|
|
$company = $selection['company_id'] ?? null;
|
|
abort_unless($request->user() && $tenant && $company, 403, 'Contexto de empresa obrigatório.');
|
|
$this->context->selectFor((int) $request->user()->getKey(), $tenant, $company, $selection['unit_id'] ?? null);
|
|
if (! $request->isMethodSafe()) {
|
|
$token = $request->header('X-SGF-Context');
|
|
abort_unless(is_string($token) && hash_equals($selection['token'] ?? '', $token), 409, 'O contexto mudou. Reabra o formulário antes de guardar.');
|
|
}
|
|
|
|
app(\App\Shared\Context\RequireModuleContext::class)->check($request, $this->context);
|
|
$response = $next($request);
|
|
if ($request->isMethod('GET') && in_array($request->path(), ['supplier-payables','supplier-payments'], true) && $response->isSuccessful()) {
|
|
$bar = '<nav aria-label="Contexto SGF" style="padding:12px;background:#edf4f3;color:#163e38"><strong>Módulo activo: Compras</strong> · <a href="/" data-sgf-module-back>Voltar à navegação SGF</a></nav><script src="/sgf-module-context.js" defer></script>';
|
|
$response->setContent(preg_replace('/(<body\b[^>]*>)/i', '$1'.$bar, $response->getContent(), 1));
|
|
}
|
|
return $response;
|
|
} finally {
|
|
$this->context->clear();
|
|
}
|
|
}
|
|
}
|