Failed Conditions
Push — newinternal ( b66232...216d62 )
by Simon
16:33 queued 06:35
created

includes/Pages/Statistics/StatsUsers.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/******************************************************************************
3
 * Wikipedia Account Creation Assistance tool                                 *
4
 *                                                                            *
5
 * All code in this file is released into the public domain by the ACC        *
6
 * Development Team. Please see team.json for a list of contributors.         *
7
 ******************************************************************************/
8
9
namespace Waca\Pages\Statistics;
10
11
use PDO;
12
use Waca\DataObjects\Log;
13
use Waca\DataObjects\User;
14
use Waca\Exceptions\ApplicationLogicException;
15
use Waca\Helpers\LogHelper;
16
use Waca\Helpers\OAuthUserHelper;
17
use Waca\Helpers\SearchHelpers\LogSearchHelper;
18
use Waca\Helpers\SearchHelpers\UserSearchHelper;
19
use Waca\Pages\PageUserManagement;
20
use Waca\Tasks\InternalPageBase;
21
use Waca\WebRequest;
22
23
class StatsUsers extends InternalPageBase
24
{
25
    public function main()
26
    {
27
        $this->setHtmlTitle('Users :: Statistics');
28
29
        $database = $this->getDatabase();
30
31
        $query = <<<SQL
32
SELECT
33
    u.id
34
    , u.username
35
    , CASE WHEN ru.role IS NOT NULL THEN 'Yes' ELSE 'No' END tooluser
36
    , CASE WHEN ra.role IS NOT NULL THEN 'Yes' ELSE 'No' END tooladmin
37
    , CASE WHEN rc.role IS NOT NULL THEN 'Yes' ELSE 'No' END checkuser
38
    , CASE WHEN rr.role IS NOT NULL THEN 'Yes' ELSE 'No' END toolroot
39
FROM user u
40
    LEFT JOIN userrole ru ON ru.user = u.id AND ru.role = 'user'
41
    LEFT JOIN userrole ra ON ra.user = u.id AND ra.role = 'admin'
42
    LEFT JOIN userrole rc ON rc.user = u.id AND rc.role = 'checkuser'
43
    LEFT JOIN userrole rr ON rr.user = u.id AND rr.role = 'toolRoot'
44
WHERE u.status = 'Active'
45
SQL;
46
47
        $users = $database->query($query)->fetchAll(PDO::FETCH_ASSOC);
48
        $this->assign('users', $users);
49
50
        $this->assign('statsPageTitle', 'Account Creation Tool users');
51
        $this->setTemplate("statistics/users.tpl");
52
    }
53
54
    /**
55
     * Entry point for the detail action.
56
     *
57
     * @throws ApplicationLogicException
58
     */
59
    protected function detail()
60
    {
61
        $userId = WebRequest::getInt('user');
62
        if ($userId === null) {
63
            throw new ApplicationLogicException("User not found");
64
        }
65
66
        $database = $this->getDatabase();
67
68
        $user = User::getById($userId, $database);
69
        if ($user == false) {
70
            throw new ApplicationLogicException('User not found');
71
        }
72
73
        $safeUsername = htmlentities($user->getUsername(), ENT_COMPAT, 'UTF-8');
74
        $this->setHtmlTitle($safeUsername . ' :: Users :: Statistics');
75
76
        $activitySummary = $database->prepare(<<<SQL
77
SELECT COALESCE(closes.mail_desc, log.action) AS action, COUNT(*) AS count
78
FROM log
79
INNER JOIN user ON log.user = user.id
80
LEFT JOIN closes ON log.action = closes.closes
81
WHERE user.username = :username
82
GROUP BY action;
83
SQL
84
        );
85
        $activitySummary->execute(array(":username" => $user->getUsername()));
86
        $activitySummaryData = $activitySummary->fetchAll(PDO::FETCH_ASSOC);
87
88
        $this->assign("user", $user);
89
        $this->assign("activity", $activitySummaryData);
90
91
        $usersCreatedQuery = $database->prepare(<<<SQL
92
SELECT log.timestamp time, request.name name, request.id id
93
FROM log
94
INNER JOIN request ON (request.id = log.objectid AND log.objecttype = 'Request')
95
INNER JOIN user ON log.user = user.id
96
LEFT JOIN emailtemplate ON concat('Closed ', emailtemplate.id) = log.action
97
WHERE user.username = :username
98
    AND log.action LIKE 'Closed %'
99
    AND (emailtemplate.oncreated = '1' OR log.action = 'Closed custom-y')
100
ORDER BY log.timestamp;
101
SQL
102
        );
103
        $usersCreatedQuery->execute(array(":username" => $user->getUsername()));
104
        $usersCreated = $usersCreatedQuery->fetchAll(PDO::FETCH_ASSOC);
105
        $this->assign("created", $usersCreated);
106
107
        $usersNotCreatedQuery = $database->prepare(<<<SQL
108
SELECT log.timestamp time, request.name name, request.id id
109
FROM log
110
JOIN request ON request.id = log.objectid AND log.objecttype = 'Request'
111
JOIN user ON log.user = user.id
112
LEFT JOIN emailtemplate ON concat('Closed ', emailtemplate.id) = log.action
113
WHERE user.username = :username
114
    AND log.action LIKE 'Closed %'
115
    AND (emailtemplate.oncreated = '0' OR log.action = 'Closed custom-n' OR log.action = 'Closed 0')
116
ORDER BY log.timestamp;
117
SQL
118
        );
119
        $usersNotCreatedQuery->execute(array(":username" => $user->getUsername()));
120
        $usersNotCreated = $usersNotCreatedQuery->fetchAll(PDO::FETCH_ASSOC);
121
        $this->assign("notcreated", $usersNotCreated);
122
123
        /** @var Log[] $logs */
124
        $logs = LogSearchHelper::get($database)
125
            ->byObjectType('User')
126
            ->byObjectId($user->getId())
127
            ->getRecordCount($logCount)
128
            ->fetch();
129
130 View Code Duplication
        if ($logCount === 0) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
131
            $this->assign('accountlog', array());
132
        }
133
        else {
134
            list($users, $logData) = LogHelper::prepareLogsForTemplate($logs, $database, $this->getSiteConfiguration());
135
136
            $this->assign("accountlog", $logData);
137
            $this->assign("users", $users);
138
        }
139
140
        $currentUser = User::getCurrent($database);
141
        $this->assign('canApprove', $this->barrierTest('approve', $currentUser, PageUserManagement::class));
142
        $this->assign('canDecline', $this->barrierTest('decline', $currentUser, PageUserManagement::class));
143
        $this->assign('canRename', $this->barrierTest('rename', $currentUser, PageUserManagement::class));
144
        $this->assign('canEditUser', $this->barrierTest('editUser', $currentUser, PageUserManagement::class));
145
        $this->assign('canSuspend', $this->barrierTest('suspend', $currentUser, PageUserManagement::class));
146
        $this->assign('canEditRoles', $this->barrierTest('editRoles', $currentUser, PageUserManagement::class));
147
148
        $oauth = new OAuthUserHelper($user, $database, $this->getOAuthProtocolHelper(), $this->getSiteConfiguration());
149
        $this->assign('oauth', $oauth);
150
151
        if ($oauth->isFullyLinked()) {
152
            $this->assign('identity', $oauth->getIdentity(true));
153
            $this->assign('identityExpired', $oauth->identityExpired());
154
        }
155
156
        $this->assign('statsPageTitle', 'Account Creation Tool users');
157
        $this->setTemplate("statistics/userdetail.tpl");
158
    }
159
}
160