| 
									
										
										
										
											2008-08-13 10:26:37 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Table Definition for fave | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-22 17:52:02 -04:00
										 |  |  | class Fave extends Managed_DataObject | 
					
						
							| 
									
										
										
										
											2008-08-13 10:26:37 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     public $__table = 'fave';                            // table name
 | 
					
						
							|  |  |  |     public $notice_id;                       // int(4)  primary_key not_null
 | 
					
						
							|  |  |  |     public $user_id;                         // int(4)  primary_key not_null
 | 
					
						
							| 
									
										
										
										
											2011-08-22 16:36:23 -04:00
										 |  |  |     public $uri;                             // varchar(255)
 | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     public $created;                         // datetime  multiple_key not_null
 | 
					
						
							| 
									
										
										
										
											2008-08-13 10:26:37 -04:00
										 |  |  |     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-22 17:52:02 -04:00
										 |  |  |     public static function schemaDef() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array( | 
					
						
							|  |  |  |             'fields' => array( | 
					
						
							|  |  |  |                 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the favorite'), | 
					
						
							|  |  |  |                 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who likes this notice'), | 
					
						
							| 
									
										
										
										
											2011-08-22 18:13:02 -04:00
										 |  |  |                 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |                 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), | 
					
						
							| 
									
										
										
										
											2011-08-22 17:52:02 -04:00
										 |  |  |                 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             'primary key' => array('notice_id', 'user_id'), | 
					
						
							| 
									
										
										
										
											2011-08-22 18:13:02 -04:00
										 |  |  |             'unique keys' => array( | 
					
						
							|  |  |  |                 'fave_uri_key' => array('uri'), | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2011-08-22 17:52:02 -04:00
										 |  |  |             'foreign keys' => array( | 
					
						
							|  |  |  |                 'fave_notice_id_fkey' => array('notice', array('notice_id' => 'id')), | 
					
						
							|  |  |  |                 'fave_user_id_fkey' => array('profile', array('user_id' => 'id')), // note: formerly referenced notice.id, but we can now record remote users' favorites
 | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             'indexes' => array( | 
					
						
							|  |  |  |                 'fave_notice_id_idx' => array('notice_id'), | 
					
						
							|  |  |  |                 'fave_user_id_idx' => array('user_id', 'modified'), | 
					
						
							|  |  |  |                 'fave_modified_idx' => array('modified'), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-23 11:06:37 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Save a favorite record. | 
					
						
							|  |  |  |      * @fixme post-author notification should be moved here | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile $profile the local or remote user who likes | 
					
						
							|  |  |  |      * @param Notice $notice the notice that is liked | 
					
						
							|  |  |  |      * @return mixed false on failure, or Fave record on success | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static function addNew(Profile $profile, Notice $notice) { | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $fave = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartFavorNotice', array($profile, $notice, &$fave))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $fave = new Fave(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $fave->user_id   = $profile->id; | 
					
						
							|  |  |  |             $fave->notice_id = $notice->id; | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |             $fave->created   = common_sql_now(); | 
					
						
							| 
									
										
										
										
											2011-08-22 16:36:23 -04:00
										 |  |  |             $fave->modified  = common_sql_now(); | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |             $fave->uri       = self::newUri($profile, | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |                                             $notice, | 
					
						
							|  |  |  |                                             $fave->created); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $fave->insert(); | 
					
						
							|  |  |  |             } catch (ServerException $e) { | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  |                 common_log_db_error($fave, 'INSERT', __FILE__); | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2014-07-01 22:13:11 +02:00
										 |  |  |             self::blowCacheForProfileId($fave->user_id); | 
					
						
							|  |  |  |             self::blowCacheForNoticeId($fave->notice_id); | 
					
						
							| 
									
										
										
										
											2011-10-20 10:40:39 -04:00
										 |  |  |             self::blow('popular'); | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndFavorNotice', array($profile, $notice)); | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         return $fave; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-01 12:01:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     // exception throwing takeover!
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function insert() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         if (!parent::insert()) { | 
					
						
							|  |  |  |             throw new ServerException(sprintf(_m('Could not store new object of type %s'), get_called_class())); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         self::blowCacheForProfileId($this->user_id); | 
					
						
							|  |  |  |         self::blowCacheForNoticeId($this->notice_id); | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function delete($useWhere=false) | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $profile = Profile::getKV('id', $this->user_id); | 
					
						
							|  |  |  |         $notice  = Notice::getKV('id', $this->notice_id); | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $result = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 10:20:57 +01:00
										 |  |  |             $result = parent::delete($useWhere); | 
					
						
							| 
									
										
										
										
											2014-07-01 22:13:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self::blowCacheForProfileId($this->user_id); | 
					
						
							|  |  |  |             self::blowCacheForNoticeId($this->notice_id); | 
					
						
							| 
									
										
										
										
											2011-10-20 10:40:39 -04:00
										 |  |  |             self::blow('popular'); | 
					
						
							| 
									
										
										
										
											2010-02-20 12:03:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if ($result) { | 
					
						
							|  |  |  |                 Event::handle('EndDisfavorNotice', array($profile, $notice)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-05 14:46:36 -07:00
										 |  |  |     function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false, $since_id=0, $max_id=0) | 
					
						
							| 
									
										
										
										
											2009-05-01 12:01:28 -07:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-03-24 18:04:19 -04:00
										 |  |  |         $stream = new FaveNoticeStream($user_id, $own); | 
					
						
							| 
									
										
										
										
											2011-03-23 11:29:55 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $stream->getNotices($offset, $limit, $since_id, $max_id); | 
					
						
							| 
									
										
										
										
											2009-05-01 12:01:28 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-23 11:59:01 -04:00
										 |  |  |     function idStream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false, $since_id=0, $max_id=0) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-03-24 18:04:19 -04:00
										 |  |  |         $stream = new FaveNoticeStream($user_id, $own); | 
					
						
							| 
									
										
										
										
											2011-03-23 11:59:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $stream->getNoticeIds($offset, $limit, $since_id, $max_id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |     function asActivity() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         $target = $this->getTarget(); | 
					
						
							|  |  |  |         $actor  = $this->getActor(); | 
					
						
							| 
									
										
										
										
											2013-05-24 09:26:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |         $act = new Activity(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $act->verb = ActivityVerb::FAVORITE; | 
					
						
							| 
									
										
										
										
											2010-12-10 18:50:50 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // FIXME: rationalize this with URL below
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         $act->id   = $this->getUri(); | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         $act->time    = strtotime($this->created); | 
					
						
							| 
									
										
										
										
											2010-09-28 23:21:09 +02:00
										 |  |  |         // TRANS: Activity title when marking a notice as favorite.
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |         $act->title   = _("Favor"); | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         // If the rendered notice content does not exist, generate our own content.
 | 
					
						
							|  |  |  |         // TRANS: Notification given when a user marks a notice as favorite.
 | 
					
						
							| 
									
										
										
										
											2010-09-28 23:21:09 +02:00
										 |  |  |         // TRANS: %1$s is a user nickname or full name, %2$s is a notice URI.
 | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         $act->content = $target->rendered ?: sprintf(_('%1$s marked notice %2$s as a favorite.'), | 
					
						
							|  |  |  |                                             $actor->getBestName(), $target->getUrl()); | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         $act->actor     = $actor->asActivityObject(); | 
					
						
							|  |  |  |         $act->target    = $target->asActivityObject(); | 
					
						
							|  |  |  |         $act->objects   = array(clone($act->target)); | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-10 18:50:50 -05:00
										 |  |  |         $url = common_local_url('AtomPubShowFavorite', | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |                                           array('profile' => $actor->id, | 
					
						
							|  |  |  |                                                 'notice'  => $target->id)); | 
					
						
							| 
									
										
										
										
											2010-12-10 18:50:50 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $act->selfLink = $url; | 
					
						
							|  |  |  |         $act->editLink = $url; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-04 12:07:49 -07:00
										 |  |  |         return $act; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-12-12 12:22:04 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     static function existsForProfile($notice, Profile $scoped) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-06-27 13:58:35 +02:00
										 |  |  |         $fave = self::pkeyGet(array('user_id'=>$scoped->id, 'notice_id'=>$notice->id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return ($fave instanceof Fave); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-12 12:22:04 -05:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Fetch a stream of favorites by profile | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param integer $profileId Profile that faved | 
					
						
							|  |  |  |      * @param integer $offset    Offset from last | 
					
						
							|  |  |  |      * @param integer $limit     Number to get | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed stream of faves, use fetch() to iterate | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @todo Cache results | 
					
						
							|  |  |  |      * @todo integrate with Fave::stream() | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function byProfile($profileId, $offset, $limit) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $fav = new Fave(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fav->user_id = $profileId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fav->orderBy('modified DESC'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fav->limit($offset, $limit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fav->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $fav; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-08-22 16:36:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-28 13:11:03 +02:00
										 |  |  |     static function countByProfile(Profile $profile) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $c = Cache::instance(); | 
					
						
							|  |  |  |         if (!empty($c)) { | 
					
						
							|  |  |  |             $cnt = $c->get(Cache::key('fave:count_by_profile:'.$profile->id)); | 
					
						
							|  |  |  |             if (is_integer($cnt)) { | 
					
						
							|  |  |  |                 return $cnt; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $faves = new Fave(); | 
					
						
							|  |  |  |         $faves->user_id = $profile->id; | 
					
						
							|  |  |  |         $cnt = (int) $faves->count('notice_id'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($c)) { | 
					
						
							|  |  |  |             $c->set(Cache::key('fave:count_by_profile:'.$profile->id), $cnt); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $cnt; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-27 13:58:35 +02:00
										 |  |  |     static protected $_faves = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * All faves of this notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice A notice we wish to get faves for (may still be ArrayWrapper) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array Array of Fave objects | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static public function byNotice($notice) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!isset(self::$_faves[$notice->id])) { | 
					
						
							|  |  |  |             self::fillFaves(array($notice->id)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return self::$_faves[$notice->id]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static public function fillFaves(array $notice_ids) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $faveMap = Fave::listGet('notice_id', $notice_ids); | 
					
						
							|  |  |  |         self::$_faves = array_replace(self::$_faves, $faveMap); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-06-28 13:11:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static public function blowCacheForProfileId($profile_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $cache = Cache::instance(); | 
					
						
							|  |  |  |         if ($cache) { | 
					
						
							|  |  |  |             // Faves don't happen chronologically, so we need to blow
 | 
					
						
							|  |  |  |             // ;last cache, too
 | 
					
						
							|  |  |  |             $cache->delete(Cache::key('fave:ids_by_user:'.$profile_id)); | 
					
						
							|  |  |  |             $cache->delete(Cache::key('fave:ids_by_user:'.$profile_id.';last')); | 
					
						
							|  |  |  |             $cache->delete(Cache::key('fave:ids_by_user_own:'.$profile_id)); | 
					
						
							|  |  |  |             $cache->delete(Cache::key('fave:ids_by_user_own:'.$profile_id.';last')); | 
					
						
							|  |  |  |             $cache->delete(Cache::key('fave:count_by_profile:'.$profile_id)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-07-01 22:13:11 +02:00
										 |  |  |     static public function blowCacheForNoticeId($notice_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $cache = Cache::instance(); | 
					
						
							|  |  |  |         if ($cache) { | 
					
						
							|  |  |  |             $cache->delete(Cache::key('fave:list-ids:notice_id:'.$notice_id)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Remember that we want the _activity_ notice here, not faves applied
 | 
					
						
							|  |  |  |     // to the supplied Notice (as with byNotice)!
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     static public function fromStored(Notice $stored) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $class = get_called_class(); | 
					
						
							|  |  |  |         $object = new $class; | 
					
						
							|  |  |  |         $object->uri = $stored->uri; | 
					
						
							|  |  |  |         if (!$object->find(true)) { | 
					
						
							|  |  |  |             throw new NoResultException($object); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $object; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     static public function getObjectType() | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         return 'activity'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function asActivityObject(Profile $scoped=null) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $actobj = new ActivityObject(); | 
					
						
							|  |  |  |         $actobj->id = $this->getUri(); | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         $actobj->type = ActivityUtils::resolveUri(self::getObjectType()); | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $actobj->actor = $this->getActorObject(); | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         $actobj->target = $this->getTargetObject(); | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $actobj->objects = array(clone($actobj->target)); | 
					
						
							| 
									
										
										
										
											2014-07-05 00:15:22 +02:00
										 |  |  |         $actobj->verb = ActivityVerb::FAVORITE; | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         $actobj->title = ActivityUtils::verbToTitle($actobj->verb); | 
					
						
							| 
									
										
										
										
											2014-07-14 13:25:26 +02:00
										 |  |  |         // If the rendered notice content does not exist, generate our own content.
 | 
					
						
							|  |  |  |         // TRANS: Notification given when a user marks a notice as favorite.
 | 
					
						
							|  |  |  |         // TRANS: %1$s is a user nickname or full name, %2$s is a notice URI.
 | 
					
						
							|  |  |  |         $actobj->content = $target->rendered ?: sprintf(_('%1$s marked notice %2$s as a favorite.'), | 
					
						
							|  |  |  |                                                         $this->getActor()->getBestName(), | 
					
						
							|  |  |  |                                                         $this->getTarget()->getUrl()); | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         return $actobj; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param ActivityObject $actobj The _favored_ notice (which we're "in-reply-to") | 
					
						
							|  |  |  |      * @param Notice         $stored The _activity_ notice, i.e. the favor itself. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     static public function parseActivityObject(ActivityObject $actobj, Notice $stored) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         $local = ActivityUtils::findLocalObject($actobj->getIdentifiers()); | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |         if (!$local instanceof Notice) { | 
					
						
							|  |  |  |             // $local always returns something, but this was not what we expected. Something is wrong.
 | 
					
						
							|  |  |  |             throw new Exception('Something other than a Notice was returned from findLocalObject'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $actor = $stored->getProfile(); | 
					
						
							|  |  |  |         $object = new Fave(); | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |         $object->user_id = $stored->getProfile()->id; | 
					
						
							|  |  |  |         $object->notice_id = $local->id; | 
					
						
							|  |  |  |         $object->uri = $stored->uri; | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $object->created = $stored->created; | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |         $object->modified = $stored->modified; | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         return $object; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     static function saveActivityObject(ActivityObject $actobj, Notice $stored) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $object = self::parseActivityObject($actobj, $stored); | 
					
						
							|  |  |  |         $object->insert();  // exception throwing!
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         Event::handle('EndFavorNotice', array($stored->getProfile(), $object->getTarget())); | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         return $object; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-06 16:37:26 +02:00
										 |  |  |     public function getAttentionArray() { | 
					
						
							|  |  |  |         // not all objects can/should carry attentions, so we don't require extending this
 | 
					
						
							|  |  |  |         // the format should be an array with URIs to mentioned profiles
 | 
					
						
							|  |  |  |         return array(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function getTarget() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         // throws exception on failure
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         $target = new Notice(); | 
					
						
							|  |  |  |         $target->id = $this->notice_id; | 
					
						
							|  |  |  |         if (!$target->find(true)) { | 
					
						
							|  |  |  |             throw new NoResultException($target); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $target; | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function getTargetObject() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         return $this->getTarget()->asActivityObject(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected $_stored = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function getStored() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         if (!isset($this->_stored[$this->uri])) { | 
					
						
							|  |  |  |             $stored = new Notice(); | 
					
						
							|  |  |  |             $stored->uri = $this->uri; | 
					
						
							|  |  |  |             if (!$stored->find(true)) { | 
					
						
							|  |  |  |                 throw new NoResultException($stored); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $this->_stored[$this->uri] = $stored; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->_stored[$this->uri]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function getActor() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         $profile = new Profile(); | 
					
						
							|  |  |  |         $profile->id = $this->user_id; | 
					
						
							|  |  |  |         if (!$profile->find(true)) { | 
					
						
							|  |  |  |             throw new NoResultException($profile); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $profile; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |     public function getActorObject() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |         return $this->getActor()->asActivityObject(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |     public function getUri() | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (!empty($this->uri)) { | 
					
						
							|  |  |  |             return $this->uri; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // We (should've in this case) created it ourselves, so we tag it ourselves
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |         return self::newUri($this->getActor(), $this->getTarget(), $this->created); | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-05 23:39:17 +02:00
										 |  |  |     static function newUri(Profile $actor, Managed_DataObject $target, $created=null) | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (is_null($created)) { | 
					
						
							|  |  |  |             $created = common_sql_now(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return TagURI::mint(strtolower(get_called_class()).':%d:%s:%d:%s', | 
					
						
							|  |  |  |                                         $actor->id, | 
					
						
							| 
									
										
										
										
											2014-07-02 00:22:27 +02:00
										 |  |  |                                         ActivityUtils::resolveUri(self::getObjectType(), true), | 
					
						
							| 
									
										
										
										
											2014-07-01 23:25:58 +02:00
										 |  |  |                                         $target->id, | 
					
						
							|  |  |  |                                         common_date_iso8601($created)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-08-13 10:26:37 -04:00
										 |  |  | } |