diff --git a/app/Commands/Subscriber/SubscribeSubscriberCommand.php b/app/Commands/Subscriber/SubscribeSubscriberCommand.php
new file mode 100644
index 00000000..d409d18f
--- /dev/null
+++ b/app/Commands/Subscriber/SubscribeSubscriberCommand.php
@@ -0,0 +1,52 @@
+ 'required|email',
+ ];
+
+ /**
+ * Create a new subscribe subscriber command instance.
+ *
+ * @param string $email
+ * @param bool $verified
+ *
+ * @return void
+ */
+ public function __construct($email, $verified = false)
+ {
+ $this->email = $email;
+ $this->verified = $verified;
+ }
+}
diff --git a/app/Commands/Subscriber/UnsubscribeSubscriberCommand.php b/app/Commands/Subscriber/UnsubscribeSubscriberCommand.php
new file mode 100644
index 00000000..e49c0ffe
--- /dev/null
+++ b/app/Commands/Subscriber/UnsubscribeSubscriberCommand.php
@@ -0,0 +1,36 @@
+subscriber = $subscriber;
+ }
+}
diff --git a/app/Commands/Subscriber/SubscribeCustomerCommand.php b/app/Commands/Subscriber/VerifySubscriberCommand.php
similarity index 54%
rename from app/Commands/Subscriber/SubscribeCustomerCommand.php
rename to app/Commands/Subscriber/VerifySubscriberCommand.php
index f7051d3d..91bf6414 100644
--- a/app/Commands/Subscriber/SubscribeCustomerCommand.php
+++ b/app/Commands/Subscriber/VerifySubscriberCommand.php
@@ -11,24 +11,26 @@
namespace CachetHQ\Cachet\Commands\Subscriber;
-class SubscribeCustomerCommand
+use CachetHQ\Cachet\Models\Subscriber;
+
+class VerifySubscriberCommand
{
/**
- * The customer email.
+ * The subscriber to verify.
*
* @var string
*/
- public $email;
+ public $subscriber;
/**
- * Create a new subscribe customer command instance.
+ * Create a verify subscriber command instance.
*
- * @param string $email
+ * @param string $subscriber
*
* @return void
*/
- public function __construct($email)
+ public function __construct(Subscriber $subscriber)
{
- $this->email = $email;
+ $this->subscriber = $subscriber;
}
}
diff --git a/app/Events/SubscriberHasSubscribedEvent.php b/app/Events/SubscriberHasSubscribedEvent.php
new file mode 100644
index 00000000..db6fd5a0
--- /dev/null
+++ b/app/Events/SubscriberHasSubscribedEvent.php
@@ -0,0 +1,32 @@
+subscriber = $subscriber;
+ }
+}
diff --git a/app/Events/SubscriberHasUnsubscribedEvent.php b/app/Events/SubscriberHasUnsubscribedEvent.php
new file mode 100644
index 00000000..8c20a98d
--- /dev/null
+++ b/app/Events/SubscriberHasUnsubscribedEvent.php
@@ -0,0 +1,32 @@
+subscriber = $subscriber;
+ }
+}
diff --git a/app/Events/CustomerHasSubscribedEvent.php b/app/Events/SubscriberHasVerifiedEvent.php
similarity index 80%
rename from app/Events/CustomerHasSubscribedEvent.php
rename to app/Events/SubscriberHasVerifiedEvent.php
index 809f579b..e095ddb9 100644
--- a/app/Events/CustomerHasSubscribedEvent.php
+++ b/app/Events/SubscriberHasVerifiedEvent.php
@@ -13,17 +13,17 @@ namespace CachetHQ\Cachet\Events;
use CachetHQ\Cachet\Models\Subscriber;
-class CustomerHasSubscribedEvent
+class SubscriberHasVerifiedEvent
{
/**
- * The customer who has subscribed.
+ * The subscriber who has verified.
*
* @var \CachetHQ\Cachet\Models\Subscriber
*/
public $subscriber;
/**
- * Create a new customer has subscribed event instance.
+ * Create a new subscriber has subscribed event instance.
*
* @return void
*/
diff --git a/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php b/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php
new file mode 100644
index 00000000..07ae6fae
--- /dev/null
+++ b/app/Handlers/Commands/Subscriber/SubscribeSubscriberCommandHandler.php
@@ -0,0 +1,43 @@
+ $command->email]);
+
+ if ($command->verified) {
+ $this->dispatch(new VerifySubscriberCommand($subscriber));
+ } else {
+ event(new SubscriberHasSubscribedEvent($subscriber));
+ }
+
+ return $subscriber;
+ }
+}
diff --git a/app/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php b/app/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php
new file mode 100644
index 00000000..7552b820
--- /dev/null
+++ b/app/Handlers/Commands/Subscriber/UnsubscribeSubscriberCommandHandler.php
@@ -0,0 +1,35 @@
+subscriber;
+
+ event(new SubscriberHasUnsubscribedEvent($subscriber));
+
+ $subscriber->delete();
+ }
+}
diff --git a/app/Handlers/Commands/Subscriber/VerifySubscriberCommandHandler.php b/app/Handlers/Commands/Subscriber/VerifySubscriberCommandHandler.php
new file mode 100644
index 00000000..25f94e42
--- /dev/null
+++ b/app/Handlers/Commands/Subscriber/VerifySubscriberCommandHandler.php
@@ -0,0 +1,37 @@
+subscriber;
+
+ $subscriber->verified_at = Carbon::now();
+ $subscriber->save();
+
+ event(new SubscriberHasVerifiedEvent($subscriber));
+ }
+}
diff --git a/app/Handlers/Commands/User/GenerateApiTokenCommandHandler.php b/app/Handlers/Commands/User/GenerateApiTokenCommandHandler.php
index fc169218..1751dc19 100644
--- a/app/Handlers/Commands/User/GenerateApiTokenCommandHandler.php
+++ b/app/Handlers/Commands/User/GenerateApiTokenCommandHandler.php
@@ -11,7 +11,7 @@
namespace CachetHQ\Cachet\Handlers\Commands\User;
-use CachetHQ\Cachet\Commands\GenerateApiTokenCommand;
+use CachetHQ\Cachet\Commands\User\GenerateApiTokenCommand;
use CachetHQ\Cachet\Models\User;
class GenerateApiTokenCommandHandler
@@ -19,7 +19,7 @@ class GenerateApiTokenCommandHandler
/**
* Handle the generate api key command.
*
- * @param \CachetHQ\Cachet\Commands\GenerateApiTokenCommand $command
+ * @param \CachetHQ\Cachet\Commands\User\GenerateApiTokenCommand $command
*
* @return void
*/
diff --git a/app/Handlers/Events/SendSubscriberVerificationEmailHandler.php b/app/Handlers/Events/SendSubscriberVerificationEmailHandler.php
index 656344a9..1de26a31 100644
--- a/app/Handlers/Events/SendSubscriberVerificationEmailHandler.php
+++ b/app/Handlers/Events/SendSubscriberVerificationEmailHandler.php
@@ -11,7 +11,7 @@
namespace CachetHQ\Cachet\Handlers\Events;
-use CachetHQ\Cachet\Events\CustomerHasSubscribedEvent;
+use CachetHQ\Cachet\Events\SubscriberHasSubscribedEvent;
use Illuminate\Contracts\Mail\MailQueue;
use Illuminate\Mail\Message;
@@ -43,7 +43,7 @@ class SendSubscriberVerificationEmailHandler
*
* @return void
*/
- public function handle(CustomerHasSubscribedEvent $event)
+ public function handle(SubscriberHasSubscribedEvent $event)
{
$mail = [
'email' => $event->subscriber->email,
diff --git a/app/Http/Controllers/Api/SubscriberController.php b/app/Http/Controllers/Api/SubscriberController.php
index 6efa8163..eca4e985 100644
--- a/app/Http/Controllers/Api/SubscriberController.php
+++ b/app/Http/Controllers/Api/SubscriberController.php
@@ -11,15 +11,19 @@
namespace CachetHQ\Cachet\Http\Controllers\Api;
-use CachetHQ\Cachet\Events\CustomerHasSubscribedEvent;
+use CachetHQ\Cachet\Commands\Subscriber\SubscribeSubscriberCommand;
+use CachetHQ\Cachet\Commands\Subscriber\UnsubscribeSubscriberCommand;
use CachetHQ\Cachet\Models\Subscriber;
use Exception;
use GrahamCampbell\Binput\Facades\Binput;
+use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class SubscriberController extends AbstractApiController
{
+ use DispatchesJobs;
+
/**
* Get all subscribers.
*
@@ -41,19 +45,12 @@ class SubscriberController extends AbstractApiController
*/
public function postSubscribers()
{
- $subscriberData = Binput::except('verify');
-
try {
- $subscriber = Subscriber::create($subscriberData);
+ $subscriber = $this->dispatch(new SubscribeSubscriberCommand(Binput::get('email'), Binput::get('verified', false)));
} catch (Exception $e) {
throw new BadRequestHttpException();
}
- // If we're auto-verifying the subscriber, don't bother with this event.
- if (!(Binput::get('verify'))) {
- event(new CustomerHasSubscribedEvent($subscriber));
- }
-
return $this->item($subscriber);
}
@@ -66,7 +63,7 @@ class SubscriberController extends AbstractApiController
*/
public function deleteSubscriber(Subscriber $subscriber)
{
- $subscriber->delete();
+ $this->dispatch(new UnsubscribeSubscriberCommand($subscriber));
return $this->noContent();
}
diff --git a/app/Http/Controllers/Dashboard/SubscriberController.php b/app/Http/Controllers/Dashboard/SubscriberController.php
index ad3e5cd0..50a8bb15 100644
--- a/app/Http/Controllers/Dashboard/SubscriberController.php
+++ b/app/Http/Controllers/Dashboard/SubscriberController.php
@@ -12,15 +12,19 @@
namespace CachetHQ\Cachet\Http\Controllers\Dashboard;
use AltThree\Validator\ValidationException;
-use CachetHQ\Cachet\Events\CustomerHasSubscribedEvent;
+use CachetHQ\Cachet\Commands\Subscriber\SubscribeSubscriberCommand;
+use CachetHQ\Cachet\Commands\Subscriber\UnsubscribeSubscriberCommand;
use CachetHQ\Cachet\Models\Subscriber;
use GrahamCampbell\Binput\Facades\Binput;
+use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\View;
class SubscriberController extends Controller
{
+ use DispatchesJobs;
+
/**
* Shows the subscribers view.
*
@@ -56,7 +60,7 @@ class SubscriberController extends Controller
$email = Binput::get('email');
try {
- $subscriber = Subscriber::create(['email' => $email]);
+ $this->dispatch(new SubscribeSubscriberCommand($email));
} catch (ValidationException $e) {
return Redirect::route('dashboard.subscribers.add')
->withInput(Binput::all())
@@ -81,7 +85,7 @@ class SubscriberController extends Controller
*/
public function deleteSubscriberAction(Subscriber $subscriber)
{
- $subscriber->delete();
+ $this->dispatch(new UnsubscribeSubscriberCommand($subscriber));
return Redirect::route('dashboard.subscribers.index');
}
diff --git a/app/Http/Controllers/SubscribeController.php b/app/Http/Controllers/SubscribeController.php
index 36e9dc29..ab29ef48 100644
--- a/app/Http/Controllers/SubscribeController.php
+++ b/app/Http/Controllers/SubscribeController.php
@@ -12,19 +12,24 @@
namespace CachetHQ\Cachet\Http\Controllers;
use AltThree\Validator\ValidationException;
-use CachetHQ\Cachet\Events\CustomerHasSubscribedEvent;
+use CachetHQ\Cachet\Commands\Subscriber\SubscribeSubscriberCommand;
+use CachetHQ\Cachet\Commands\Subscriber\UnsubscribeSubscriberCommand;
+use CachetHQ\Cachet\Commands\Subscriber\VerifySubscriberCommand;
use CachetHQ\Cachet\Facades\Setting;
use CachetHQ\Cachet\Models\Subscriber;
-use Carbon\Carbon;
use GrahamCampbell\Binput\Facades\Binput;
use GrahamCampbell\Markdown\Facades\Markdown;
+use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\View;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class SubscribeController extends Controller
{
+ use DispatchesJobs;
+
/**
* Show the subscribe by email page.
*
@@ -45,7 +50,7 @@ class SubscribeController extends Controller
public function postSubscribe()
{
try {
- $subscriber = Subscriber::create(['email' => Binput::get('email')]);
+ $this->dispatch(new SubscribeSubscriberCommand(Binput::get('email')));
} catch (ValidationException $e) {
return Redirect::route('subscribe.subscribe')
->withInput(Binput::all())
@@ -53,8 +58,6 @@ class SubscribeController extends Controller
->withErrors($e->getMessageBag());
}
- event(new CustomerHasSubscribedEvent($subscriber));
-
return Redirect::route('status-page')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.subscribed')));
}
@@ -75,11 +78,10 @@ class SubscribeController extends Controller
$subscriber = Subscriber::where('verify_code', '=', $code)->first();
if (!$subscriber || $subscriber->verified()) {
- return Redirect::route('status-page');
+ throw new BadRequestHttpException();
}
- $subscriber->verified_at = Carbon::now();
- $subscriber->save();
+ $this->dispatch(new VerifySubscriberCommand($subscriber));
return Redirect::route('status-page')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.verified')));
@@ -101,10 +103,10 @@ class SubscribeController extends Controller
$subscriber = Subscriber::where('verify_code', '=', $code)->first();
if (!$subscriber || !$subscriber->verified()) {
- return Redirect::route('status-page');
+ throw new BadRequestHttpException();
}
- $subscriber->delete();
+ $this->dispatch(new UnsubscribeSubscriberCommand($subscriber));
return Redirect::route('status-page')
->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('cachet.subscriber.email.unsuscribed')));
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 8a5d804e..7a016273 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -25,7 +25,7 @@ class AppServiceProvider extends ServiceProvider
public function boot(Dispatcher $dispatcher)
{
$dispatcher->mapUsing(function ($command) {
- return Dispatcher::simpleMapping($command, 'CachetHQ\Cachet\Commands', 'CachetHQ\Cachet\Handlers\Commands');
+ return Dispatcher::simpleMapping($command, 'CachetHQ\Cachet', 'CachetHQ\Cachet\Handlers');
});
Str::macro('canonicalize', function ($url) {
diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index 05914609..1f0e5cc6 100644
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -21,7 +21,7 @@ class EventServiceProvider extends ServiceProvider
* @var array
*/
protected $listen = [
- 'CachetHQ\Cachet\Events\CustomerHasSubscribedEvent' => [
+ 'CachetHQ\Cachet\Events\SubscriberHasSubscribedEvent' => [
'CachetHQ\Cachet\Handlers\Events\SendSubscriberVerificationEmailHandler',
],
'CachetHQ\Cachet\Events\IncidentHasReportedEvent' => [