Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
MediaWikiPageUpdaterFactory
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
3 / 3
9
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 getPageUpdater
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
3
 setPatrolStatus
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
5
1<?php
2
3declare( strict_types = 1 );
4
5namespace EntitySchema\DataAccess;
6
7use MediaWiki\Context\DerivativeContext;
8use MediaWiki\Context\IContextSource;
9use MediaWiki\Page\WikiPageFactory;
10use MediaWiki\Permissions\PermissionManager;
11use MediaWiki\RecentChanges\RecentChange;
12use MediaWiki\Storage\PageUpdater;
13use MediaWiki\Title\Title;
14use MediaWiki\Title\TitleFactory;
15use MediaWiki\User\TempUser\TempUserCreator;
16use MediaWiki\User\User;
17
18/**
19 * @license GPL-2.0-or-later
20 */
21class 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}