diff --git a/app/Exceptions/AlreadySubscribedException.php b/app/Exceptions/AlreadySubscribedException.php new file mode 100644 index 00000000..dacf00dc --- /dev/null +++ b/app/Exceptions/AlreadySubscribedException.php @@ -0,0 +1,24 @@ + + */ +class AlreadySubscribedException extends Exception implements ExceptionInterface +{ + // +} diff --git a/app/Exceptions/ExceptionInterface.php b/app/Exceptions/ExceptionInterface.php new file mode 100644 index 00000000..15ce0eee --- /dev/null +++ b/app/Exceptions/ExceptionInterface.php @@ -0,0 +1,22 @@ + + */ +interface ExceptionInterface +{ + // +} diff --git a/app/Exceptions/Transformers/ModelNotFoundTransformer.php b/app/Exceptions/Transformers/ExceptionTransformer.php similarity index 65% rename from app/Exceptions/Transformers/ModelNotFoundTransformer.php rename to app/Exceptions/Transformers/ExceptionTransformer.php index 69ea37ba..2e4fb2b9 100644 --- a/app/Exceptions/Transformers/ModelNotFoundTransformer.php +++ b/app/Exceptions/Transformers/ExceptionTransformer.php @@ -11,17 +11,19 @@ namespace CachetHQ\Cachet\Exceptions\Transformers; +use CachetHQ\Cachet\Exceptions\ExceptionInterface; use Exception; use GrahamCampbell\Exceptions\Transformers\TransformerInterface; use Illuminate\Database\Eloquent\ModelNotFoundException; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** - * This is the model not found transformer class. + * This is the exception transformer class. * * @author Graham Campbell */ -class ModelNotFoundTransformer implements TransformerInterface +class ExceptionTransformer implements TransformerInterface { /** * Transform the provided exception. @@ -32,8 +34,10 @@ class ModelNotFoundTransformer implements TransformerInterface */ public function transform(Exception $exception) { - if ($exception instanceof ModelNotFoundException) { - $exception = new NotFoundHttpException('Resource not found'); + if ($exception instanceof ExceptionInterface) { + $exception = new BadRequestHttpException($exception->getMessage()); + } elseif ($exception instanceof ModelNotFoundException) { + $exception = new NotFoundHttpException('Resource not found.'); } return $exception; diff --git a/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php b/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php index e96fb8fe..9ab617ed 100644 --- a/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php +++ b/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php @@ -14,6 +14,7 @@ namespace CachetHQ\Cachet\Handlers\Commands\Subscriber; use CachetHQ\Cachet\Commands\Subscriber\SubscribeSubscriberCommand; use CachetHQ\Cachet\Commands\Subscriber\VerifySubscriberCommand; use CachetHQ\Cachet\Events\Subscriber\SubscriberHasSubscribedEvent; +use CachetHQ\Cachet\Exceptions\AlreadySubscribedException; use CachetHQ\Cachet\Models\Subscriber; use Illuminate\Foundation\Bus\DispatchesJobs; @@ -26,10 +27,16 @@ class SubscribeSubscriberCommandHandler * * @param \CachetHQ\Cachet\Commands\Subscriber\SubscribeSubscriberCommand $command * + * @throws \CachetHQ\Cachet\Exceptions\AlreadySubscribedException + * * @return \CachetHQ\Cachet\Models\Subscriber */ public function handle(SubscribeSubscriberCommand $command) { + if (Subscriber::where('email', $command->email)->first()) { + throw new AlreadySubscribedException("Cannot subscribe {$command->email} because they're already subscribed."); + } + $subscriber = Subscriber::create(['email' => $command->email]); if ($command->verified) { diff --git a/config/exceptions.php b/config/exceptions.php index 06dcaffe..11064dd6 100644 --- a/config/exceptions.php +++ b/config/exceptions.php @@ -27,7 +27,7 @@ return [ 'transformers' => [ 'GrahamCampbell\Exceptions\Transformers\CsrfTransformer', - 'CachetHQ\Cachet\Exceptions\Transformers\ModelNotFoundTransformer', + 'CachetHQ\Cachet\Exceptions\Transformers\ExceptionTransformer', ], /*