withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { $middleware->alias([ 'role' => RoleMiddleware::class, 'permission' => PermissionMiddleware::class, 'mask_phone' => MaskPhoneNumber::class, ]); $middleware->api(prepend: [ EnsureFrontendRequestsAreStateful::class, ]); $middleware->api(append: [ MaskPhoneNumber::class, ]); $middleware->redirectGuestsTo(fn (Request $request) => $request->is('api/*') || $request->expectsJson() ? null : '/login'); $middleware->append(SecurityHeaders::class); }) ->withExceptions(function (Exceptions $exceptions): void { $exceptions->render(function (AuthenticationException $e, Request $request) { if ($request->is('api/*')) { return response()->json(['message' => 'Unauthenticated.'], 401); } }); $exceptions->render(function (AuthorizationException $e, Request $request) { if ($request->is('api/*')) { return ApiResponse::error($e->getMessage() ?: 'دسترسی غیرمجاز', 'FORBIDDEN', 403); } }); $exceptions->render(function (ValidationException $e, Request $request) { if ($request->is('api/*')) { return ApiResponse::error($e->getMessage(), 'VALIDATION_FAILED', 422, $e->errors()); } }); $exceptions->render(function (TaskVersionConflictException $e, Request $request) { if ($request->is('api/*')) { return ApiResponse::error($e->getMessage(), 'VERSION_CONFLICT', 409); } }); })->create();