CAPS04-FE-REFACTOR / app /Exceptions /RagApiException.php
wepee's picture
revise: change consume api to laravel, full ui on resources dir
288c05b
Raw
History Blame Contribute Delete
1.98 kB
<?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 '';
}
}