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' => [