Added per-component subscriptions. Closes #734

This commit is contained in:
James Brooks
2016-01-10 15:54:54 +00:00
committed by James Brooks
parent e5c137f82b
commit ac3888f7c8
29 changed files with 620 additions and 17 deletions
@@ -14,9 +14,16 @@ namespace CachetHQ\Cachet\Bus\Handlers\Commands\Subscriber;
use CachetHQ\Cachet\Bus\Commands\Subscriber\SubscribeSubscriberCommand;
use CachetHQ\Cachet\Bus\Commands\Subscriber\VerifySubscriberCommand;
use CachetHQ\Cachet\Bus\Events\Subscriber\SubscriberHasSubscribedEvent;
use CachetHQ\Cachet\Bus\Events\Subscriber\SubscriberHasUpdatedSubscriptionsEvent;
use CachetHQ\Cachet\Bus\Exceptions\Subscriber\AlreadySubscribedException;
use CachetHQ\Cachet\Models\Subscriber;
use CachetHQ\Cachet\Models\Subscription;
/**
* This is the subscribe subscriber command handler.
*
* @author James Brooks <james@alt-three.com>
*/
class SubscribeSubscriberCommandHandler
{
/**
@@ -30,16 +37,29 @@ class SubscribeSubscriberCommandHandler
*/
public function handle(SubscribeSubscriberCommand $command)
{
if (Subscriber::where('email', $command->email)->first()) {
if (Subscriber::where('email', $command->email)->first() && $command->subscriptions === null) {
throw new AlreadySubscribedException("Cannot subscribe {$command->email} because they're already subscribed.");
}
$subscriber = Subscriber::create(['email' => $command->email]);
$subscriber = Subscriber::firstOrCreate(['email' => $command->email]);
if ($command->verified) {
dispatch(new VerifySubscriberCommand($subscriber));
if ($subscriptions = $command->subscriptions) {
foreach ($subscriptions as $subscription => $subscriptionValue) {
Subscription::firstOrCreate([
'subscriber_id' => $subscriber->id,
$subscription => $subscriptionValue,
]);
}
}
if ($subscriber->is_verified === false) {
if ($command->verified) {
dispatch(new VerifySubscriberCommand($subscriber));
} else {
event(new SubscriberHasSubscribedEvent($subscriber));
}
} else {
event(new SubscriberHasSubscribedEvent($subscriber));
event(new SubscriberHasUpdatedSubscriptionsEvent($subscriber));
}
return $subscriber;