91 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.5 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($request) ?? 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();
 | 
						|
            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;
 | 
						|
            }
 | 
						|
            Integration::captureUnhandledException($e);
 | 
						|
        });
 | 
						|
    }
 | 
						|
}
 |