* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
- * Stream of notices for the user's inbox
+ * Stream of notices for a profile's "all" feed
*
* PHP version 5
*
* @category NoticeStream
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
+ * @author Mikael Nordfeldth <mmn@hethane.se>
* @copyright 2011 StatusNet, Inc.
+ * @copyright 2014 Free Software Foundation, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-if (!defined('STATUSNET')) {
- // This check helps protect against security problems;
- // your code file can't be executed directly from the web.
- exit(1);
-}
+if (!defined('GNUSOCIAL') && !defined('STATUSNET')) { exit(1); }
/**
- * Stream of notices for the user's inbox
+ * Stream of notices for a profile's "all" feed
*
* @category General
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
+ * @author Mikael Nordfeldth <mmn@hethane.se>
* @copyright 2011 StatusNet, Inc.
+ * @copyright 2014 Free Software Foundation, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
/**
* Constructor
*
- * @param User $user User to get a stream for
+ * @param Profile $target Profile to get a stream for
+ * @param Profile $scoped Currently scoped profile (if null, it is fetched)
*/
- function __construct($user, $profile = -1)
+ function __construct(Profile $target, Profile $scoped=null)
{
- if (is_int($profile) && $profile == -1) {
- $profile = Profile::current();
+ if ($scoped === null) {
+ $scoped = Profile::current();
}
- // Note: we don't use CachingNoticeStream since RawInboxNoticeStream
- // uses Inbox::staticGet(), which is cached.
- parent::__construct(new RawInboxNoticeStream($user), $profile);
+ // FIXME: we don't use CachingNoticeStream - but maybe we should?
+ parent::__construct(new CachingNoticeStream(new RawInboxNoticeStream($target), 'profileall'), $scoped);
}
}
/**
- * Raw stream of notices for the user's inbox
+ * Raw stream of notices for the target's inbox
*
* @category General
* @package StatusNet
*/
class RawInboxNoticeStream extends NoticeStream
{
- protected $user = null;
+ protected $target = null;
protected $inbox = null;
/**
* Constructor
*
- * @param User $user User to get a stream for
+ * @param Profile $target Profile to get a stream for
*/
- function __construct($user)
+ function __construct(Profile $target)
{
- $this->user = $user;
- $this->inbox = Inbox::staticGet('user_id', $user->id);
+ $this->target = $target;
}
/**
*/
function getNoticeIds($offset, $limit, $since_id, $max_id)
{
- if (empty($this->inbox)) {
- $this->inbox = Inbox::fromNoticeInbox($user_id);
- if (empty($this->inbox)) {
- return array();
- } else {
- $this->inbox->encache();
- }
- }
-
- $ids = $this->inbox->unpack();
-
+ $notice = new Notice();
+ $notice->selectAdd();
+ $notice->selectAdd('id');
+ $notice->whereAdd(sprintf('notice.created > "%s"', $notice->escape($this->target->created)));
+ // Reply:: is a table of mentions
+ // Subscription:: is a table of subscriptions (every user is subscribed to themselves)
+ $notice->whereAdd(
+ sprintf('notice.id IN (SELECT notice_id FROM reply WHERE profile_id=%1$d) ' .
+ 'OR notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d) ' .
+ 'OR notice.id IN (SELECT notice_id FROM group_inbox WHERE group_id IN (SELECT group_id FROM group_member WHERE profile_id=%1$d))' .
+ 'OR notice.id IN (SELECT notice_id FROM attention WHERE profile_id=%1$d)',
+ $this->target->id)
+ );
if (!empty($since_id)) {
- $newids = array();
- foreach ($ids as $id) {
- if ($id > $since_id) {
- $newids[] = $id;
- }
- }
- $ids = $newids;
+ $notice->whereAdd(sprintf('notice.id > %d', $since_id));
}
-
if (!empty($max_id)) {
- $newids = array();
- foreach ($ids as $id) {
- if ($id <= $max_id) {
- $newids[] = $id;
- }
- }
- $ids = $newids;
+ $notice->whereAdd(sprintf('notice.id <= %d', $max_id));
+ }
+ if (!empty($this->selectVerbs)) {
+ $notice->whereAddIn('verb', $this->selectVerbs, $notice->columnType('verb'));
+ }
+ $notice->limit($offset, $limit);
+ // notice.id will give us even really old posts, which were
+ // recently imported. For example if a remote instance had
+ // problems and just managed to post here. Another solution
+ // would be to have a 'notice.imported' field and order by it.
+ $notice->orderBy('notice.id DESC');
+
+ if (!$notice->find()) {
+ return array();
}
- $ids = array_slice($ids, $offset, $limit);
+ $ids = $notice->fetchAll('id');
return $ids;
}