From b8b5b87c4c106f59e346ca20e45458192f68a744 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 8 Dec 2010 07:25:55 -0500 Subject: [PATCH] Don't cache user-specific information for Notice atom entries --- classes/Notice.php | 146 ++++++++++++++++++++++++++------------------- lib/activity.php | 14 +---- 2 files changed, 86 insertions(+), 74 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index d6710c3e27..a067cd3741 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1234,7 +1234,7 @@ class Notice extends Memcached_DataObject * @return Activity activity object representing this Notice. */ - function asActivity($cur = null, $source = false) + function asActivity() { $act = self::cacheGet(Cache::codeKey('notice:as-activity:'.$this->id)); @@ -1332,68 +1332,37 @@ class Notice extends Memcached_DataObject $act->context = $ctx; - $noticeInfoAttr = array('local_id' => $this->id); // local notice ID (useful to clients for ordering) + // Source - $ns = $this->getSource(); + $atom_feed = $profile->getAtomFeed(); - if (!empty($ns)) { - $noticeInfoAttr['source'] = $ns->code; - if (!empty($ns->url)) { - $noticeInfoAttr['source_link'] = $ns->url; - if (!empty($ns->name)) { - $noticeInfoAttr['source'] = '' - . htmlspecialchars($ns->name) - . ''; - } + if (!empty($atom_feed)) { + + $act->source = new ActivitySource(); + + // XXX: we should store the actual feed ID + + $act->source->id = $atom_feed; + + // XXX: we should store the actual feed title + + $act->source->title = $profile->getBestName(); + + $act->source->links['alternate'] = $profile->profileurl; + $act->source->links['self'] = $atom_feed; + + $act->source->icon = $profile->avatarUrl(AVATAR_PROFILE_SIZE); + + $notice = $profile->getCurrentNotice(); + + if (!empty($notice)) { + $act->source->updated = self::utcDate($notice->created); } - } - if (!empty($cur)) { - $noticeInfoAttr['favorite'] = ($cur->hasFave($this)) ? "true" : "false"; - $cp = $cur->getProfile(); - $noticeInfoAttr['repeated'] = ($cp->hasRepeated($this->id)) ? "true" : "false"; - } + $user = User::staticGet('id', $profile->id); - if (!empty($this->repeat_of)) { - $noticeInfoAttr['repeat_of'] = $this->repeat_of; - } - - $act->extra[] = array('statusnet:notice_info', $noticeInfoAttr, null); - - if ($source) { - - $atom_feed = $profile->getAtomFeed(); - - if (!empty($atom_feed)) { - - $act->source = new ActivitySource(); - - // XXX: we should store the actual feed ID - - $act->source->id = $atom_feed; - - // XXX: we should store the actual feed title - - $act->source->title = $profile->getBestName(); - - $act->source->links['alternate'] = $profile->profileurl; - $act->source->links['self'] = $atom_feed; - - $act->source->icon = $profile->avatarUrl(AVATAR_PROFILE_SIZE); - - $notice = $profile->getCurrentNotice(); - - if (!empty($notice)) { - $act->source->updated = self::utcDate($notice->created); - } - - $user = User::staticGet('id', $profile->id); - - if (!empty($user)) { - $act->source->links['license'] = common_config('license', 'url'); - } + if (!empty($user)) { + $act->source->links['license'] = common_config('license', 'url'); } } @@ -1414,12 +1383,65 @@ class Notice extends Memcached_DataObject // This has gotten way too long. Needs to be sliced up into functional bits // or ideally exported to a utility class. - function asAtomEntry($namespace=false, $source=false, $author=true, $cur=null) + function asAtomEntry($namespace=false, + $source=false, + $author=true, + $cur=null) { - $act = $this->asActivity($cur, $source); - return $act->asString($namespace, $author); + $act = $this->asActivity(); + $act->extra[] = $this->noticeInfo($cur); + return $act->asString($namespace, $author, $source); + } + + /** + * Extra notice info for atom entries + * + * Clients use some extra notice info in the atom stream. + * This gives it to them. + * + * @param User $cur Current user + * + * @return array representation of element + */ + + function noticeInfo($cur) + { + // local notice ID (useful to clients for ordering) + + $noticeInfoAttr = array('local_id' => $this->id); + + // notice source + + $ns = $this->getSource(); + + if (!empty($ns)) { + $noticeInfoAttr['source'] = $ns->code; + if (!empty($ns->url)) { + $noticeInfoAttr['source_link'] = $ns->url; + if (!empty($ns->name)) { + $noticeInfoAttr['source'] = '' + . htmlspecialchars($ns->name) + . ''; + } + } + } + + // favorite and repeated + + if (!empty($cur)) { + $noticeInfoAttr['favorite'] = ($cur->hasFave($this)) ? "true" : "false"; + $cp = $cur->getProfile(); + $noticeInfoAttr['repeated'] = ($cp->hasRepeated($this->id)) ? "true" : "false"; + } + + if (!empty($this->repeat_of)) { + $noticeInfoAttr['repeat_of'] = $this->repeat_of; + } + + return array('statusnet:notice_info', $noticeInfoAttr, null); } - /** * Returns an XML string fragment with a reference to a notice as an diff --git a/lib/activity.php b/lib/activity.php index d3eeadcee9..c3a984a7b9 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -327,16 +327,8 @@ class Activity return null; } - function asString($namespace=false, $author=true) + function asString($namespace=false, $author=true, $source=false) { - $c = Cache::instance(); - - $str = $c->get(Cache::codeKey('activity:as-string:'.$this->id)); - - if (!empty($str)) { - return $str; - } - $xs = new XMLStringer(true); if ($namespace) { @@ -502,7 +494,7 @@ class Activity // Info on the source feed - if (!empty($this->source)) { + if ($source && !empty($this->source)) { $xs->elementStart('source'); $xs->element('id', null, $this->source->id); @@ -559,8 +551,6 @@ class Activity $str = $xs->getString(); - $c->set(Cache::codeKey('activity:as-string:'.$this->id), $str); - return $str; }