import createMiddleware from 'next-intl/middleware'; import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; import { getServerAppServices } from '@/lib/services/create-services.server'; // Create the internationalization middleware const intlMiddleware = createMiddleware({ // A list of all locales that are supported locales: ['en', 'de'], // Used when no locale matches defaultLocale: 'en' }); // Main middleware that logs all requests export default function middleware(request: NextRequest) { const startTime = Date.now(); const { method, url, headers } = request; const userAgent = headers.get('user-agent') || 'unknown'; const referer = headers.get('referer') || 'none'; const ip = headers.get('x-forwarded-for') || headers.get('x-real-ip') || 'unknown'; // Get logger service const services = getServerAppServices(); const logger = services.logger.child({ middleware: 'request-logger' }); // Log incoming request logger.info(`Incoming request: method=${method} url=${url} ip=${ip} ua="${userAgent.slice(0,60)}${userAgent.length>60 ? '...' : ''}" ref="${referer.slice(0,80)}${referer.length>80 ? '...' : ''}"`); try { // Apply internationalization middleware const response = intlMiddleware(request); const duration = Date.now() - startTime; // Log successful response if (response.status >= 300 && response.status < 400) { const location = response.headers.get('location') || 'unknown'; logger.info(`Redirect detected: status=${response.status} location="${location.slice(0,100)}${location.length>100?'...':''}" method=${method} url=${url} duration=${duration}ms ip=${ip} ua="${userAgent.slice(0,60)}${userAgent.length>60?'...':''}" ref="${referer.slice(0,80)}${referer.length>80?'...':''}"`); } else { logger.info(`Request completed: status=${response.status} method=${method} url=${url} duration=${duration}ms ip=${ip} ua="${userAgent.slice(0,60)}${userAgent.length>60?'...':''}" ref="${referer.slice(0,80)}${referer.length>80?'...':''}"`); } return response; } catch (error) { const duration = Date.now() - startTime; // Log error const errorMsg = error instanceof Error ? error.message : String(error); logger.error(`Request failed: method=${method} url=${url} duration=${duration}ms error="${errorMsg}" ip=${ip} ua="${userAgent.slice(0,60)}${userAgent.length>60?'...':''}" ref="${referer.slice(0,80)}${referer.length>80?'...':''}"`); // Re-throw the error to let Next.js handle it throw error; } } export const config = { // Match only internationalized pathnames matcher: ['/((?!api|_next|_vercel|.*\\..*).*)', '/', '/(de|en)/:path*'] };