Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.91% covered (success)
90.91%
30 / 33
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
HostConnectionChecker
90.91% covered (success)
90.91%
30 / 33
0.00% covered (danger)
0.00%
0 / 2
6.03
0.00% covered (danger)
0.00%
0 / 1
 checkDbConnection
87.50% covered (warning)
87.50%
14 / 16
0.00% covered (danger)
0.00%
0 / 1
2.01
 checkApiConnection
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
4.00
1<?php
2
3declare(strict_types=1);
4
5namespace App\Infrastructure\Host\Service;
6
7use App\Domain\Host\Entity\HostApiConfig;
8use App\Domain\Host\Entity\HostDbConfig;
9use App\Domain\Host\Service\HostConnectionCheckerInterface;
10use PDO;
11use PDOException;
12
13 class HostConnectionChecker implements HostConnectionCheckerInterface
14{
15    public function checkDbConnection(HostDbConfig $config): bool
16    {
17        try {
18            $dsn = sprintf(
19                '%s:host=%s;port=%d;dbname=%s;charset=utf8mb4',
20                $config->getDriver(),
21                $config->getHost(),
22                $config->getPort(),
23                $config->getDbName()
24            );
25
26            // Ustawienie krótkiego timeoutu na potrzeby szybkiego sprawdzania statusów na liście
27            $options = [
28                PDO::ATTR_TIMEOUT => 2,
29                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
30            ];
31
32            $pdo = new PDO($dsn, $config->getUsername(), $config->getPassword(), $options);
33
34            // Wykonujemy trywialne zapytanie aby upewnić się, że połączenie działa
35            $pdo->query('SELECT 1');
36            return true;
37        } catch (PDOException $e) {
38            return false;
39        }
40    }
41
42    public function checkApiConnection(HostApiConfig $config): bool
43    {
44        $url = rtrim($config->getBaseUrl(), '/') . '/api/v1/health';
45
46        $ch = curl_init($url);
47        if ($ch === false) {
48            return false;
49        }
50
51        $timeout = $config->getTimeout() > 0 ? $config->getTimeout() : 2;
52
53        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
54        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
55        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
56        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
57        curl_setopt($ch, CURLOPT_HTTPHEADER, [
58            'Authorization: Bearer ' . $config->getApiToken(),
59            'Accept: application/json',
60        ]);
61
62        curl_exec($ch);
63        $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
64        curl_close($ch);
65
66        return $httpCode >= 200 && $httpCode < 300;
67    }
68}