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, ], ]; } }