10use InvalidArgumentException;
47 private $htmlCacheUpdater;
50 private $revisionStore;
66 parent::__construct( $context,
$page,
$ids, $lbFactory );
67 $this->lbFactory = $lbFactory;
68 $this->hookRunner =
new HookRunner( $hookContainer );
69 $this->htmlCacheUpdater = $htmlCacheUpdater;
70 $this->revisionStore = $revisionStore;
71 $this->eventDispatcher = $eventDispatcher;
86 return 'deleterevision';
91 return RevisionRecord::DELETED_TEXT;
98 ->getRevisionById(
$ids[0] );
100 if ( $revisionRecord ) {
101 return Title::newFromPageIdentity( $revisionRecord->getPage() );
111 $ids = array_map(
'intval', $this->ids );
112 $queryBuilder = $this->revisionStore->newSelectQueryBuilder( $db )
116 ->where( [
'rev_page' => $this->page->getId(),
'rev_id' =>
$ids ] )
117 ->orderBy(
'rev_id', \
Wikimedia\Rdbms\SelectQueryBuilder::SORT_DESC )
119 ->useIndex( [
'revision' =>
'PRIMARY' ] );
123 $live = $queryBuilder->caller( __METHOD__ )->fetchResultSet();
124 if ( $live->numRows() >= count(
$ids ) ) {
129 $queryBuilder = $this->revisionStore->newArchiveSelectQueryBuilder( $db )
131 ->where( [
'ar_rev_id' =>
$ids ] )
132 ->orderBy(
'ar_rev_id', \
Wikimedia\Rdbms\SelectQueryBuilder::SORT_DESC );
137 $archived = $queryBuilder->caller( __METHOD__ )->fetchResultSet();
139 if ( $archived->numRows() == 0 ) {
141 } elseif ( $live->numRows() == 0 ) {
146 foreach ( $live as $row ) {
147 $rows[$row->rev_id] = $row;
149 foreach ( $archived as $row ) {
150 $rows[$row->ar_rev_id] = $row;
159 if ( isset( $row->rev_id ) ) {
161 } elseif ( isset( $row->ar_rev_id ) ) {
165 throw new InvalidArgumentException(
'Invalid row type in RevDelRevisionList' );
171 if ( $this->currentRevId ===
null ) {
172 $dbw = $this->lbFactory->getPrimaryDatabase();
173 $this->currentRevId = $dbw->newSelectQueryBuilder()
174 ->select(
'page_latest' )
176 ->where( [
'page_namespace' => $this->page->getNamespace(),
'page_title' => $this->page->getDBkey() ] )
177 ->caller( __METHOD__ )->fetchField();
191 array $visibilityChangeMap,
198 $bitsUnset = RevisionRecord::SUPPRESSED_ALL &
199 ( ~ RevisionDeleter::extractBitfield( $bitPars, RevisionRecord::SUPPRESSED_ALL ) );
217 $this->eventDispatcher->dispatch(
224 $visibilityChangeMap,
225 $logEntry->getComment(),
228 $logEntry->getTimestamp()
236 Title::newFromPageIdentity( $this->page )->invalidateCache();
237 return Status::newGood();
242 $this->htmlCacheUpdater->purgeTitleUrls(
244 HTMLCacheUpdater::PURGE_INTENT_TXROUND_REFLECTED
247 $this->hookRunner->onArticleRevisionVisibilitySet(
248 Title::newFromPageIdentity( $this->page ),
253 return Status::newGood();
258class_alias( RevDelRevisionList::class,
'RevDelRevisionList' );
Domain event representing a change to the visibility attributes of one of the page's revisions.
Interface for objects which can provide a MediaWiki context on request.
Service for sending domain events to registered listeners.
Interface for objects (potentially) representing an editable wiki page.
Interface for a page that is (or could be, or used to be) an editable wiki page.