fix: auth race condition on refresh, section edit dialog, time slot duplicate, autocomplete disable
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,10 +2,15 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Illuminate\Auth\AuthenticationException;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Foundation\Configuration\Exceptions;
|
||||
use Illuminate\Foundation\Configuration\Middleware;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
|
||||
return Application::configure(basePath: dirname(__DIR__))
|
||||
@@ -23,13 +28,63 @@ return Application::configure(basePath: dirname(__DIR__))
|
||||
]);
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions): void {
|
||||
// Return JSON for all API exceptions
|
||||
// Database connection / query errors → 503
|
||||
$exceptions->render(function (QueryException|PDOException $e, Request $request) {
|
||||
if ($request->expectsJson() || $request->is('api/*')) {
|
||||
Log::error('Database error', [
|
||||
'exception' => get_class($e),
|
||||
'message' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
]);
|
||||
|
||||
$response = ['message' => 'Service temporarily unavailable. Please try again later.'];
|
||||
|
||||
if (config('app.debug')) {
|
||||
$response['debug'] = [
|
||||
'exception' => get_class($e),
|
||||
'message' => $e->getMessage(),
|
||||
];
|
||||
}
|
||||
|
||||
return response()->json($response, 503);
|
||||
}
|
||||
});
|
||||
|
||||
// 404 Not Found → friendly message
|
||||
$exceptions->render(function (NotFoundHttpException $e, Request $request) {
|
||||
if ($request->is('api/*')) {
|
||||
if ($request->expectsJson() || $request->is('api/*')) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Resource not found',
|
||||
'message' => 'Resource not found.',
|
||||
], 404);
|
||||
}
|
||||
});
|
||||
|
||||
// All other unhandled exceptions → 500
|
||||
// (ValidationException, AuthenticationException, and HttpException are handled by Laravel)
|
||||
$exceptions->render(function (Throwable $e, Request $request) {
|
||||
if ($request->expectsJson() || $request->is('api/*')) {
|
||||
if ($e instanceof ValidationException
|
||||
|| $e instanceof AuthenticationException
|
||||
|| $e instanceof HttpException) {
|
||||
return null; // Let Laravel handle these normally
|
||||
}
|
||||
|
||||
Log::error('Unhandled exception', [
|
||||
'exception' => get_class($e),
|
||||
'message' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
]);
|
||||
|
||||
$response = ['message' => 'An unexpected error occurred.'];
|
||||
|
||||
if (config('app.debug')) {
|
||||
$response['debug'] = [
|
||||
'exception' => get_class($e),
|
||||
'message' => $e->getMessage(),
|
||||
];
|
||||
}
|
||||
|
||||
return response()->json($response, 500);
|
||||
}
|
||||
});
|
||||
})->create();
|
||||
|
||||
Reference in New Issue
Block a user