Don't cache user-specific information for Notice atom entries

This commit is contained in:
Evan Prodromou 2010-12-08 07:25:55 -05:00
parent db519d3ffb
commit 94ff04e190
2 changed files with 86 additions and 74 deletions

View File

@ -1234,7 +1234,7 @@ class Notice extends Memcached_DataObject
* @return Activity activity object representing this Notice. * @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)); $act = self::cacheGet(Cache::codeKey('notice:as-activity:'.$this->id));
@ -1332,68 +1332,37 @@ class Notice extends Memcached_DataObject
$act->context = $ctx; $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)) { if (!empty($atom_feed)) {
$noticeInfoAttr['source'] = $ns->code;
if (!empty($ns->url)) { $act->source = new ActivitySource();
$noticeInfoAttr['source_link'] = $ns->url;
if (!empty($ns->name)) { // XXX: we should store the actual feed ID
$noticeInfoAttr['source'] = '<a href="'
. htmlspecialchars($ns->url) $act->source->id = $atom_feed;
. '" rel="nofollow">'
. htmlspecialchars($ns->name) // XXX: we should store the actual feed title
. '</a>';
} $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)) { $user = User::staticGet('id', $profile->id);
$noticeInfoAttr['favorite'] = ($cur->hasFave($this)) ? "true" : "false";
$cp = $cur->getProfile();
$noticeInfoAttr['repeated'] = ($cp->hasRepeated($this->id)) ? "true" : "false";
}
if (!empty($this->repeat_of)) { if (!empty($user)) {
$noticeInfoAttr['repeat_of'] = $this->repeat_of; $act->source->links['license'] = common_config('license', 'url');
}
$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');
}
} }
} }
@ -1414,12 +1383,65 @@ class Notice extends Memcached_DataObject
// This has gotten way too long. Needs to be sliced up into functional bits // This has gotten way too long. Needs to be sliced up into functional bits
// or ideally exported to a utility class. // 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); $act = $this->asActivity();
return $act->asString($namespace, $author); $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 <statusnet:notice_info> 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'] = '<a href="'
. htmlspecialchars($ns->url)
. '" rel="nofollow">'
. htmlspecialchars($ns->name)
. '</a>';
}
}
}
// 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 * Returns an XML string fragment with a reference to a notice as an

View File

@ -327,16 +327,8 @@ class Activity
return null; 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); $xs = new XMLStringer(true);
if ($namespace) { if ($namespace) {
@ -502,7 +494,7 @@ class Activity
// Info on the source feed // Info on the source feed
if (!empty($this->source)) { if ($source && !empty($this->source)) {
$xs->elementStart('source'); $xs->elementStart('source');
$xs->element('id', null, $this->source->id); $xs->element('id', null, $this->source->id);
@ -559,8 +551,6 @@ class Activity
$str = $xs->getString(); $str = $xs->getString();
$c->set(Cache::codeKey('activity:as-string:'.$this->id), $str);
return $str; return $str;
} }