88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Exceptions;
 | |
| 
 | |
| use App\Models\InstanceSettings;
 | |
| use App\Models\User;
 | |
| use Illuminate\Auth\AuthenticationException;
 | |
| use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
 | |
| use RuntimeException;
 | |
| use Sentry\Laravel\Integration;
 | |
| use Sentry\State\Scope;
 | |
| use Throwable;
 | |
| 
 | |
| class Handler extends ExceptionHandler
 | |
| {
 | |
| 
 | |
|     /**
 | |
|      * A list of exception types with their corresponding custom log levels.
 | |
|      *
 | |
|      * @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>
 | |
|      */
 | |
|     protected $levels = [
 | |
|         //
 | |
|     ];
 | |
|     /**
 | |
|      * A list of the exception types that are not reported.
 | |
|      *
 | |
|      * @var array<int, class-string<\Throwable>>
 | |
|      */
 | |
|     protected $dontReport = [
 | |
|         ProcessException::class
 | |
|     ];
 | |
|     /**
 | |
|      * A list of the inputs that are never flashed to the session on validation exceptions.
 | |
|      *
 | |
|      * @var array<int, string>
 | |
|      */
 | |
|     protected $dontFlash = [
 | |
|         'current_password',
 | |
|         'password',
 | |
|         'password_confirmation',
 | |
|     ];
 | |
|     private InstanceSettings $settings;
 | |
| 
 | |
|     protected function unauthenticated($request, AuthenticationException $exception)
 | |
|     {
 | |
|         if ($request->is('api/*') || $request->expectsJson() || $this->shouldReturnJson($request, $exception)) {
 | |
|             return response()->json(['message' => $exception->getMessage()], 401);
 | |
|         }
 | |
|         return redirect()->guest($exception->redirectTo() ?? route('login'));
 | |
|     }
 | |
|     /**
 | |
|      * Register the exception handling callbacks for the application.
 | |
|      */
 | |
|     public function register(): void
 | |
|     {
 | |
|         $this->reportable(function (Throwable $e) {
 | |
|             if (isDev()) {
 | |
|                 // return;
 | |
|             }
 | |
|             if ($e instanceof RuntimeException) {
 | |
|                 return;
 | |
|             }
 | |
|             $this->settings = InstanceSettings::get();
 | |
|             if ($this->settings->do_not_track) {
 | |
|                 return;
 | |
|             }
 | |
|             app('sentry')->configureScope(
 | |
|                 function (Scope $scope) {
 | |
|                     $email = auth()?->user() ? auth()->user()->email : 'guest';
 | |
|                     $instanceAdmin = User::find(0)->email ?? 'admin@localhost';
 | |
|                     $scope->setUser(
 | |
|                         [
 | |
|                             'email' => $email,
 | |
|                             'instanceAdmin' => $instanceAdmin
 | |
|                         ]
 | |
|                     );
 | |
|                 }
 | |
|             );
 | |
|             if (str($e->getMessage())->contains('No space left on device')) {
 | |
|                 return;
 | |
|             }
 | |
|             ray('reporting to sentry');
 | |
|             Integration::captureUnhandledException($e);
 | |
|         });
 | |
|     }
 | |
| }
 | 
