Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
24 / 24 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
1 / 1 |
MediaWikiPageUpdaterFactory | |
100.00% |
24 / 24 |
|
100.00% |
3 / 3 |
9 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
getPageUpdater | |
100.00% |
16 / 16 |
|
100.00% |
1 / 1 |
3 | |||
setPatrolStatus | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
5 |
1 | <?php |
2 | |
3 | declare( strict_types = 1 ); |
4 | |
5 | namespace EntitySchema\DataAccess; |
6 | |
7 | use MediaWiki\Context\DerivativeContext; |
8 | use MediaWiki\Context\IContextSource; |
9 | use MediaWiki\Page\WikiPageFactory; |
10 | use MediaWiki\Permissions\PermissionManager; |
11 | use MediaWiki\RecentChanges\RecentChange; |
12 | use MediaWiki\Storage\PageUpdater; |
13 | use MediaWiki\Title\Title; |
14 | use MediaWiki\Title\TitleFactory; |
15 | use MediaWiki\User\TempUser\TempUserCreator; |
16 | use MediaWiki\User\User; |
17 | |
18 | /** |
19 | * @license GPL-2.0-or-later |
20 | */ |
21 | class MediaWikiPageUpdaterFactory { |
22 | |
23 | private PermissionManager $permissionManager; |
24 | private TempUserCreator $tempUserCreator; |
25 | private TitleFactory $titleFactory; |
26 | private WikiPageFactory $wikiPageFactory; |
27 | |
28 | public function __construct( |
29 | PermissionManager $permissionManager, |
30 | TempUserCreator $tempUserCreator, |
31 | TitleFactory $titleFactory, |
32 | WikiPageFactory $wikiPageFactory |
33 | ) { |
34 | $this->permissionManager = $permissionManager; |
35 | $this->tempUserCreator = $tempUserCreator; |
36 | $this->titleFactory = $titleFactory; |
37 | $this->wikiPageFactory = $wikiPageFactory; |
38 | } |
39 | |
40 | /** |
41 | * Try to create a new PageUpdater for the given EntitySchema title and context. |
42 | * |
43 | * If the returned status is {@link PageUpdaterStatus::isOK() OK}, |
44 | * it will contain the PageUpdater, a context to use for the rest of the edit, |
45 | * and the temp user if one was created. |
46 | * The returned context will also have its title set to the EntityScheme title, |
47 | * so it can directly be used for edit filters. |
48 | * (The original context is not modified and keeps its original user and title, |
49 | * but it should generally not be used anymore past this point.) |
50 | */ |
51 | public function getPageUpdater( string $pageTitleString, IContextSource $context ): PageUpdaterStatus { |
52 | $title = $this->titleFactory->makeTitle( NS_ENTITYSCHEMA_JSON, $pageTitleString ); |
53 | $wikiPage = $this->wikiPageFactory->newFromTitle( $title ); |
54 | |
55 | $context = new DerivativeContext( $context ); |
56 | $context->setTitle( $title ); |
57 | |
58 | $savedTempUser = null; |
59 | $user = $context->getUser(); |
60 | if ( $this->tempUserCreator->shouldAutoCreate( $user, 'edit' ) ) { |
61 | $status = $this->tempUserCreator->create( null, $context->getRequest() ); |
62 | if ( $status->isOK() ) { |
63 | $savedTempUser = $status->getUser(); |
64 | $user = $savedTempUser; |
65 | $context->setUser( $savedTempUser ); |
66 | } else { |
67 | return PageUpdaterStatus::wrap( $status ); |
68 | } |
69 | } |
70 | |
71 | $pageUpdater = $wikiPage->newPageUpdater( $user ); |
72 | $this->setPatrolStatus( $user, $pageUpdater, $title ); |
73 | |
74 | return PageUpdaterStatus::newUpdater( $pageUpdater, $savedTempUser, $context ); |
75 | } |
76 | |
77 | private function setPatrolStatus( User $user, PageUpdater $pageUpdater, Title $title ): void { |
78 | global $wgUseNPPatrol, $wgUseRCPatrol; |
79 | $needsPatrol = $wgUseRCPatrol || ( $wgUseNPPatrol && !$title->exists() ); |
80 | |
81 | if ( |
82 | $needsPatrol |
83 | && $this->permissionManager->userCan( 'autopatrol', $user, $title ) |
84 | ) { |
85 | $pageUpdater->setRcPatrolStatus( RecentChange::PRC_AUTOPATROLLED ); |
86 | } |
87 | } |
88 | |
89 | } |