diff --git a/framework/core/src/Api/Client.php b/framework/core/src/Api/Client.php index beaed329d..684a00a55 100644 --- a/framework/core/src/Api/Client.php +++ b/framework/core/src/Api/Client.php @@ -12,11 +12,14 @@ namespace Flarum\Api; use Exception; +use Flarum\Foundation\ErrorHandling\JsonApiRenderer; +use Flarum\Foundation\ErrorHandling\Registry; use Flarum\User\User; use Illuminate\Contracts\Container\Container; use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\RequestHandlerInterface; +use Throwable; use Zend\Diactoros\ServerRequestFactory; class Client @@ -27,18 +30,18 @@ class Client protected $container; /** - * @var ErrorHandler + * @var Registry */ - protected $errorHandler; + protected $registry; /** * @param Container $container - * @param ErrorHandler $errorHandler + * @param Registry $registry */ - public function __construct(Container $container, ErrorHandler $errorHandler = null) + public function __construct(Container $container, Registry $registry) { $this->container = $container; - $this->errorHandler = $errorHandler; + $this->registry = $registry; } /** @@ -69,23 +72,14 @@ class Client try { return $controller->handle($request); - } catch (Exception $e) { - if (! $this->errorHandler) { + } catch (Throwable $e) { + $error = $this->registry->handle($e); + + if ($error->shouldBeReported()) { throw $e; } - return $this->errorHandler->handle($e); + return (new JsonApiRenderer)->format($error, $request); } } - - /** - * @param ErrorHandler $errorHandler - * @return Client - */ - public function setErrorHandler(?ErrorHandler $errorHandler): self - { - $this->errorHandler = $errorHandler; - - return $this; - } } diff --git a/framework/core/src/Frontend/Frontend.php b/framework/core/src/Frontend/Frontend.php index 791d1feb2..acf0564cc 100644 --- a/framework/core/src/Frontend/Frontend.php +++ b/framework/core/src/Frontend/Frontend.php @@ -70,8 +70,6 @@ class Frontend { $actor = $request->getAttribute('actor'); - $this->api->setErrorHandler(null); - return $this->getResponseBody( $this->api->send(ShowForumController::class, $actor) ); diff --git a/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php b/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php index d4a5fadde..1ba3ce5a1 100644 --- a/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php +++ b/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php @@ -17,7 +17,6 @@ use Flarum\Api\Client; use Flarum\Api\Controller\CreateGroupController; use Flarum\Tests\integration\RetrievesAuthorizedUsers; use Flarum\Tests\integration\TestCase; -use Flarum\User\Exception\PermissionDeniedException; use Flarum\User\Guest; use Flarum\User\User; use Illuminate\Support\Str; @@ -63,11 +62,10 @@ class AuthenticateWithApiKeyTest extends TestCase { /** @var Client $api */ $api = $this->app()->getContainer()->make(Client::class); - $api->setErrorHandler(null); - $this->expectException(PermissionDeniedException::class); + $response = $api->send(CreateGroupController::class, new Guest); - $api->send(CreateGroupController::class, new Guest); + $this->assertEquals(403, $response->getStatusCode()); } /** diff --git a/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php b/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php index 4f0b1296f..05085b801 100644 --- a/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php +++ b/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php @@ -53,8 +53,6 @@ abstract class ApiControllerTestCase extends TestCase /** @var Client $api */ $api = $this->app()->getContainer()->make(Client::class); - $api->setErrorHandler(null); - return $api->send($controller, $actor ?? new Guest, $queryParams, $body); } } diff --git a/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php b/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php index eec919d94..7e23f319d 100644 --- a/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php @@ -15,7 +15,6 @@ use Flarum\Api\Controller\CreateDiscussionController; use Flarum\Discussion\Discussion; use Flarum\User\User; use Illuminate\Support\Arr; -use Illuminate\Validation\ValidationException; class CreateDiscussionControllerTest extends ApiControllerTestCase { @@ -72,11 +71,9 @@ class CreateDiscussionControllerTest extends ApiControllerTestCase $this->actor = User::find(1); $data = Arr::except($this->data, 'content'); + $response = $this->callWith($data); - $this->expectException(ValidationException::class); - $this->expectExceptionMessage('The given data was invalid.'); - - $this->callWith($data); + $this->assertEquals(422, $response->getStatusCode()); } /** @@ -87,10 +84,8 @@ class CreateDiscussionControllerTest extends ApiControllerTestCase $this->actor = User::find(1); $data = Arr::except($this->data, 'title'); + $response = $this->callWith($data); - $this->expectException(ValidationException::class); - $this->expectExceptionMessage('The given data was invalid.'); - - $this->callWith($data); + $this->assertEquals(422, $response->getStatusCode()); } } diff --git a/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php b/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php index 7ab771fa6..d2edcada1 100644 --- a/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php @@ -13,11 +13,9 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\CreateGroupController; use Flarum\Group\Group; -use Flarum\User\Exception\PermissionDeniedException; use Flarum\User\User; use Illuminate\Support\Arr; use Illuminate\Support\Str; -use Illuminate\Validation\ValidationException; class CreateGroupControllerTest extends ApiControllerTestCase { @@ -55,10 +53,7 @@ class CreateGroupControllerTest extends ApiControllerTestCase { $this->actor = User::find(1); - $this->expectException(ValidationException::class); - $this->expectExceptionMessage('The given data was invalid.'); - - $this->callWith(); + $this->assertEquals(422, $this->callWith()->getStatusCode()); } /** @@ -89,8 +84,6 @@ class CreateGroupControllerTest extends ApiControllerTestCase { $this->actor = User::find(2); - $this->expectException(PermissionDeniedException::class); - - $this->callWith($this->data); + $this->assertEquals(403, $this->callWith($this->data)->getStatusCode()); } } diff --git a/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php b/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php index f437ec699..d2caad23e 100644 --- a/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php @@ -13,10 +13,8 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\CreateUserController; use Flarum\Settings\SettingsRepositoryInterface; -use Flarum\User\Exception\PermissionDeniedException; use Flarum\User\User; use Illuminate\Support\Arr; -use Illuminate\Validation\ValidationException; class CreateUserControllerTest extends ApiControllerTestCase { @@ -53,10 +51,9 @@ class CreateUserControllerTest extends ApiControllerTestCase */ public function cannot_create_user_without_data() { - $this->expectException(ValidationException::class); - $this->expectExceptionMessage('The given data was invalid.'); + $response = $this->callWith(); - $this->callWith(); + $this->assertEquals(422, $response->getStatusCode()); } /** @@ -106,12 +103,9 @@ class CreateUserControllerTest extends ApiControllerTestCase $settings = app(SettingsRepositoryInterface::class); $settings->set('allow_sign_up', false); - $this->expectException(PermissionDeniedException::class); + $response = $this->callWith($this->data); + $this->assertEquals(403, $response->getStatusCode()); - try { - $this->callWith($this->data); - } finally { - $settings->set('allow_sign_up', true); - } + $settings->set('allow_sign_up', true); } } diff --git a/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php b/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php index a7a64924a..9f301607b 100644 --- a/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php @@ -12,7 +12,6 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\ListNotificationsController; -use Flarum\User\Exception\PermissionDeniedException; use Flarum\User\User; class ListNotificationsControllerTest extends ApiControllerTestCase @@ -35,9 +34,9 @@ class ListNotificationsControllerTest extends ApiControllerTestCase */ public function disallows_index_for_guest() { - $this->expectException(PermissionDeniedException::class); + $response = $this->callWith(); - $this->callWith(); + $this->assertEquals(403, $response->getStatusCode()); } /** diff --git a/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php b/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php index 919f01ddc..35eee7504 100644 --- a/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php @@ -12,7 +12,6 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\ListUsersController; -use Flarum\User\Exception\PermissionDeniedException; use Flarum\User\User; class ListUsersControllerTest extends ApiControllerTestCase @@ -41,9 +40,9 @@ class ListUsersControllerTest extends ApiControllerTestCase */ public function disallows_index_for_guest() { - $this->expectException(PermissionDeniedException::class); + $response = $this->callWith(); - $this->callWith(); + $this->assertEquals(403, $response->getStatusCode()); } /** diff --git a/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php b/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php index 50619c789..db9da7c67 100644 --- a/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php @@ -15,7 +15,6 @@ use Carbon\Carbon; use Flarum\Api\Controller\ShowDiscussionController; use Flarum\Discussion\Discussion; use Flarum\User\User; -use Illuminate\Database\Eloquent\ModelNotFoundException; class ShowDiscussionControllerTest extends ApiControllerTestCase { @@ -73,11 +72,9 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ public function guest_cannot_see_empty_discussion() { - $this->expectException(ModelNotFoundException::class); - $response = $this->callWith([], ['id' => 1]); - $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals(404, $response->getStatusCode()); } /** @@ -95,8 +92,8 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ public function guests_cannot_see_private_discussion() { - $this->expectException(ModelNotFoundException::class); + $response = $this->callWith([], ['id' => 3]); - $this->callWith([], ['id' => 3]); + $this->assertEquals(404, $response->getStatusCode()); } }