| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2009-08-25 18:14:12 -04:00
										 |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * Copyright (C) 2008, 2009, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Table Definition for subscription | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-09-26 12:18:24 -04:00
										 |  |  | require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | class Subscription extends Memcached_DataObject | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |     const CACHE_WINDOW = 201; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  |     ###START_AUTOCODE
 | 
					
						
							|  |  |  |     /* the code below is auto generated do not remove the above tag */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $__table = 'subscription';                    // table name
 | 
					
						
							|  |  |  |     public $subscriber;                      // int(4)  primary_key not_null
 | 
					
						
							|  |  |  |     public $subscribed;                      // int(4)  primary_key not_null
 | 
					
						
							| 
									
										
										
										
											2008-12-08 22:36:37 -05:00
										 |  |  |     public $jabber;                          // tinyint(1)   default_1
 | 
					
						
							|  |  |  |     public $sms;                             // tinyint(1)   default_1
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |     public $token;                           // varchar(255)
 | 
					
						
							|  |  |  |     public $secret;                          // varchar(255)
 | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  |     public $created;                         // datetime()   not_null
 | 
					
						
							|  |  |  |     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Static get */ | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  |     function staticGet($k,$v=null) | 
					
						
							|  |  |  |     { return Memcached_DataObject::staticGet('Subscription',$k,$v); } | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* the code above is auto generated do not remove the tag below */ | 
					
						
							|  |  |  |     ###END_AUTOCODE
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 14:28:40 -08:00
										 |  |  |     function pkeyGet($kv) | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         return Memcached_DataObject::pkeyGet('Subscription', $kv); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Make a new subscription | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile $subscriber party to receive new notices | 
					
						
							|  |  |  |      * @param Profile $other      party sending notices; publisher | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Subscription new subscription | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function start($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-18 17:08:19 -07:00
										 |  |  |         // @fixme should we enforce this as profiles in callers instead?
 | 
					
						
							|  |  |  |         if ($subscriber instanceof User) { | 
					
						
							|  |  |  |             $subscriber = $subscriber->getProfile(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($other instanceof User) { | 
					
						
							|  |  |  |             $other = $other->getProfile(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |         if (!$subscriber->hasRight(Right::SUBSCRIBE)) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |             // TRANS: Exception thrown when trying to subscribe while being banned from subscribing.
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             throw new Exception(_('You have been banned from subscribing.')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (self::exists($subscriber, $other)) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |             // TRANS: Exception thrown when trying to subscribe while already subscribed.
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             throw new Exception(_('Already subscribed!')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($other->hasBlocked($subscriber)) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |             // TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user.
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             throw new Exception(_('User has blocked you.')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartSubscribe', array($subscriber, $other))) { | 
					
						
							| 
									
										
										
										
											2010-03-18 14:26:32 -07:00
										 |  |  |             $sub = self::saveNew($subscriber->id, $other->id); | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             $sub->notify(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self::blow('user:notices_with_friends:%d', $subscriber->id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |             self::blow('subscription:by-subscriber:'.$subscriber->id); | 
					
						
							|  |  |  |             self::blow('subscription:by-subscribed:'.$other->id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-22 14:22:18 -04:00
										 |  |  |             $subscriber->blowSubscriptionCount(); | 
					
						
							|  |  |  |             $other->blowSubscriberCount(); | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $otherUser = User::staticGet('id', $other->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($otherUser) && | 
					
						
							|  |  |  |                 $otherUser->autosubscribe && | 
					
						
							|  |  |  |                 !self::exists($other, $subscriber) && | 
					
						
							|  |  |  |                 !$subscriber->hasBlocked($other)) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-18 14:26:32 -07:00
										 |  |  |                 try { | 
					
						
							|  |  |  |                     self::start($other, $subscriber); | 
					
						
							|  |  |  |                 } catch (Exception $e) { | 
					
						
							|  |  |  |                     common_log(LOG_ERR, "Exception during autosubscribe of {$other->nickname} to profile {$subscriber->id}: {$e->getMessage()}"); | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndSubscribe', array($subscriber, $other)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-18 14:26:32 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Low-level subscription save. | 
					
						
							|  |  |  |      * Outside callers should use Subscription::start() | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function saveNew($subscriber_id, $other_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $sub = new Subscription(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->subscriber = $subscriber_id; | 
					
						
							|  |  |  |         $sub->subscribed = $other_id; | 
					
						
							|  |  |  |         $sub->jabber     = 1; | 
					
						
							|  |  |  |         $sub->sms        = 1; | 
					
						
							|  |  |  |         $sub->created    = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $result = $sub->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$result) { | 
					
						
							|  |  |  |             common_log_db_error($sub, 'INSERT', __FILE__); | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |             // TRANS: Exception thrown when a subscription could not be stored on the server.
 | 
					
						
							| 
									
										
										
										
											2010-03-18 14:26:32 -07:00
										 |  |  |             throw new Exception(_('Could not save subscription.')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $sub; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |     function notify() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         # XXX: add other notifications (Jabber, SMS) here
 | 
					
						
							|  |  |  |         # XXX: queue this and handle it offline
 | 
					
						
							|  |  |  |         # XXX: Whatever happens, do it in Twitter-like API, too
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->notifyEmail(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function notifyEmail() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $subscribedUser = User::staticGet('id', $this->subscribed); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($subscribedUser)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $subscriber = Profile::staticGet('id', $this->subscriber); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             mail_subscribe_notify_profile($subscribedUser, $subscriber); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Cancel a subscription | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function cancel($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!self::exists($subscriber, $other)) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |             // TRANS: Exception thrown when trying to unsibscribe without a subscription.
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             throw new Exception(_('Not subscribed!')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Don't allow deleting self subs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($subscriber->id == $other->id) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |             // TRANS: Exception thrown when trying to unsubscribe a user from themselves.
 | 
					
						
							|  |  |  |             throw new Exception(_('Could not delete self-subscription.')); | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartUnsubscribe', array($subscriber, $other))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, | 
					
						
							|  |  |  |                                                'subscribed' => $other->id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // note we checked for existence above
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             assert(!empty($sub)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |             // @todo: move this block to EndSubscribe handler for
 | 
					
						
							|  |  |  |             // OMB plugin when it exists.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($sub->token)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $token = new Token(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $token->tok    = $sub->token; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if ($token->find(true)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $result = $token->delete(); | 
					
						
							| 
									
										
										
										
											2010-03-01 14:30:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |                     if (!$result) { | 
					
						
							| 
									
										
										
										
											2010-03-01 14:30:28 -05:00
										 |  |  |                         common_log_db_error($token, 'DELETE', __FILE__); | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |                         // TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
 | 
					
						
							|  |  |  |                         throw new Exception(_('Could not delete subscription OMB token.')); | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2010-03-01 14:30:28 -05:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                     common_log(LOG_ERR, "Couldn't find credentials with token {$token->tok}"); | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             $result = $sub->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$result) { | 
					
						
							|  |  |  |                 common_log_db_error($sub, 'DELETE', __FILE__); | 
					
						
							| 
									
										
										
										
											2010-07-29 13:36:08 +02:00
										 |  |  |                 // TRANS: Exception thrown when a subscription could not be deleted on the server.
 | 
					
						
							|  |  |  |                 throw new Exception(_('Could not delete subscription.')); | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self::blow('user:notices_with_friends:%d', $subscriber->id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |             self::blow('subscription:by-subscriber:'.$subscriber->id); | 
					
						
							|  |  |  |             self::blow('subscription:by-subscribed:'.$other->id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-22 14:22:18 -04:00
										 |  |  |             $subscriber->blowSubscriptionCount(); | 
					
						
							|  |  |  |             $other->blowSubscriberCount(); | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndUnsubscribe', array($subscriber, $other)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function exists($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, | 
					
						
							|  |  |  |                                            'subscribed' => $other->id)); | 
					
						
							|  |  |  |         return (empty($sub)) ? false : true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function asActivity() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $subscriber = Profile::staticGet('id', $this->subscriber); | 
					
						
							|  |  |  |         $subscribed = Profile::staticGet('id', $this->subscribed); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $act = new Activity(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $act->verb = ActivityVerb::FOLLOW; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-09 13:11:02 -05:00
										 |  |  |         // XXX: rationalize this with the URL
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |         $act->id   = TagURI::mint('follow:%d:%d:%s', | 
					
						
							|  |  |  |                                   $subscriber->id, | 
					
						
							|  |  |  |                                   $subscribed->id, | 
					
						
							|  |  |  |                                   common_date_iso8601($this->created)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $act->time    = strtotime($this->created); | 
					
						
							| 
									
										
										
										
											2010-09-28 23:42:18 +02:00
										 |  |  |         // TRANS: Activity tile when subscribing to another person.
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |         $act->title   = _("Follow"); | 
					
						
							| 
									
										
										
										
											2010-09-28 23:42:18 +02:00
										 |  |  |         // TRANS: Notification given when one person starts following another.
 | 
					
						
							|  |  |  |         // TRANS: %1$s is the subscriber, %2$s is the subscribed.
 | 
					
						
							| 
									
										
										
										
											2010-10-04 14:24:04 -07:00
										 |  |  |         $act->content = sprintf(_('%1$s is now following %2$s.'), | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |                                $subscriber->getBestName(), | 
					
						
							|  |  |  |                                $subscribed->getBestName()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:22:42 -04:00
										 |  |  |         $act->actor     = ActivityObject::fromProfile($subscriber); | 
					
						
							|  |  |  |         $act->objects[] = ActivityObject::fromProfile($subscribed); | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-09 13:11:02 -05:00
										 |  |  |         $url = common_local_url('AtomPubShowSubscription', | 
					
						
							|  |  |  |                                 array('subscriber' => $subscriber->id, | 
					
						
							|  |  |  |                                       'subscribed' => $subscribed->id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $act->selfLink = $url; | 
					
						
							|  |  |  |         $act->editLink = $url; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |         return $act; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-12-11 10:24:46 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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 $subscriberId Profile ID of the subscriber | 
					
						
							|  |  |  |      * @param integer $offset       Offset from latest | 
					
						
							|  |  |  |      * @param integer $limit        Maximum number to fetch | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Subscription stream of subscriptions; use fetch() to iterate | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function bySubscriber($subscriberId, | 
					
						
							|  |  |  |                                  $offset = 0, | 
					
						
							|  |  |  |                                  $limit = PROFILES_PER_PAGE) | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         if ($offset + $limit > self::CACHE_WINDOW) { | 
					
						
							|  |  |  |             return new ArrayWrapper(self::realBySubscriber($subscriberId, | 
					
						
							|  |  |  |                                                            $offset, | 
					
						
							|  |  |  |                                                            $limit)); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $key = 'subscription:by-subscriber:'.$subscriberId; | 
					
						
							|  |  |  |             $window = self::cacheGet($key); | 
					
						
							|  |  |  |             if ($window === false) { | 
					
						
							|  |  |  |                 $window = self::realBySubscriber($subscriberId, | 
					
						
							|  |  |  |                                                  0, | 
					
						
							|  |  |  |                                                  self::CACHE_WINDOW); | 
					
						
							|  |  |  |                 self::cacheSet($key, $window); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return new ArrayWrapper(array_slice($window, | 
					
						
							|  |  |  |                                                 $offset, | 
					
						
							|  |  |  |                                                 $limit)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static function realBySubscriber($subscriberId, | 
					
						
							|  |  |  |                                              $offset, | 
					
						
							|  |  |  |                                              $limit) | 
					
						
							| 
									
										
										
										
											2010-12-11 10:24:46 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $sub = new Subscription(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->subscriber = $subscriberId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->whereAdd('subscribed != ' . $subscriberId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->orderBy('created DESC'); | 
					
						
							|  |  |  |         $sub->limit($offset, $limit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |         $subs = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while ($sub->fetch()) { | 
					
						
							|  |  |  |             $subs[] = clone($sub); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $subs; | 
					
						
							| 
									
										
										
										
											2010-12-11 10:24:46 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Stream of subscriptions with the same subscribed profile | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Useful for showing pages that list subscribers in reverse | 
					
						
							|  |  |  |      * chronological order. Has offset & limit to make paging | 
					
						
							|  |  |  |      * easy. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param integer $subscribedId Profile ID of the subscribed | 
					
						
							|  |  |  |      * @param integer $offset       Offset from latest | 
					
						
							|  |  |  |      * @param integer $limit        Maximum number to fetch | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Subscription stream of subscriptions; use fetch() to iterate | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function bySubscribed($subscribedId, | 
					
						
							|  |  |  |                                  $offset = 0, | 
					
						
							|  |  |  |                                  $limit = PROFILES_PER_PAGE) | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         if ($offset + $limit > self::CACHE_WINDOW) { | 
					
						
							|  |  |  |             return new ArrayWrapper(self::realBySubscribed($subscribedId, | 
					
						
							|  |  |  |                                                            $offset, | 
					
						
							|  |  |  |                                                            $limit)); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $key = 'subscription:by-subscribed:'.$subscribedId; | 
					
						
							|  |  |  |             $window = self::cacheGet($key); | 
					
						
							|  |  |  |             if ($window === false) { | 
					
						
							|  |  |  |                 $window = self::realBySubscribed($subscribedId, | 
					
						
							|  |  |  |                                                  0, | 
					
						
							|  |  |  |                                                  self::CACHE_WINDOW); | 
					
						
							|  |  |  |                 self::cacheSet($key, $window); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return new ArrayWrapper(array_slice($window, | 
					
						
							|  |  |  |                                                 $offset, | 
					
						
							|  |  |  |                                                 $limit)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static function realBySubscribed($subscribedId, | 
					
						
							|  |  |  |                                              $offset, | 
					
						
							|  |  |  |                                              $limit) | 
					
						
							| 
									
										
										
										
											2010-12-11 10:24:46 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $sub = new Subscription(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->subscribed = $subscribedId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->whereAdd('subscriber != ' . $subscribedId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->orderBy('created DESC'); | 
					
						
							|  |  |  |         $sub->limit($offset, $limit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-11 11:00:04 -05:00
										 |  |  |         $subs = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while ($sub->fetch()) { | 
					
						
							|  |  |  |             $subs[] = clone($sub); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $subs; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Flush cached subscriptions when subscription is updated | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Because we cache subscriptions, it's useful to flush them | 
					
						
							|  |  |  |      * here. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param mixed $orig Original version of object | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean success flag. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function update($orig=null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $result = parent::update($orig); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self::blow('subscription:by-subscriber:'.$this->subscriber); | 
					
						
							|  |  |  |         self::blow('subscription:by-subscribed:'.$this->subscribed); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							| 
									
										
										
										
											2010-12-11 10:24:46 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | } |