import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; export async function middleware(request: NextRequest) { const hostname = request.headers.get('host') || ''; const url = request.nextUrl; const apiBase = process.env.API_INTERNAL_URL || 'http://backend:8080'; // Extrair subdomínio (remover porta se houver) const hostnameWithoutPort = hostname.split(':')[0]; const subdomain = hostnameWithoutPort.split('.')[0]; // Se tem subdomínio (ex: vivo.localhost), SEMPRE validar se existe if (hostname.includes('.')) { try { const res = await fetch(`${apiBase}/api/tenant/check?subdomain=${subdomain}`, { cache: 'no-store', headers: { 'Content-Type': 'application/json', } }); if (!res.ok) { console.error(`❌ Tenant check failed for ${subdomain}: ${res.status}`); if (res.status === 404) { console.error(`❌ Tenant ${subdomain} não encontrado - BLOQUEANDO ACESSO`); // Tenant não existe, redirecionar para página principal (sem subdomínio) const baseHost = hostname.split('.').slice(1).join('.') || 'localhost'; const redirectUrl = new URL(`http://${baseHost}/`); return NextResponse.redirect(redirectUrl); } } // Se passou pela validação, tenant existe - continuar console.log(`✅ Tenant ${subdomain} validado com sucesso`); } catch (err) { console.error('❌ Middleware error:', err); // Em caso de erro de rede, bloquear por segurança const baseHost = hostname.split('.').slice(1).join('.') || 'localhost'; const redirectUrl = new URL(`http://${baseHost}/`); return NextResponse.redirect(redirectUrl); } } // Para requisições de API, adicionar headers com informações do tenant if (url.pathname.startsWith('/api/')) { // Cria um header customizado com o subdomain const requestHeaders = new Headers(request.headers); requestHeaders.set('X-Tenant-Subdomain', subdomain); requestHeaders.set('X-Original-Host', hostname); return NextResponse.rewrite(url, { request: { headers: requestHeaders, }, }); } // Permitir acesso normal return NextResponse.next(); } export const config = { matcher: [ /* * Match all request paths except for the ones starting with: * - _next/static (static files) * - _next/image (image optimization files) * - favicon.ico (favicon file) */ '/((?!_next/static|_next/image|favicon.ico).*)', ], };