Passed
Push — master ( 44ac55...cf05d8 )
by Teye
02:01 queued 35s
created

ApiException::getRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 1
c 1
b 0
f 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Level23\Dynadot\Exception;
6
7
use Exception;
8
use Psr\Http\Message\RequestInterface;
9
use Psr\Http\Message\ResponseInterface;
10
use Throwable;
11
12
class ApiException extends Exception
13
{
14
    private RequestInterface $request;
15
    private ?ResponseInterface $response;
16
17 24
    public function __construct(
18
        string $message,
19
        int $code,
20
        RequestInterface $request,
21
        ?ResponseInterface $response = null,
22
        ?Throwable $previous = null
23
    ) {
24 24
        parent::__construct($message, $code, $previous);
25 24
        $this->request  = $request;
26 24
        $this->response = $response;
27
    }
28
29
    public function getRequest(): RequestInterface
30
    {
31
        return $this->request;
32
    }
33
34
    public function getResponse(): ?ResponseInterface
35
    {
36
        return $this->response;
37
    }
38
39
    /**
40
     * HTTP status code from the response, if available.
41
     */
42
    public function getStatusCode(): ?int
43
    {
44
        return $this->response?->getStatusCode();
45
    }
46
47
    /**
48
     * Raw response body as string, if available.
49
     */
50
    public function getRawBody(): ?string
51
    {
52
        return $this->response ? (string) $this->response->getBody() : null;
53
    }
54
55
    /**
56
     * Helper to build the right subclass from a 4xx/5xx response.
57
     */
58 24
    public static function fromResponse(
59
        RequestInterface $req,
60
        ResponseInterface $res,
61
        ?Throwable $prev = null
62
    ): self {
63 24
        $body = (string) $res->getBody();
64 24
        $data = json_decode($body, true);
65 24
        $code = $data['code'] ?? $res->getStatusCode();
66
67 24
        if (json_last_error() !== JSON_ERROR_NONE) {
68 8
            $msg = 'Invalid JSON in error response: ' . json_last_error_msg();
69
        } else {
70 16
            $msg = $data['error']['description'] ?? $data['message'] ?? $res->getReasonPhrase();
71
        }
72
73
        switch ($code) {
74 24
            case 400:
75 17
                return new ValidationException($msg, $code, $req, $res, $prev);
76 7
            case 401:
77 6
            case 403:
78 1
                return new AuthenticationException($msg, $code, $req, $res, $prev);
79 6
            case 404:
80 5
                return new NotFoundException($msg, $code, $req, $res, $prev);
81
            default:
82 1
                return new self($msg, $code, $req, $res, $prev);
83
        }
84
    }
85
}
86