Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
81.48% covered (warning)
81.48%
22 / 27
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
SourceCacheWarmupController
81.48% covered (warning)
81.48%
22 / 27
50.00% covered (danger)
50.00%
1 / 2
8.41
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 readResponse
80.77% covered (warning)
80.77%
21 / 26
0.00% covered (danger)
0.00%
0 / 1
7.35
1<?php
2
3declare(strict_types=1);
4
5namespace BO\Zmscitizenapi\Controllers\Office;
6
7use BO\Zmscitizenapi\BaseController;
8use BO\Zmscitizenapi\Services\Office\OfficesServicesRelationsService;
9use BO\Zmscitizenapi\Utils\ErrorMessages;
10use Psr\Http\Message\RequestInterface;
11use Psr\Http\Message\ResponseInterface;
12
13/**
14 * Proactively refresh the offices-and-services source cache in place (ZMSKVR-1191).
15 */
16class SourceCacheWarmupController extends BaseController
17{
18    private const WARMUP_TOKEN_HEADER = 'X-Source-Cache-Warmup-Token';
19
20    private OfficesServicesRelationsService $service;
21
22    /** @psalm-api */
23    public function __construct()
24    {
25        $this->service = new OfficesServicesRelationsService();
26    }
27
28    #[\Override]
29    public function readResponse(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
30    {
31        $expectedToken = getenv('SOURCE_CACHE_WARMUP_TOKEN');
32        if (!is_string($expectedToken) || $expectedToken === '') {
33            return $this->createJsonResponse(
34                $response,
35                ['errors' => [ErrorMessages::get('notFound')]],
36                ErrorMessages::get('notFound')['statusCode']
37            );
38        }
39
40        $providedToken = $request->getHeaderLine(self::WARMUP_TOKEN_HEADER);
41        if ($providedToken === '' || !hash_equals($expectedToken, $providedToken)) {
42            return $this->createJsonResponse(
43                $response,
44                ['errors' => [ErrorMessages::get('unauthorized')]],
45                ErrorMessages::get('unauthorized')['statusCode']
46            );
47        }
48
49        $warmup = $this->service->warmOfficesAndServicesCache();
50        $result = $warmup['result'];
51
52        if (is_array($result) && isset($result['errors'])) {
53            return $this->createJsonResponse(
54                $response,
55                $result,
56                ErrorMessages::getHighestStatusCode($result['errors'])
57            );
58        }
59
60        return $this->createJsonResponse($response, [
61            'warmed' => true,
62            'refreshedKeys' => $warmup['refreshedKeys'],
63        ], 200);
64    }
65}