Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 72
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ArticleCompileUserData
0.00% covered (danger)
0.00%
0 / 72
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 1
 compile
0.00% covered (danger)
0.00%
0 / 72
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace MediaWiki\Extension\PageTriage\ArticleCompile;
4
5use MediaWiki\MainConfigNames;
6use MediaWiki\MediaWikiServices;
7use MediaWiki\User\User;
8
9/**
10 * Article User data
11 */
12class ArticleCompileUserData extends ArticleCompile {
13
14    public function compile() {
15        // Grab the earliest revision based on rev_timestamp and rev_id
16        $revId = [];
17        foreach ( $this->mPageId as $pageId ) {
18            $res = $this->db->newSelectQueryBuilder()
19                ->select( 'rev_id' )
20                ->from( 'revision' )
21                ->where( [ 'rev_page' => $pageId ] )
22                ->limit( 1 )
23                ->orderBy( [ 'rev_timestamp', 'rev_id' ] )
24                ->caller( __METHOD__ )
25                ->fetchRow();
26
27            if ( $res ) {
28                $revId[] = $res->rev_id;
29            }
30        }
31
32        if ( count( $revId ) === 0 ) {
33            return true;
34        }
35
36        if ( MediaWikiServices::getInstance()->getMainConfig()
37            ->get( MainConfigNames::BlockTargetMigrationStage ) & SCHEMA_COMPAT_READ_OLD
38        ) {
39            $blockQuery = $this->db->newSelectQueryBuilder()
40                ->select( '1' )
41                ->from( 'ipblocks' )
42                ->where( [
43                    'ipb_user=actor_user',
44                    $this->db->expr( 'ipb_expiry', '>', $this->db->timestamp() ),
45                    'ipb_sitewide' => 1
46                ] )
47                ->getSQL();
48        } else {
49            $blockQuery = $this->db->newSelectQueryBuilder()
50                ->select( '1' )
51                ->from( 'block' )
52                ->join( 'block_target', null, 'bt_id=bl_target' )
53                ->where( [
54                    'bt_user=actor_user',
55                    $this->db->expr( 'bl_expiry', '>', $this->db->timestamp() ),
56                    'bl_sitewide' => 1
57                ] )
58                ->getSQL();
59        }
60
61        $res = $this->db->newSelectQueryBuilder()
62            ->select( [
63                'rev_page', 'actor_name',
64                'user_id', 'user_name', 'user_real_name', 'user_registration', 'user_editcount',
65                'blocked' => 'EXISTS (' . $blockQuery . ')'
66            ] )
67            ->from( 'revision' )
68            ->join( 'actor', null, 'actor_id=rev_actor' )
69            ->leftJoin( 'user', null, 'user_id=actor_user' )
70            ->where( [ 'rev_id' => $revId ] )
71            ->caller( __METHOD__ )
72            ->fetchResultSet();
73
74        foreach ( $res as $row ) {
75            $data = [];
76            // User exists
77            if ( $row->user_id ) {
78                $user = User::newFromRow( $row );
79                $data['user_id'] = $row->user_id;
80                $data['user_name'] = $user->getName();
81                $data['user_editcount'] = $user->getEditCount();
82                $data['user_creation_date'] = wfTimestamp(
83                    TS_MW,
84                    $user->getRegistration()
85                );
86                $data['user_autoconfirmed'] =
87                    $user->isAllowed( 'autoconfirmed' ) ? '1' : '0';
88                $data['user_experience'] = $user->getExperienceLevel();
89                $data['user_bot'] = $user->isAllowed( 'bot' ) ? '1' : '0';
90            } else {
91                // User doesn't exist, etc IP
92                $data['user_id'] = 0;
93                $data['user_name'] = $row->actor_name;
94                $data['user_editcount'] = 0;
95                $data['user_creation_date'] = '';
96                $data['user_autoconfirmed'] = '0';
97                $data['user_experience'] = 'anonymous';
98                $data['user_bot'] = '0';
99            }
100            $data['user_block_status'] = $row->blocked ? '1' : '0';
101            $this->metadata[$row->rev_page] = $data;
102        }
103
104        return true;
105    }
106
107}