X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FFave.php;h=e8fdbffc719d47ca934cecda0538145bb3e5ac7d;hb=6d5b6d98b5f68d784fee736518eaaae7a26a51f6;hp=7ca9ade7f04b846c53982c8507fce5293436d793;hpb=697222575df146849ff303c6d5e83733cd5236af;p=quix0rs-gnu-social.git diff --git a/classes/Fave.php b/classes/Fave.php index 7ca9ade7f0..e8fdbffc71 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -44,6 +44,7 @@ class Fave extends Memcached_DataObject common_log_db_error($fave, 'INSERT', __FILE__); return false; } + self::blow('fave:by_notice:%d', $fave->notice_id); Event::handle('EndFavorNotice', array($profile, $notice)); } @@ -61,6 +62,7 @@ class Fave extends Memcached_DataObject if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) { $result = parent::delete(); + self::blow('fave:by_notice:%d', $this->notice_id); if ($result) { Event::handle('EndDisfavorNotice', array($profile, $notice)); @@ -75,58 +77,110 @@ class Fave extends Memcached_DataObject return Memcached_DataObject::pkeyGet('Fave', $kv); } - function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false) + function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false, $since_id=0, $max_id=0) { - $ids = Notice::stream(array('Fave', '_streamDirect'), - array($user_id, $own), - ($own) ? 'fave:ids_by_user_own:'.$user_id : - 'fave:ids_by_user:'.$user_id, - $offset, $limit); - return $ids; + $stream = new FaveNoticeStream($user_id, $own); + + return $stream->getNotices($offset, $limit, $since_id, $max_id); } - function _streamDirect($user_id, $own, $offset, $limit, $since_id, $max_id) + function idStream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $own=false, $since_id=0, $max_id=0) { - $fav = new Fave(); - $qry = null; - - if ($own) { - $qry = 'SELECT fave.* FROM fave '; - $qry .= 'WHERE fave.user_id = ' . $user_id . ' '; - } else { - $qry = 'SELECT fave.* FROM fave '; - $qry .= 'INNER JOIN notice ON fave.notice_id = notice.id '; - $qry .= 'WHERE fave.user_id = ' . $user_id . ' '; - $qry .= 'AND notice.is_local != ' . Notice::GATEWAY . ' '; - } + $stream = new FaveNoticeStream($user_id, $own); - if ($since_id != 0) { - $qry .= 'AND notice_id > ' . $since_id . ' '; - } + return $stream->getNoticeIds($offset, $limit, $since_id, $max_id); + } - if ($max_id != 0) { - $qry .= 'AND notice_id <= ' . $max_id . ' '; - } + function asActivity() + { + $notice = Notice::staticGet('id', $this->notice_id); + $profile = Profile::staticGet('id', $this->user_id); - // NOTE: we sort by fave time, not by notice time! + $act = new Activity(); - $qry .= 'ORDER BY modified DESC '; + $act->verb = ActivityVerb::FAVORITE; - if (!is_null($offset)) { - $qry .= "LIMIT $limit OFFSET $offset"; - } + // FIXME: rationalize this with URL below - $fav->query($qry); + $act->id = TagURI::mint('favor:%d:%d:%s', + $profile->id, + $notice->id, + common_date_iso8601($this->modified)); - $ids = array(); + $act->time = strtotime($this->modified); + // TRANS: Activity title when marking a notice as favorite. + $act->title = _("Favor"); + // TRANS: Ntofication 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. + $act->content = sprintf(_('%1$s marked notice %2$s as a favorite.'), + $profile->getBestName(), + $notice->uri); - while ($fav->fetch()) { - $ids[] = $fav->notice_id; - } + $act->actor = ActivityObject::fromProfile($profile); + $act->objects[] = ActivityObject::fromNotice($notice); + + $url = common_local_url('AtomPubShowFavorite', + array('profile' => $this->user_id, + 'notice' => $this->notice_id)); + + $act->selfLink = $url; + $act->editLink = $url; + + return $act; + } + + /** + * 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->free(); - unset($fav); + $fav->user_id = $profileId; + + $fav->orderBy('modified DESC'); + + $fav->limit($offset, $limit); + + $fav->find(); + + return $fav; + } - return $ids; + /** + * Grab a list of profile who have favored this notice. + * + * @return ArrayWrapper masquerading as a Fave + */ + static function byNotice($noticeId) + { + $c = self::memcache(); + $key = Cache::key('fave:by_notice:' . $noticeId); + + $wrapper = $c->get($key); + if (!$wrapper) { + // @fixme caching & scalability! + $fave = new Fave(); + $fave->notice_id = $noticeId; + $fave->find(); + + $list = array(); + while ($fave->fetch()) { + $list[] = clone($fave); + } + $wrapper = new ArrayWrapper($list); + $c->set($key, $wrapper); + } + return $wrapper; } }