File size: 1,979 Bytes
288c05b | 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 72 73 74 75 76 77 78 79 80 81 82 83 | <?php
namespace App\Exceptions;
use Illuminate\Http\Client\Response;
use RuntimeException;
use Throwable;
class RagApiException extends RuntimeException
{
public function __construct(
string $message = '',
public readonly int $statusCode = 0,
public readonly mixed $data = null,
?Throwable $previous = null,
) {
parent::__construct($message, $statusCode, $previous);
}
public static function fromResponse(Response $response): self
{
$data = self::parseResponseData($response);
return new self(
message: self::messageFromData($data),
statusCode: $response->status(),
data: $data,
);
}
private static function parseResponseData(Response $response): mixed
{
$contentType = $response->header('Content-Type', '');
if (str_contains($contentType, 'application/json')) {
return $response->json();
}
$body = $response->body();
return $body !== '' ? $body : null;
}
private static function messageFromData(mixed $data): string
{
if (is_string($data)) {
return $data;
}
if (! is_array($data)) {
return '';
}
foreach (['message', 'error'] as $key) {
if (isset($data[$key]) && is_string($data[$key])) {
return $data[$key];
}
}
$detail = $data['detail'] ?? null;
if (is_string($detail)) {
return $detail;
}
if (is_array($detail)) {
foreach ($detail as $item) {
if (! is_array($item)) {
continue;
}
foreach (['msg', 'message'] as $key) {
if (isset($item[$key]) && is_string($item[$key])) {
return $item[$key];
}
}
}
}
return '';
}
}
|