diff --git a/src/Api/Client.php b/src/Api/Client.php index 3a01a7302..42f46da32 100644 --- a/src/Api/Client.php +++ b/src/Api/Client.php @@ -10,11 +10,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 @@ -25,18 +28,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; } /** @@ -67,23 +70,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/src/Frontend/Frontend.php b/src/Frontend/Frontend.php index 5d25b9b15..e293ef359 100644 --- a/src/Frontend/Frontend.php +++ b/src/Frontend/Frontend.php @@ -68,8 +68,6 @@ class Frontend { $actor = $request->getAttribute('actor'); - $this->api->setErrorHandler(null); - return $this->getResponseBody( $this->api->send(ShowForumController::class, $actor) ); diff --git a/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php b/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php index 4ee0101a0..6139adcd2 100644 --- a/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php +++ b/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php @@ -15,7 +15,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; @@ -61,11 +60,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/tests/integration/api/Controller/ApiControllerTestCase.php b/tests/integration/api/Controller/ApiControllerTestCase.php index 4298937f4..958ae21b3 100644 --- a/tests/integration/api/Controller/ApiControllerTestCase.php +++ b/tests/integration/api/Controller/ApiControllerTestCase.php @@ -51,8 +51,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/tests/integration/api/Controller/CreateDiscussionControllerTest.php b/tests/integration/api/Controller/CreateDiscussionControllerTest.php index bd1e27f2e..1309b6ade 100644 --- a/tests/integration/api/Controller/CreateDiscussionControllerTest.php +++ b/tests/integration/api/Controller/CreateDiscussionControllerTest.php @@ -13,7 +13,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 { @@ -70,11 +69,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()); } /** @@ -85,10 +82,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/tests/integration/api/Controller/CreateGroupControllerTest.php b/tests/integration/api/Controller/CreateGroupControllerTest.php index 0f8104e4f..0a6b13d40 100644 --- a/tests/integration/api/Controller/CreateGroupControllerTest.php +++ b/tests/integration/api/Controller/CreateGroupControllerTest.php @@ -11,11 +11,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 { @@ -53,10 +51,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()); } /** @@ -87,8 +82,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/tests/integration/api/Controller/CreateUserControllerTest.php b/tests/integration/api/Controller/CreateUserControllerTest.php index d47edf372..5f55e6450 100644 --- a/tests/integration/api/Controller/CreateUserControllerTest.php +++ b/tests/integration/api/Controller/CreateUserControllerTest.php @@ -11,10 +11,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 { @@ -51,10 +49,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()); } /** @@ -104,12 +101,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/tests/integration/api/Controller/ListNotificationsControllerTest.php b/tests/integration/api/Controller/ListNotificationsControllerTest.php index fefe8009f..cacd8dfb0 100644 --- a/tests/integration/api/Controller/ListNotificationsControllerTest.php +++ b/tests/integration/api/Controller/ListNotificationsControllerTest.php @@ -10,7 +10,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 @@ -33,9 +32,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/tests/integration/api/Controller/ListUsersControllerTest.php b/tests/integration/api/Controller/ListUsersControllerTest.php index a3f74e518..89242fc8e 100644 --- a/tests/integration/api/Controller/ListUsersControllerTest.php +++ b/tests/integration/api/Controller/ListUsersControllerTest.php @@ -10,7 +10,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 @@ -39,9 +38,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/tests/integration/api/Controller/ShowDiscussionControllerTest.php b/tests/integration/api/Controller/ShowDiscussionControllerTest.php index 4b9f579b6..f13836f15 100644 --- a/tests/integration/api/Controller/ShowDiscussionControllerTest.php +++ b/tests/integration/api/Controller/ShowDiscussionControllerTest.php @@ -13,7 +13,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 { @@ -71,11 +70,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()); } /** @@ -93,8 +90,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()); } }