aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi/Routes/MassMail/MassMailMessagesIndex.php
blob: 46f2c982df8cf1d02848fdc6d73cfcd883a6d55d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php

namespace JsonApi\Routes\MassMail;

use JsonApi\Errors\AuthorizationFailedException;
use MassMail\MassMailMessage;
use MassMail\MassMailPermission;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use JsonApi\JsonApiController;

class MassMailMessagesIndex extends JsonApiController
{
    protected $allowedPagingParameters = ['offset', 'limit'];
    protected $allowedFilteringParameters = ['templates', 'queued', 'protected', 'locked', 'sent'];
    protected $allowedIncludePaths = ['author', 'sender', 'filters'];

    public function __invoke(Request $request, Response $response, $args)
    {
        if (!Authority::canIndexMassMailMessages($this->getUser($request))) {
            throw new AuthorizationFailedException();
        }

        $filters = $this->getContextFilters();

        [$offset, $limit] = $this->getOffsetAndLimit();

        $sql = "`is_template` = :template AND `locked` = :locked AND `sent` = :sent ".
            "ORDER BY `chdate` DESC";
        $parameters = [
            'template' => $filters['templates'] ? 1 : 0,
            'locked' => $filters['locked'] ? 1 : 0,
            'sent' => $filters['sent'] ? 1 : 0
        ];

        if ($filters['protected']) {
            $sql = "`protected` = :protected AND " . $sql;
            $parameters['protected'] = 1;
        }

        if (!MassMailPermission::has($this->getUser($request)->id, true) || $filters['templates']) {
            $sql = "`author_id` = :author AND " . $sql;
            $parameters['author'] = $this->getUser($request)->id;
        }

        $total = MassMailMessage::countBySQL($sql, $parameters);
        $messages = MassMailMessage::findBySQL(
            $sql . " LIMIT :limit OFFSET :offset",
            array_merge(
                $parameters,
                ['limit' => $limit,'offset' => $offset]
            ));

        return $this->getPaginatedContentResponse($messages, $total);
    }

    private function getContextFilters()
    {
        $defaults = [
            'templates' => false,
            'queued' => false,
            'protected' => false,
            'locked' => false,
            'sent' => false
        ];

        $filtering = $this->getQueryParameters()->getFilteringParameters() ?: [];

        return array_merge($defaults, $filtering);
    }
}