webmoney/backend/app/Http/Middleware/DemoProtection.php
marcoitaloesp-ai 9c9d6443e7
v1.57.0: Redesign category modals + i18n updates + demo transactions fix
- Redesigned category create/edit modal with elegant wizard-style UI
- Redesigned batch categorization modal with visual cards and better preview
- Added missing i18n translations (common.continue, creating, remove)
- Added budgets.general and wizard translations for ES, PT-BR, EN
- Fixed 3 demo user transactions that were missing categories
2025-12-18 19:06:07 +00:00

79 lines
2.4 KiB
PHP

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class DemoProtection
{
/**
* Rotas e métodos permitidos para usuário demo (whitelist)
* Estas rotas são operações de leitura/cálculo que não modificam dados reais
*/
protected array $allowedRoutes = [
'GET' => ['*'], // Permite todos os GETs
'POST' => [
'api/login',
'api/logout',
'api/refresh',
'api/accounts/recalculate-all', // Recálculo de saldos (não modifica dados)
'api/accounts/*/recalculate', // Recálculo de conta específica
'api/categories/match', // Matching de categorias (leitura)
'api/cost-centers/match', // Matching de centros de custo (leitura)
],
];
/**
* Handle an incoming request.
* Bloqueia operações de escrita (POST/PUT/PATCH/DELETE) para usuário demo
*/
public function handle(Request $request, Closure $next): Response
{
$user = $request->user();
// Se não está logado ou não é demo, permite tudo
if (!$user || !$user->is_demo) {
return $next($request);
}
$method = $request->method();
$path = $request->path();
// GET sempre permitido para demo
if ($method === 'GET') {
return $next($request);
}
// Verifica se a rota está na whitelist
if (isset($this->allowedRoutes[$method])) {
foreach ($this->allowedRoutes[$method] as $allowedPath) {
if ($allowedPath === '*' || $this->pathMatches($path, $allowedPath)) {
return $next($request);
}
}
}
// Bloqueia a operação para usuário demo
return response()->json([
'success' => false,
'message' => 'Usuario DEMO: Esta acción no está permitida en modo demostración. Los datos no pueden ser modificados.',
'demo_mode' => true,
], 403);
}
/**
* Verifica se o path corresponde ao padrão
*/
protected function pathMatches(string $path, string $pattern): bool
{
if ($pattern === '*') {
return true;
}
$pattern = str_replace('*', '.*', $pattern);
return (bool) preg_match('#^' . $pattern . '$#', $path);
}
}