/** * @dataProvider provideUserTitleTimestamp */ public function testConstruction($user, LinkTarget $linkTarget, $notifTimestamp) { $item = new WatchedItem($user, $linkTarget, $notifTimestamp); $this->assertSame($user, $item->getUser()); $this->assertSame($linkTarget, $item->getLinkTarget()); $this->assertSame($notifTimestamp, $item->getNotificationTimestamp()); // The below tests the internal WatchedItem::getTitle method $this->assertInstanceOf('Title', $item->getTitle()); $this->assertSame($linkTarget->getDBkey(), $item->getTitle()->getDBkey()); $this->assertSame($linkTarget->getFragment(), $item->getTitle()->getFragment()); $this->assertSame($linkTarget->getNamespace(), $item->getTitle()->getNamespace()); $this->assertSame($linkTarget->getText(), $item->getTitle()->getText()); }
private function extractOutputData(WatchedItem $watchedItem, array $recentChangeInfo) { /* Determine the title of the page that has been changed. */ $title = Title::makeTitle($watchedItem->getLinkTarget()->getNamespace(), $watchedItem->getLinkTarget()->getDBkey()); $user = $this->getUser(); /* Our output data. */ $vals = []; $type = intval($recentChangeInfo['rc_type']); $vals['type'] = RecentChange::parseFromRCType($type); $anyHidden = false; /* Create a new entry in the result for the title. */ if ($this->fld_title || $this->fld_ids) { // These should already have been filtered out of the query, but just in case. if ($type === RC_LOG && $recentChangeInfo['rc_deleted'] & LogPage::DELETED_ACTION) { $vals['actionhidden'] = true; $anyHidden = true; } if ($type !== RC_LOG || LogEventsList::userCanBitfield($recentChangeInfo['rc_deleted'], LogPage::DELETED_ACTION, $user)) { if ($this->fld_title) { ApiQueryBase::addTitleInfo($vals, $title); } if ($this->fld_ids) { $vals['pageid'] = intval($recentChangeInfo['rc_cur_id']); $vals['revid'] = intval($recentChangeInfo['rc_this_oldid']); $vals['old_revid'] = intval($recentChangeInfo['rc_last_oldid']); } } } /* Add user data and 'anon' flag, if user is anonymous. */ if ($this->fld_user || $this->fld_userid) { if ($recentChangeInfo['rc_deleted'] & Revision::DELETED_USER) { $vals['userhidden'] = true; $anyHidden = true; } if (Revision::userCanBitfield($recentChangeInfo['rc_deleted'], Revision::DELETED_USER, $user)) { if ($this->fld_userid) { $vals['userid'] = (int) $recentChangeInfo['rc_user']; // for backwards compatibility $vals['user'] = (int) $recentChangeInfo['rc_user']; } if ($this->fld_user) { $vals['user'] = $recentChangeInfo['rc_user_text']; } if (!$recentChangeInfo['rc_user']) { $vals['anon'] = true; } } } /* Add flags, such as new, minor, bot. */ if ($this->fld_flags) { $vals['bot'] = (bool) $recentChangeInfo['rc_bot']; $vals['new'] = $recentChangeInfo['rc_type'] == RC_NEW; $vals['minor'] = (bool) $recentChangeInfo['rc_minor']; } /* Add sizes of each revision. (Only available on 1.10+) */ if ($this->fld_sizes) { $vals['oldlen'] = intval($recentChangeInfo['rc_old_len']); $vals['newlen'] = intval($recentChangeInfo['rc_new_len']); } /* Add the timestamp. */ if ($this->fld_timestamp) { $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $recentChangeInfo['rc_timestamp']); } if ($this->fld_notificationtimestamp) { $vals['notificationtimestamp'] = $watchedItem->getNotificationTimestamp() == null ? '' : wfTimestamp(TS_ISO_8601, $watchedItem->getNotificationTimestamp()); } /* Add edit summary / log summary. */ if ($this->fld_comment || $this->fld_parsedcomment) { if ($recentChangeInfo['rc_deleted'] & Revision::DELETED_COMMENT) { $vals['commenthidden'] = true; $anyHidden = true; } if (Revision::userCanBitfield($recentChangeInfo['rc_deleted'], Revision::DELETED_COMMENT, $user)) { if ($this->fld_comment && isset($recentChangeInfo['rc_comment'])) { $vals['comment'] = $recentChangeInfo['rc_comment']; } if ($this->fld_parsedcomment && isset($recentChangeInfo['rc_comment'])) { $vals['parsedcomment'] = Linker::formatComment($recentChangeInfo['rc_comment'], $title); } } } /* Add the patrolled flag */ if ($this->fld_patrol) { $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] == 1; $vals['unpatrolled'] = ChangesList::isUnpatrolled((object) $recentChangeInfo, $user); } if ($this->fld_loginfo && $recentChangeInfo['rc_type'] == RC_LOG) { if ($recentChangeInfo['rc_deleted'] & LogPage::DELETED_ACTION) { $vals['actionhidden'] = true; $anyHidden = true; } if (LogEventsList::userCanBitfield($recentChangeInfo['rc_deleted'], LogPage::DELETED_ACTION, $user)) { $vals['logid'] = intval($recentChangeInfo['rc_logid']); $vals['logtype'] = $recentChangeInfo['rc_log_type']; $vals['logaction'] = $recentChangeInfo['rc_log_action']; $vals['logparams'] = LogFormatter::newFromRow($recentChangeInfo)->formatParametersForApi(); } } if ($anyHidden && $recentChangeInfo['rc_deleted'] & Revision::DELETED_RESTRICTED) { $vals['suppressed'] = true; } return $vals; }