withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', channels: __DIR__.'/../routes/channels.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { // Trust Cloudflare + Coolify Traefik so HTTPS scheme is detected // and X-Forwarded-* headers are honored. $middleware->trustProxies(at: '*', headers: Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB ); // ResolveTenant must run on EVERY web request (including Livewire // /livewire/update endpoints) so tenant context is set before // any DB query goes through the global TenantScope. $middleware->web(append: [ \App\Http\Middleware\ResolveTenant::class, \App\Http\Middleware\CheckTenantStatus::class, \App\Http\Middleware\SetLocale::class, ]); // API routes also need tenant resolution by host so the same // Eloquent TenantScope works. $middleware->api(prepend: [ \App\Http\Middleware\ResolveTenant::class, \App\Http\Middleware\CheckTenantStatus::class, ]); }) ->withExceptions(function (Exceptions $exceptions): void { // Force JSON responses on /api/* even when client did not send Accept: json. $exceptions->shouldRenderJsonWhen(function (Request $request, \Throwable $e) { if ($request->is('api/*')) return true; return $request->expectsJson(); }); })->create();