withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', apiPrefix: '', commands: __DIR__.'/../routes/console.php', channels: __DIR__.'/../routes/channels.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { $middleware->trustProxies(at: '*'); $middleware->encryptCookies(except: ['appearance', 'sidebar_state', 'locale']); $middleware->web(append: [ SetLocale::class, HandleAppearance::class, HandleInertiaRequests::class, AddLinkHeadersForPreloadedAssets::class, ]); $middleware->alias([ 'api.auth' => AuthenticateApiToken::class, 'mcp.auth' => AuthenticateMcpToken::class, ]); $middleware->preventRequestForgery(except: [ 'stripe/*', ]); $middleware->prependToPriorityList( ThrottleRequests::class, AuthenticateApiToken::class, ); }) ->withExceptions(function (Exceptions $exceptions): void { $exceptions->renderable(function (TooManyRequestsHttpException $e, Request $request) { if ($request->expectsJson()) { $retryAfter = $e->getHeaders()['Retry-After'] ?? null; $message = $retryAfter ? "Rate limit exceeded. Please retry after {$retryAfter} seconds." : 'Rate limit exceeded. Please try again later.'; return response()->json([ 'name' => 'rate_limit_exceeded', 'message' => $message, ], 429)->withHeaders($e->getHeaders()); } }); })->create();