wiki.techinc.nl/includes/Rest/Handler/RevisionHandler.php
Petr Pchelko 5b77ce93ad REST: Deduplicate and normalize REST error message names
Bug: T237568
Change-Id: I6f35757f948b34a6a641808db8e5f98983054b7b
2019-11-08 09:37:26 -08:00

106 lines
2.8 KiB
PHP

<?php
namespace MediaWiki\Rest\Handler;
use MediaWiki\Permissions\PermissionManager;
use MediaWiki\Rest\LocalizedHttpException;
use MediaWiki\Revision\RevisionLookup;
use MediaWiki\Revision\RevisionRecord;
use RequestContext;
use User;
use Wikimedia\Message\MessageValue;
use Wikimedia\ParamValidator\ParamValidator;
use MediaWiki\Rest\SimpleHandler;
use MediaWiki\Rest\Response;
/**
* Handler class for Core REST API endpoints that perform operations on revisions
*/
class RevisionHandler extends SimpleHandler {
/** @var RevisionLookup */
private $revisionLookup;
/** @var PermissionManager */
private $permissionManager;
/** @var User */
private $user;
/**
* @param RevisionLookup $revisionLookup
* @param PermissionManager $permissionManager
*/
public function __construct(
RevisionLookup $revisionLookup,
PermissionManager $permissionManager
) {
$this->revisionLookup = $revisionLookup;
$this->permissionManager = $permissionManager;
// @todo Inject this, when there is a good way to do that
$this->user = RequestContext::getMain()->getUser();
}
/**
* @param int $id
* @return Response
* @throws LocalizedHttpException
*/
public function run( $id ) {
$rev = $this->revisionLookup->getRevisionById( $id );
if ( !$rev ) {
throw new LocalizedHttpException(
new MessageValue( 'rest-nonexistent-revision', [ $id ] ), 404 );
}
if ( !$this->permissionManager->userCan( 'read', $this->user, $rev->getPageAsLinkTarget() ) ) {
throw new LocalizedHttpException(
new MessageValue( 'rest-permission-denied-revision', [ $id ] ), 403 );
}
$responseData = [
'id' => $rev->getId(),
'page' => [
'id' => $rev->getPageId(),
'title' => $rev->getPageAsLinkTarget()->getText(),
],
'size' => $rev->getSize(),
'minor' => $rev->isMinor(),
'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ),
];
$revUser = $rev->getUser( RevisionRecord::FOR_THIS_USER, $this->user );
if ( $revUser ) {
$responseData['user'] = [
'id' => $revUser->isRegistered() ? $revUser->getId() : null,
'name' => $revUser->getName()
];
} else {
$responseData['user'] = null;
}
$comment = $rev->getComment( RevisionRecord::FOR_THIS_USER, $this->user );
$responseData['comment'] = $comment ? $comment->text : null;
$parent = $this->revisionLookup->getPreviousRevision( $rev );
if ( $parent ) {
$responseData['delta'] = $rev->getSize() - $parent->getSize();
} else {
$responseData['delta'] = null;
}
return $this->getResponseFactory()->createJson( $responseData );
}
public function needsWriteAccess() {
return false;
}
public function getParamSettings() {
return [
'id' => [
self::PARAM_SOURCE => 'path',
ParamValidator::PARAM_TYPE => 'integer',
ParamValidator::PARAM_REQUIRED => true,
],
];
}
}