Failed Conditions
Pull Request — newinternal (#527)
by Simon
16:02 queued 05:59
created

PageCreateRequest::getRequest()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 1
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
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\RequestAction;
10
11
use Waca\Background\Task\BotCreationTask;
12
use Waca\Background\Task\UserCreationTask;
13
use Waca\Background\Task\WelcomeUserTask;
14
use Waca\DataObjects\EmailTemplate;
15
use Waca\DataObjects\JobQueue;
16
use Waca\DataObjects\Request;
17
use Waca\DataObjects\User;
18
use Waca\Exceptions\AccessDeniedException;
19
use Waca\Exceptions\ApplicationLogicException;
20
use Waca\Helpers\Logger;
21
use Waca\PdoDatabase;
22
use Waca\RequestStatus;
23
use Waca\Security\SecurityManager;
24
use Waca\SessionAlert;
25
use Waca\WebRequest;
26
27
/**
28
 * Class PageCreateRequest
29
 *
30
 * This class wraps the auto-creation closes, enqueuing items onto the JobQueue for processing. This is different from
31
 * PageCloseRequest, which encapsulates all of the non-JobQueue closes.
32
 *
33
 * @package Waca\Pages\RequestAction
34
 */
35
class PageCreateRequest extends RequestActionBase
36
{
37
    /**
38
     * Main function for this page, when no specific actions are called.
39
     * @return void
40
     * @throws AccessDeniedException
41
     * @throws ApplicationLogicException
42
     */
43
    protected function main()
44
    {
45
        $this->checkPosted();
46
47
        $database = $this->getDatabase();
48
49
        $request = $this->getRequest($database);
50
        $template = $this->getTemplate($database);
51
        $creationMode = $this->getCreationMode();
52
        $user = User::getCurrent($database);
53
54
        $secMgr = $this->getSecurityManager();
55
        if ($secMgr->allows('RequestCreation', User::CREATION_BOT, $user) !== SecurityManager::ALLOWED
56
            && $creationMode === 'bot'
57
        ) {
58
            throw new AccessDeniedException($secMgr);
59
        }
60
        elseif ($secMgr->allows('RequestCreation', User::CREATION_OAUTH, $user) !== SecurityManager::ALLOWED
61
            && $creationMode === 'oauth'
62
        ) {
63
            throw new AccessDeniedException($secMgr);
64
        }
65
66
        if ($request->getEmailSent()) {
67
            throw new ApplicationLogicException('This requester has already had an email sent to them. Please fall back to manual creation');
68
        }
69
70
        $request->setStatus(RequestStatus::JOBQUEUE);
71
        $request->setReserved(null);
72
        $request->save();
73
74
        Logger::enqueuedJobQueue($database, $request);
75
76
        $creationTaskId = $this->enqueueCreationTask($creationMode, $request, $template, $user, $database);
77
78
        if ($user->getWelcomeTemplate() !== null) {
79
            $this->enqueueWelcomeTask($request, $creationTaskId, $user, $database);
80
        }
81
82
        SessionAlert::success("Request {$request->getId()} has been queued for autocreation");
83
84
        $this->redirect();
85
    }
86
87
    protected function getCreationMode()
88
    {
89
        $creationMode = WebRequest::postString('mode');
90
        if ($creationMode !== 'oauth' && $creationMode !== 'bot') {
91
            throw new ApplicationLogicException('Unknown creation mode');
92
        }
93
94
        return $creationMode;
95
    }
96
97
    /**
98
     * @param PdoDatabase $database
99
     *
100
     * @return EmailTemplate
101
     * @throws ApplicationLogicException
102
     */
103
    protected function getTemplate(PdoDatabase $database)
104
    {
105
        $templateId = WebRequest::postInt('template');
106
        if ($templateId === null) {
107
            throw new ApplicationLogicException('No template specified');
108
        }
109
110
        /** @var EmailTemplate $template */
111
        $template = EmailTemplate::getById($templateId, $database);
112
        if ($template === false || !$template->getActive()) {
113
            throw new ApplicationLogicException('Invalid or inactive template specified');
114
        }
115
116
        if ($template->getDefaultAction() !== EmailTemplate::CREATED) {
117
            throw new ApplicationLogicException('Specified template is not a creation template!');
118
        }
119
120
        return $template;
121
    }
122
123
    /**
124
     * @param PdoDatabase $database
125
     *
126
     * @return Request
127
     * @throws ApplicationLogicException
128
     */
129
    protected function getRequest(PdoDatabase $database)
130
    {
131
        $request = parent::getRequest($database);
132
133
        if ($request->getStatus() == RequestStatus::CLOSED) {
134
            throw new ApplicationLogicException('Request is already closed');
135
        }
136
137
        return $request;
138
    }
139
140
    /**
141
     * @param               $creationMode
142
     * @param Request       $request
143
     * @param EmailTemplate $template
144
     * @param User          $user
145
     *
146
     * @param PdoDatabase   $database
147
     *
148
     * @return int
149
     * @throws ApplicationLogicException
150
     */
151
    protected function enqueueCreationTask(
152
        $creationMode,
153
        Request $request,
154
        EmailTemplate $template,
155
        User $user,
156
        PdoDatabase $database
157
    ) {
158
        $creationTaskClass = null;
159
160
        if ($creationMode == "oauth") {
161
            $creationTaskClass = UserCreationTask::class;
162
        }
163
164
        if ($creationMode == "bot") {
165
            $creationTaskClass = BotCreationTask::class;
166
        }
167
168
        if ($creationTaskClass === null) {
169
            throw new ApplicationLogicException('Cannot determine creation mode');
170
        }
171
172
        $creationTask = new JobQueue();
173
        $creationTask->setTask($creationTaskClass);
174
        $creationTask->setRequest($request->getId());
175
        $creationTask->setEmailTemplate($template->getId());
176
        $creationTask->setTriggerUserId($user->getId());
177
        $creationTask->setDatabase($database);
178
        $creationTask->save();
179
180
        $creationTaskId = $creationTask->getId();
181
182
        return $creationTaskId;
183
    }
184
}