* @file
*/
+use MediaWiki\Block\AbstractBlock;
use MediaWiki\MediaWikiServices;
/**
*/
class ApiQueryUserInfo extends ApiQueryBase {
+ use ApiBlockInfoTrait;
+
const WL_UNREAD_LIMIT = 1000;
private $params = [];
/**
* Get basic info about a given block
- * @param Block $block
- * @return array Array containing several keys:
- * - blockid - ID of the block
- * - blockedby - username of the blocker
- * - blockedbyid - user ID of the blocker
- * - blockreason - reason provided for the block
- * - blockedtimestamp - timestamp for when the block was placed/modified
- * - blockexpiry - expiry time of the block
- * - systemblocktype - system block type, if any
+ *
+ * @deprecated since 1.34 Use ApiBlockInfoTrait::getBlockDetails() instead.
+ * @param AbstractBlock $block
+ * @return array See ApiBlockInfoTrait::getBlockDetails
*/
- public static function getBlockInfo( Block $block ) {
- $vals = [];
- $vals['blockid'] = $block->getId();
- $vals['blockedby'] = $block->getByName();
- $vals['blockedbyid'] = $block->getBy();
- $vals['blockreason'] = $block->getReason();
- $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->getTimestamp() );
- $vals['blockexpiry'] = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
- $vals['blockpartial'] = !$block->isSitewide();
- if ( $block->getSystemBlockType() !== null ) {
- $vals['systemblocktype'] = $block->getSystemBlockType();
- }
- return $vals;
+ public static function getBlockInfo( AbstractBlock $block ) {
+ wfDeprecated( __METHOD__, '1.34' );
+
+ // Hack to access a private method from a trait:
+ $dummy = new class {
+ use ApiBlockInfoTrait {
+ getBlockDetails as public;
+ }
+ };
+
+ return $dummy->getBlockDetails( $block );
}
/**
$vals['anon'] = true;
}
- if ( isset( $this->prop['blockinfo'] ) && $user->isBlocked() ) {
- $vals = array_merge( $vals, self::getBlockInfo( $user->getBlock() ) );
+ if ( isset( $this->prop['blockinfo'] ) ) {
+ $block = $user->getBlock();
+ if ( $block ) {
+ $vals = array_merge( $vals, $this->getBlockDetails( $block ) );
+ }
}
if ( isset( $this->prop['hasmsg'] ) ) {
$vals['realname'] = $user->getRealName();
}
- if ( $user->isAllowed( 'viewmyprivateinfo' ) ) {
- if ( isset( $this->prop['email'] ) ) {
- $vals['email'] = $user->getEmail();
- $auth = $user->getEmailAuthenticationTimestamp();
- if ( !is_null( $auth ) ) {
- $vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
- }
+ if ( $user->isAllowed( 'viewmyprivateinfo' ) && isset( $this->prop['email'] ) ) {
+ $vals['email'] = $user->getEmail();
+ $auth = $user->getEmailAuthenticationTimestamp();
+ if ( $auth !== null ) {
+ $vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
}
}
);
}
+ if ( isset( $this->prop['latestcontrib'] ) ) {
+ $ts = $this->getLatestContributionTime();
+ if ( $ts !== null ) {
+ $vals['latestcontrib'] = $ts;
+ }
+ }
+
return $vals;
}
return $retval;
}
+ /**
+ * @return string|null ISO 8601 timestamp of current user's last contribution or null if none
+ */
+ protected function getLatestContributionTime() {
+ global $wgActorTableSchemaMigrationStage;
+
+ $user = $this->getUser();
+ $dbr = $this->getDB();
+
+ if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_READ_NEW ) {
+ if ( $user->getActorId() === null ) {
+ return null;
+ }
+ $res = $dbr->selectField( 'revision_actor_temp',
+ 'MAX(revactor_timestamp)',
+ [ 'revactor_actor' => $user->getActorId() ],
+ __METHOD__
+ );
+ } else {
+ if ( $user->isLoggedIn() ) {
+ $conds = [ 'rev_user' => $user->getId() ];
+ } else {
+ $conds = [ 'rev_user_text' => $user->getName() ];
+ }
+ $res = $dbr->selectField( 'revision',
+ 'MAX(rev_timestamp)',
+ $conds,
+ __METHOD__
+ );
+ }
+
+ return $res ? wfTimestamp( TS_ISO_8601, $res ) : null;
+ }
+
public function getAllowedParams() {
return [
'prop' => [
'unreadcount',
'centralids',
'preferencestoken',
+ 'latestcontrib',
],
ApiBase::PARAM_HELP_MSG_PER_VALUE => [
'unreadcount' => [