diff --git a/classes/Subscription.php b/classes/Subscription.php index ec9ae51841..6601bcd6fc 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -94,9 +94,12 @@ class Subscription extends Managed_DataObject if (Event::handle('StartSubscribe', array($subscriber, $other))) { $otherUser = User::getKV('id', $other->id); if ($otherUser instanceof User && $otherUser->subscribe_policy == User::SUBSCRIBE_POLICY_MODERATE && !$force) { - // Will throw an AlreadyFulfilledException if this queue item already exists. - $sub = Subscription_queue::saveNew($subscriber, $other); - $sub->notify(); + try { + $sub = Subscription_queue::saveNew($subscriber, $other); + $sub->notify(); + } catch (AlreadyFulfilledException $e) { + $sub = Subscription_queue::getSubQueue($subscriber, $other); + } } else { $sub = self::saveNew($subscriber->id, $other->id); $sub->notify(); @@ -125,7 +128,7 @@ class Subscription extends Managed_DataObject } } - if ($sub instanceof Subscription) { // i.e. not SubscriptionQueue + if ($sub instanceof Subscription) { // i.e. not Subscription_queue Event::handle('EndSubscribe', array($subscriber, $other)); } } @@ -138,7 +141,6 @@ class Subscription extends Managed_DataObject try { $sub = self::start($subscriber, $other, $force); } catch (AlreadyFulfilledException $e) { - // Nothing to see here, move along... return self::getSubscription($subscriber, $other); } return $sub; diff --git a/classes/Subscription_queue.php b/classes/Subscription_queue.php index 02cc72f1f2..878fcf5796 100644 --- a/classes/Subscription_queue.php +++ b/classes/Subscription_queue.php @@ -54,6 +54,18 @@ class Subscription_queue extends Managed_DataObject return ($sub instanceof Subscription_queue); } + static function getSubQueue(Profile $subscriber, Profile $other) + { + // This is essentially a pkeyGet but we have an object to return in NoResultException + $sub = new Subscription_queue(); + $sub->subscriber = $subscriber->id; + $sub->subscribed = $other->id; + if (!$sub->find(true)) { + throw new NoResultException($sub); + } + return $sub; + } + /** * Complete a pending subscription, as we've got approval of some sort. *