Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 52
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
FlowUpdateBetaFeaturePreference
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 3
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 doDBUpdates
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
20
 getUpdateKey
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace Flow\Maintenance;
4
5use LoggedUpdateMaintenance;
6use MediaWiki\User\UserArray;
7
8$IP = getenv( 'MW_INSTALL_PATH' );
9if ( $IP === false ) {
10    $IP = __DIR__ . '/../../..';
11}
12
13require_once "$IP/maintenance/Maintenance.php";
14
15/**
16 * Sets Flow beta feature preference to true
17 * for users who are already using flow on
18 * their user talk page.
19 *
20 * @ingroup Maintenance
21 */
22class FlowUpdateBetaFeaturePreference extends LoggedUpdateMaintenance {
23
24    public function __construct() {
25        parent::__construct();
26        $this->setBatchSize( 300 );
27        $this->requireExtension( 'Flow' );
28    }
29
30    /**
31     * When the Flow beta feature is enable, it finds users
32     * who already have Flow enabled on their user talk page
33     * and opt them in the beta feature so their preferences
34     * and user talk page state are in sync.
35     *
36     * @return bool
37     */
38    protected function doDBUpdates() {
39        global $wgFlowEnableOptInBetaFeature;
40        if ( !$wgFlowEnableOptInBetaFeature ) {
41            return true;
42        }
43
44        $db = $this->getDB( DB_PRIMARY );
45
46        $innerQuery = $db->selectSQLText(
47            'user_properties',
48            'up_user',
49            [
50                // It works because this beta feature is exempted from auto-enroll.
51                'up_property' => BETA_FEATURE_FLOW_USER_TALK_PAGE,
52                'up_value' => 1
53            ],
54            __METHOD__
55        );
56
57        $result = $db->select(
58            [ 'page', 'user' ],
59            'user_id',
60            [
61                'page_content_model' => CONTENT_MODEL_FLOW_BOARD,
62                "user_id NOT IN($innerQuery)"
63            ],
64            __METHOD__,
65            [],
66            [
67                'user' => [ 'JOIN', [
68                    'page_namespace' => NS_USER_TALK,
69                    "page_title = REPLACE(user_name, ' ', '_')"
70                ] ],
71            ]
72        );
73
74        $services = $this->getServiceContainer();
75        $lbFactory = $services->getDBLoadBalancerFactory();
76        $userOptionsManager = $services->getUserOptionsManager();
77
78        $i = 0;
79        $batchSize = $this->getBatchSize();
80        $users = UserArray::newFromResult( $result );
81        foreach ( $users as $user ) {
82            // It works because this beta feature is exempted from auto-enroll.
83            $userOptionsManager->setOption( $user, BETA_FEATURE_FLOW_USER_TALK_PAGE, 1 );
84            $userOptionsManager->saveOptions( $user );
85
86            if ( ++$i % $batchSize === 0 ) {
87                $lbFactory->waitForReplication();
88            }
89        }
90
91        return true;
92    }
93
94    /**
95     * Get the update key name to go in the update log table
96     *
97     * Returns a different key when the beta feature is enabled or disable
98     * so that enabling it would trigger this script
99     * to execute so it can correctly update users preferences.
100     *
101     * @return string
102     */
103    protected function getUpdateKey() {
104        global $wgFlowEnableOptInBetaFeature;
105        return $wgFlowEnableOptInBetaFeature ? 'FlowBetaFeatureEnable' : 'FlowBetaFeatureDisable';
106    }
107}
108
109$maintClass = FlowUpdateBetaFeaturePreference::class;
110require_once RUN_MAINTENANCE_IF_MAIN;