Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
AvailabilityClosureRead
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
1 / 1
 readResponse
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace BO\Zmsapi;
4
5use BO\Slim\Render;
6use BO\Mellon\Validator;
7use BO\Zmsdb\Closure as ClosureQuery;
8use DateTimeImmutable;
9
10class AvailabilityClosureRead extends BaseController
11{
12    #[\Override]
13    public function readResponse(
14        \Psr\Http\Message\RequestInterface $request,
15        \Psr\Http\Message\ResponseInterface $response,
16        array $args
17    ) {
18        (new Helper\User($request))->checkAnyPermission('availability', 'overviewcalendar');
19
20        try {
21            $scopeIdCsv = Validator::param('scopeIds')
22                ->isString()->isMatchOf('/^\d+(,\d+)*$/')->assertValid()->getValue();
23            $scopeIds = array_values(array_unique(array_map('intval', explode(',', $scopeIdCsv))));
24
25            $dateFrom  = Validator::param('dateFrom')->isDate('Y-m-d')->assertValid()->getValue();
26            $dateUntil = Validator::param('dateUntil')->isDate('Y-m-d')->assertValid()->getValue();
27        } catch (\BO\Mellon\Failure\Exception $e) {
28            $payload = ['error' => true, 'message' => $e->getMessage()];
29            return Render::withJson($response->withStatus(400), $payload, 400);
30        }
31
32        $dtFrom  = new DateTimeImmutable($dateFrom);
33        $dtUntil = new DateTimeImmutable($dateUntil);
34        if ($dtFrom > $dtUntil) {
35            $payload = ['error' => true, 'message' => 'dateFrom must be before or equal to dateUntil'];
36            return Render::withJson($response->withStatus(400), $payload, 400);
37        }
38
39        $items = (new ClosureQuery())->readByScopesInRange(
40            $scopeIds,
41            $dtFrom,
42            $dtUntil
43        );
44
45        $msg       = Response\Message::create($request);
46        $msg->data = ['items' => $items];
47
48        $lastModified = (new DateTimeImmutable())->getTimestamp();
49        $response = Render::withLastModified($response, $lastModified, '0');
50
51        return Render::withJson($response, $msg->setUpdatedMetaData(), $msg->getStatuscode());
52    }
53}