+ public function getSubscriber()
+ {
+ return Profile::getByID($this->subscriber);
+ }
+
+ public function getSubscribed()
+ {
+ return Profile::getByID($this->subscribed);
+ }
+
+ function asActivity()
+ {
+ $subscriber = $this->getSubscriber();
+ $subscribed = $this->getSubscribed();
+
+ $act = new Activity();
+
+ $act->verb = ActivityVerb::FOLLOW;
+
+ // XXX: rationalize this with the URL
+
+ $act->id = $this->getUri();
+
+ $act->time = strtotime($this->created);
+ // TRANS: Activity title when subscribing to another person.
+ $act->title = _m('TITLE','Follow');
+ // TRANS: Notification given when one person starts following another.
+ // TRANS: %1$s is the subscriber, %2$s is the subscribed.
+ $act->content = sprintf(_('%1$s is now following %2$s.'),
+ $subscriber->getBestName(),
+ $subscribed->getBestName());
+
+ $act->actor = $subscriber->asActivityObject();
+ $act->objects[] = $subscribed->asActivityObject();
+
+ $url = common_local_url('AtomPubShowSubscription',
+ array('subscriber' => $subscriber->id,
+ 'subscribed' => $subscribed->id));
+
+ $act->selfLink = $url;
+ $act->editLink = $url;
+
+ return $act;
+ }
+
+ /**
+ * Stream of subscriptions with the same subscriber
+ *
+ * Useful for showing pages that list subscriptions in reverse
+ * chronological order. Has offset & limit to make paging
+ * easy.
+ *
+ * @param integer $profile_id ID of the subscriber profile
+ * @param integer $offset Offset from latest
+ * @param integer $limit Maximum number to fetch
+ *
+ * @return Subscription stream of subscriptions; use fetch() to iterate
+ */
+ public static function bySubscriber($profile_id, $offset = 0, $limit = PROFILES_PER_PAGE)
+ {
+ // "by subscriber" means it is the list of subscribed users we want
+ $ids = self::getSubscribedIDs($profile_id, $offset, $limit);
+ return Subscription::listFind('subscribed', $ids);
+ }
+
+ /**
+ * Stream of subscriptions with the same subscriber
+ *
+ * Useful for showing pages that list subscriptions in reverse
+ * chronological order. Has offset & limit to make paging
+ * easy.
+ *
+ * @param integer $profile_id ID of the subscribed profile
+ * @param integer $offset Offset from latest
+ * @param integer $limit Maximum number to fetch
+ *
+ * @return Subscription stream of subscriptions; use fetch() to iterate
+ */
+ public static function bySubscribed($profile_id, $offset = 0, $limit = PROFILES_PER_PAGE)
+ {
+ // "by subscribed" means it is the list of subscribers we want
+ $ids = self::getSubscriberIDs($profile_id, $offset, $limit);
+ return Subscription::listFind('subscriber', $ids);
+ }
+
+
+ // The following are helper functions to the subscription lists,
+ // notably the public ones get used in places such as Profile
+ public static function getSubscribedIDs($profile_id, $offset, $limit) {
+ return self::getSubscriptionIDs('subscribed', $profile_id, $offset, $limit);
+ }
+
+ public static function getSubscriberIDs($profile_id, $offset, $limit) {
+ return self::getSubscriptionIDs('subscriber', $profile_id, $offset, $limit);
+ }
+
+ private static function getSubscriptionIDs($get_type, $profile_id, $offset, $limit)
+ {
+ switch ($get_type) {
+ case 'subscribed':
+ $by_type = 'subscriber';
+ break;
+ case 'subscriber':
+ $by_type = 'subscribed';
+ break;
+ default:
+ throw new Exception('Bad type argument to getSubscriptionIDs');
+ }
+
+ $cacheKey = 'subscription:by-'.$by_type.':'.$profile_id;
+
+ $queryoffset = $offset;
+ $querylimit = $limit;
+
+ if ($offset + $limit <= self::CACHE_WINDOW) {
+ // Oh, it seems it should be cached
+ $ids = self::cacheGet($cacheKey);
+ if (is_array($ids)) {
+ return array_slice($ids, $offset, $limit);