From: Thomas Kuschan Date: Wed, 14 Jun 2023 09:07:13 +0000 (+0200) Subject: Refactor notify exception to clean up api exception handling X-Git-Tag: v23.06~1^2~20^2~1 X-Git-Url: http://source.bookstackapp.com/bookstack/commitdiff_plain/refs/pull/4291/head?ds=sidebyside Refactor notify exception to clean up api exception handling --- diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 02da3d5de..36bdf845d 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -103,10 +103,6 @@ class Handler extends ExceptionHandler $code = $e->status; } - if (method_exists($e, 'getStatus')) { - $code = $e->getStatus(); - } - $responseData['error']['code'] = $code; return new JsonResponse($responseData, $code, $headers); diff --git a/app/Exceptions/NotifyException.php b/app/Exceptions/NotifyException.php index 307916db7..67ef27a75 100644 --- a/app/Exceptions/NotifyException.php +++ b/app/Exceptions/NotifyException.php @@ -4,29 +4,61 @@ namespace BookStack\Exceptions; use Exception; use Illuminate\Contracts\Support\Responsable; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; -class NotifyException extends Exception implements Responsable +class NotifyException extends Exception implements Responsable, HttpExceptionInterface { public $message; public $redirectLocation; protected $status; + /** + * @var array + */ + protected array $headers = []; + public function __construct(string $message, string $redirectLocation = '/', int $status = 500) { $this->message = $message; $this->redirectLocation = $redirectLocation; $this->status = $status; + + if ($status >= 300 && $status < 400) { + // add redirect header only when a matching HTTP status is given + $this->headers = ['location' => $redirectLocation]; + } + parent::__construct(); } /** - * Get the desired status code for this exception. + * Get the desired HTTP status code for this exception. + * + * {@inheritdoc} */ - public function getStatus(): int + public function getStatusCode(): int { return $this->status; } + /** + * Get the desired HTTP headers for this exception. + * + * {@inheritdoc} + */ + public function getHeaders(): array + { + return $this->headers; + } + + /** + * @param array $headers + */ + public function setHeaders(array $headers): void + { + $this->headers = $headers; + } + /** * Send the response for this type of exception. * @@ -38,7 +70,7 @@ class NotifyException extends Exception implements Responsable // Front-end JSON handling. API-side handling managed via handler. if ($request->wantsJson()) { - return response()->json(['error' => $message], 403); + return response()->json(['error' => $message], $this->getStatusCode()); } if (!empty($message)) {