wiki.techinc.nl/includes/api/ApiQueryBlockInfoTrait.php

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

152 lines
4.2 KiB
PHP
Raw Normal View History

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Api;
use MediaWiki\Block\CompositeBlock;
use MediaWiki\Block\HideUserUtils;
use MediaWiki\MediaWikiServices;
use MediaWiki\Permissions\Authority;
use stdClass;
use Wikimedia\Rdbms\IExpression;
use Wikimedia\Rdbms\IReadableDatabase;
use Wikimedia\Rdbms\IResultWrapper;
use Wikimedia\Rdbms\SelectQueryBuilder;
/**
* @ingroup API
*/
trait ApiQueryBlockInfoTrait {
use ApiBlockInfoTrait;
/**
* Filter hidden users if the current user does not have the ability to
* view them. Also add a field hu_deleted which will be true if the user
* is hidden.
*
* @since 1.42
*/
private function addDeletedUserFilter() {
// TODO: inject dependencies the way ApiWatchlistTrait does
$utils = MediaWikiServices::getInstance()->getHideUserUtils();
if ( !$this->getAuthority()->isAllowed( 'hideuser' ) ) {
$this->addWhere( $utils->getExpression( $this->getDB() ) );
// The field is always false since we are filtering out rows where it is true
$this->addFields( [ 'hu_deleted' => '1=0' ] );
} else {
$this->addFields( [
'hu_deleted' => $utils->getExpression(
$this->getDB(),
'user_id',
HideUserUtils::HIDDEN_USERS
)
] );
}
}
/**
* For a set of rows with a user_id field, get the block details for all
* users, and return them in array, formatted using
* ApiBlockInfoTrait::getBlockDetails().
*
* @since 1.42
* @param iterable<stdClass>|IResultWrapper $rows Rows with a user_id field
* @return array The block details indexed by user_id. If a user is not blocked,
* the key will be absent.
*/
private function getBlockDetailsForRows( $rows ) {
$ids = [];
foreach ( $rows as $row ) {
$ids[] = (int)$row->user_id;
}
if ( !$ids ) {
return [];
}
$blocks = MediaWikiServices::getInstance()->getDatabaseBlockStore()
->newListFromConds( [ 'bt_user' => $ids ] );
$blocksByUser = [];
foreach ( $blocks as $block ) {
$blocksByUser[$block->getTargetUserIdentity()->getId()][] = $block;
}
$infoByUser = [];
foreach ( $blocksByUser as $id => $userBlocks ) {
if ( count( $userBlocks ) > 1 ) {
$maybeCompositeBlock = CompositeBlock::createFromBlocks( ...$userBlocks );
} else {
$maybeCompositeBlock = $userBlocks[0];
}
$infoByUser[$id] = $this->getBlockDetails( $maybeCompositeBlock );
}
return $infoByUser;
}
Improve custom folding and grouping PHPStorm can use custom folding regions defined in either the VisualStudio style or the NetBeans style. The VisualStudio style is more pleasing to the eye and also works as a vim foldmarker. So get rid of the previous vim foldmarkers, and use region/endregion. region/endregion need to be in a single-line comment which is not a doc comment, and the rest of the comment is used as a region heading (by both PHPStorm and vim). So to retain Doxygen @name tags, it is necessary to repeat the section heading, once in a @name and once in a region. Establish a standard style for this, with a divider and three spaces before the heading, to better set off the heading name in plain text. Besides being the previous vim foldmarker, @{ is also a Doxygen grouping command. However, almost all prior usages of @{ ... @} in this sense were broken for one reason or another. It's necessary for the @{ to be in a doc comment, and DISTRIBUTE_GROUP_DOC doesn't work if any of the individual members in the group are separately documented. @name alone is sufficient to create a Doxygen section when the sections are adjacent, but if there is ungrouped content after the section, it is necessary to use @{ ... @} to avoid having the Doxygen group run on. So I retained, fixed or added @{ ... @} in certain cases. I wasn't able to test the changes to the trait documentation in Doxygen since trait syntax is not recognised and the output is badly broken. Change-Id: I7d819fdb376c861f40bfc01aed74cd3706141b20
2020-12-22 23:52:00 +00:00
/***************************************************************************/
// region Methods required from ApiQueryBase
/** @name Methods required from ApiQueryBase */
/**
* @see ApiBase::getDB
* @return IReadableDatabase
*/
abstract protected function getDB();
/**
* @see IContextSource::getAuthority
* @return Authority
*/
abstract public function getAuthority();
/**
* @see ApiQueryBase::addTables
* @param string|array $tables
* @param string|null $alias
*/
abstract protected function addTables( $tables, $alias = null );
/**
* @see ApiQueryBase::addFields
* @param array|string $fields
*/
abstract protected function addFields( $fields );
/**
* @see ApiQueryBase::addWhere
* @param string|array|IExpression $conds
*/
abstract protected function addWhere( $conds );
/**
* @see ApiQueryBase::addJoinConds
* @param array $conds
*/
abstract protected function addJoinConds( $conds );
/**
* @return SelectQueryBuilder
*/
abstract protected function getQueryBuilder();
Improve custom folding and grouping PHPStorm can use custom folding regions defined in either the VisualStudio style or the NetBeans style. The VisualStudio style is more pleasing to the eye and also works as a vim foldmarker. So get rid of the previous vim foldmarkers, and use region/endregion. region/endregion need to be in a single-line comment which is not a doc comment, and the rest of the comment is used as a region heading (by both PHPStorm and vim). So to retain Doxygen @name tags, it is necessary to repeat the section heading, once in a @name and once in a region. Establish a standard style for this, with a divider and three spaces before the heading, to better set off the heading name in plain text. Besides being the previous vim foldmarker, @{ is also a Doxygen grouping command. However, almost all prior usages of @{ ... @} in this sense were broken for one reason or another. It's necessary for the @{ to be in a doc comment, and DISTRIBUTE_GROUP_DOC doesn't work if any of the individual members in the group are separately documented. @name alone is sufficient to create a Doxygen section when the sections are adjacent, but if there is ungrouped content after the section, it is necessary to use @{ ... @} to avoid having the Doxygen group run on. So I retained, fixed or added @{ ... @} in certain cases. I wasn't able to test the changes to the trait documentation in Doxygen since trait syntax is not recognised and the output is badly broken. Change-Id: I7d819fdb376c861f40bfc01aed74cd3706141b20
2020-12-22 23:52:00 +00:00
// endregion -- end of methods required from ApiQueryBase
}
/** @deprecated class alias since 1.43 */
class_alias( ApiQueryBlockInfoTrait::class, 'ApiQueryBlockInfoTrait' );