Issues (186)

Branch: oauth-creation-featureflag

includes/DataObjects/EmailTemplate.php (3 issues)

1
<?php
2
/******************************************************************************
3
 * Wikipedia Account Creation Assistance tool                                 *
4
 * ACC Development Team. Please see team.json for a list of contributors.     *
5
 *                                                                            *
6
 * This is free and unencumbered software released into the public domain.    *
7
 * Please see LICENSE.md for the full licencing statement.                    *
8
 ******************************************************************************/
9
10
namespace Waca\DataObjects;
11
12
use Exception;
13
use PDO;
14
use Waca\DataObject;
15
use Waca\Exceptions\OptimisticLockFailedException;
16
use Waca\PdoDatabase;
17
18
/**
19
 * Email template data object
20
 *
21
 * This is the close reasons thing.
22
 */
23
class EmailTemplate extends DataObject
24
{
25
    const ACTION_CREATED = 'created';
26
    const ACTION_NOT_CREATED = 'not created';
27
    const ACTION_NONE = 'none';
28
    const ACTION_DEFER = 'defer';
29
30
    /** @var string the name of the template */
31
    private $name;
32
    private $text;
33
    /** @var string|null */
34
    private $jsquestion;
35
    private $active = 1;
36
    private $preloadonly = 0;
37
    private $defaultaction = self::ACTION_NOT_CREATED;
38
    private $queue;
39
    /** @var int */
40
    private $domain;
41
42
    /**
43
     * Gets active non-preload templates
44
     *
45
     * @param string      $defaultAction Default action to take (EmailTemplate::ACTION_CREATED or EmailTemplate::ACTION_NOT_CREATED)
46
     * @param PdoDatabase $database
47
     * @param int         $domain
48
     * @param int|null    $filter        Template IDs to filter out
49
     *
50
     * @return array|false
51
     */
52
    public static function getActiveNonpreloadTemplates($defaultAction, PdoDatabase $database, int $domain, ?int $filter = null)
53
    {
54
        $statement = $database->prepare(<<<SQL
55
SELECT * FROM `emailtemplate`
56
WHERE defaultaction = :forcreated AND active = 1 AND preloadonly = 0 AND (:skipFilter = 1 OR id <> :filter) AND domain = :domain;
57
SQL
58
        );
59
        $statement->bindValue(":forcreated", $defaultAction);
60
        $statement->bindValue(":filter", $filter);
61
        $statement->bindValue(":skipFilter", $filter === null ? 1 : 0);
62
        $statement->bindValue(":domain", $domain);
63
64
        $statement->execute();
65
66
        $resultObject = $statement->fetchAll(PDO::FETCH_CLASS, get_called_class());
67
68
        /** @var EmailTemplate $t */
69
        foreach ($resultObject as $t) {
70
            $t->setDatabase($database);
71
        }
72
73
        return $resultObject;
74
    }
75
76
    /**
77
     * Gets active non-preload and preload templates, optionally filtered by the default action.
78
     *
79
     * @param null|bool|string $defaultAction Default action to take (EmailTemplate::ACTION_CREATED,
80
     *                                        EmailTemplate::ACTION_NOT_CREATED, or EmailTemplate::ACTION_NONE), or optionally null to
81
     *                                        just get everything.
82
     * @param PdoDatabase      $database
83
     * @param int              $domain
84
     *
85
     * @return array|false
86
     */
87
    public static function getAllActiveTemplates($defaultAction, PdoDatabase $database, int $domain)
88
    {
89
        if ($defaultAction === false) {
90
            $statement = $database->prepare(
91
                "SELECT * FROM `emailtemplate` WHERE defaultaction NOT IN ('created', 'not created') AND active = 1 AND domain = :domain;");
92
        }
93
        elseif ($defaultAction === null) {
0 ignored issues
show
The condition $defaultAction === null is always false.
Loading history...
94
            $statement = $database->prepare("SELECT * FROM `emailtemplate` WHERE active = 1 AND domain = :domain;");
95
        }
96
        else {
97
            $statement = $database->prepare("SELECT * FROM `emailtemplate` WHERE defaultaction = :forcreated AND active = 1 AND domain = :domain;");
98
            $statement->bindValue(":forcreated", $defaultAction);
99
        }
100
101
        $statement->bindValue(":domain", $domain);
102
103
        $statement->execute();
104
105
        $resultObject = $statement->fetchAll(PDO::FETCH_CLASS, get_called_class());
106
107
        /** @var EmailTemplate $t */
108
        foreach ($resultObject as $t) {
109
            $t->setDatabase($database);
110
        }
111
112
        return $resultObject;
113
    }
114
115
    /**
116
     * Gets all the inactive templates
117
     *
118
     * @param PdoDatabase $database
119
     * @param int         $domain
120
     *
121
     * @return array
122
     */
123
    public static function getAllInactiveTemplates(PdoDatabase $database, int $domain)
124
    {
125
        $statement = $database->prepare("SELECT * FROM `emailtemplate` WHERE active = 0 AND domain = :domain;");
126
        $statement->execute([':domain' => $domain]);
127
128
        $resultObject = $statement->fetchAll(PDO::FETCH_CLASS, get_called_class());
129
130
        /** @var EmailTemplate $t */
131
        foreach ($resultObject as $t) {
132
            $t->setDatabase($database);
133
        }
134
135
        return $resultObject;
136
    }
137
138
    /**
139
     * @param string      $name
140
     * @param PdoDatabase $database
141
     * @param int         $domain
142
     *
143
     * @return EmailTemplate|false
144
     */
145
    public static function getByName($name, PdoDatabase $database, int $domain)
146
    {
147
        $statement = $database->prepare("SELECT * FROM `emailtemplate` WHERE name = :name AND domain = :domain LIMIT 1;");
148
        $statement->bindValue(":name", $name);
149
        $statement->bindValue(":domain", $domain);
150
151
        $statement->execute();
152
153
        $resultObject = $statement->fetchObject(get_called_class());
154
155
        if ($resultObject != false) {
156
            $resultObject->setDatabase($database);
157
        }
158
159
        return $resultObject;
160
    }
161
162
    /**
163
     * @return EmailTemplate
164
     */
165
    public static function getDroppedTemplate()
166
    {
167
        $t = new EmailTemplate();
168
        $t->id = 0;
169
        $t->active = 1;
170
        $t->defaultaction = self::ACTION_NONE;
171
        $t->name = 'Dropped';
172
173
        return $t;
174
    }
175
176
    /**
177
     * @throws Exception
178
     */
179
    public function save()
180
    {
181
        if ($this->isNew()) {
182
            // insert
183
            $statement = $this->dbObject->prepare(<<<SQL
184
INSERT INTO `emailtemplate` (name, text, jsquestion, defaultaction, active, preloadonly, queue, domain)
185
VALUES (:name, :text, :jsquestion, :defaultaction, :active, :preloadonly, :queue, :domain);
186
SQL
187
            );
188
            $statement->bindValue(":name", $this->name);
189
            $statement->bindValue(":text", $this->text);
190
            $statement->bindValue(":jsquestion", $this->jsquestion);
191
            $statement->bindValue(":defaultaction", $this->defaultaction);
192
            $statement->bindValue(":active", $this->active);
193
            $statement->bindValue(":preloadonly", $this->preloadonly);
194
            $statement->bindValue(":queue", $this->queue);
195
            $statement->bindValue(":domain", $this->domain);
196
197
            if ($statement->execute()) {
198
                $this->id = (int)$this->dbObject->lastInsertId();
199
            }
200
            else {
201
                throw new Exception($statement->errorInfo());
0 ignored issues
show
$statement->errorInfo() of type array is incompatible with the type string expected by parameter $message of Exception::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

201
                throw new Exception(/** @scrutinizer ignore-type */ $statement->errorInfo());
Loading history...
202
            }
203
        }
204
        else {
205
            // update
206
            $statement = $this->dbObject->prepare(<<<SQL
207
UPDATE `emailtemplate`
208
SET name = :name,
209
	text = :text,
210
	jsquestion = :jsquestion,
211
	defaultaction = :defaultaction,
212
	active = :active,
213
	preloadonly = :preloadonly,
214
    queue = :queue,
215
	updateversion = updateversion + 1
216
WHERE id = :id AND updateversion = :updateversion;
217
SQL
218
            );
219
            $statement->bindValue(':id', $this->id);
220
            $statement->bindValue(':updateversion', $this->updateversion);
221
222
            $statement->bindValue(':name', $this->name);
223
            $statement->bindValue(":text", $this->text);
224
            $statement->bindValue(":jsquestion", $this->jsquestion);
225
            $statement->bindValue(":defaultaction", $this->defaultaction);
226
            $statement->bindValue(":active", $this->active);
227
            $statement->bindValue(":preloadonly", $this->preloadonly);
228
            $statement->bindValue(":queue", $this->queue);
229
230
            if (!$statement->execute()) {
231
                throw new Exception($statement->errorInfo());
232
            }
233
234
            if ($statement->rowCount() !== 1) {
235
                throw new OptimisticLockFailedException();
236
            }
237
238
            $this->updateversion++;
239
        }
240
    }
241
242
    /**
243
     * Override delete() from DataObject
244
     */
245
    public function delete()
246
    {
247
        throw new Exception("You shouldn't be doing that, you'll break logs.");
248
    }
249
250
    /**
251
     * @return string
252
     */
253
    public function getName()
254
    {
255
        return $this->name;
256
    }
257
258
    /**
259
     * @param string $name
260
     */
261
    public function setName($name)
262
    {
263
        $this->name = $name;
264
    }
265
266
    /**
267
     * @return string
268
     */
269
    public function getText()
270
    {
271
        return $this->text;
272
    }
273
274
    /**
275
     * @param string $text
276
     */
277
    public function setText($text)
278
    {
279
        $this->text = $text;
280
    }
281
282
    /**
283
     * @return string|null
284
     */
285
    public function getJsquestion()
286
    {
287
        return $this->jsquestion;
288
    }
289
290
    /**
291
     * @param string $jsquestion
292
     */
293
    public function setJsquestion($jsquestion)
294
    {
295
        $this->jsquestion = $jsquestion;
296
    }
297
298
    /**
299
     * @return string
300
     */
301
    public function getDefaultAction()
302
    {
303
        return $this->defaultaction;
304
    }
305
306
    /**
307
     * @param string $defaultAction
308
     */
309
    public function setDefaultAction($defaultAction)
310
    {
311
        $this->defaultaction = $defaultAction;
312
    }
313
314
    /**
315
     * @return bool
316
     */
317
    public function getActive()
318
    {
319
        return $this->active == 1;
320
    }
321
322
    /**
323
     * @param bool $active
324
     */
325
    public function setActive($active)
326
    {
327
        $this->active = $active ? 1 : 0;
328
    }
329
330
    /**
331
     * @return bool
332
     */
333
    public function getPreloadOnly()
334
    {
335
        return $this->preloadonly == 1;
336
    }
337
338
    /**
339
     * @param bool $preloadonly
340
     */
341
    public function setPreloadOnly($preloadonly)
342
    {
343
        $this->preloadonly = $preloadonly ? 1 : 0;
344
    }
345
346
    /**
347
     * @return int|null
348
     */
349
    public function getQueue(): ?int
350
    {
351
        return $this->queue;
352
    }
353
354
    /**
355
     * @return RequestQueue|null
356
     */
357
    public function getQueueObject(): ?RequestQueue
358
    {
359
        if ($this->queue === null) {
360
            return null;
361
        }
362
363
        /** @var $dataObject RequestQueue|false */
364
        $dataObject = RequestQueue::getById($this->queue, $this->getDatabase());
365
366
        if ($dataObject === false) {
0 ignored issues
show
The condition $dataObject === false is always false.
Loading history...
367
            return null;
368
        }
369
370
        return $dataObject;
371
    }
372
373
    /**
374
     * @param int|null $queue
375
     */
376
    public function setQueue(?int $queue): void
377
    {
378
        $this->queue = $queue;
379
    }
380
381
    public function getDomain(): int
382
    {
383
        return $this->domain;
384
    }
385
386
    public function setDomain(int $domain): void
387
    {
388
        $this->domain = $domain;
389
    }
390
}
391