mirror of
https://github.com/anikeen-com/id.git
synced 2026-11-06 23:58:35 +00:00
Requests with the user's token threw a bare ResourceException with a message like "… for resource [Anikeen\Id\Resources\Order]" and no error code, while app requests threw ApiException. Both throw ApiException now: status (also getCode()), Anikeen ID's error code and message, isNotFound(), isConflict(), isTemporary(). Failed lists throw CollectionException, now a subclass of ApiException. A request without a response (connection refused, timeout) throws ApiException with status 0 instead of a Guzzle exception. ApiException extends ResourceException, so existing catch blocks keep working. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
2.0 KiB
PHP
74 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace Anikeen\Id\Resources;
|
|
|
|
use Anikeen\Id\Exceptions\ApiException;
|
|
use Anikeen\Id\Exceptions\ConfirmationRequiredException;
|
|
use Anikeen\Id\Result;
|
|
use GuzzleHttp\Exception\GuzzleException;
|
|
use JsonSerializable;
|
|
|
|
#[\AllowDynamicProperties]
|
|
abstract class BaseResource implements JsonSerializable
|
|
{
|
|
public Result $result;
|
|
|
|
/**
|
|
* @throws ApiException the request failed (status, error code; a ResourceException)
|
|
* @throws ConfirmationRequiredException the user has to confirm it on Anikeen ID
|
|
*/
|
|
public function __construct(callable $callable)
|
|
{
|
|
try {
|
|
$this->result = $callable();
|
|
} catch (GuzzleException $e) {
|
|
// no response at all (connection refused, timeout)
|
|
throw ApiException::unreachable($e);
|
|
}
|
|
|
|
if (!$this->result->success()) {
|
|
if (($this->result->data->error ?? null) === 'confirmation_required') {
|
|
throw new ConfirmationRequiredException(
|
|
$this->result->data->message ?? 'The user has to confirm this on Anikeen ID.',
|
|
$this->result->response->getStatusCode(),
|
|
$this->result->data->confirmation_url ?? null,
|
|
);
|
|
}
|
|
|
|
throw ApiException::fromResult($this->result);
|
|
}
|
|
|
|
foreach ($this->result->data as $key => $value) {
|
|
if (!property_exists($this, $key)) {
|
|
$this->{$key} = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the collection of resources as a JSON string.
|
|
*/
|
|
public function jsonSerialize(): array
|
|
{
|
|
return $this->toArray();
|
|
}
|
|
|
|
/**
|
|
* Returns the collection of resources as an array.
|
|
*/
|
|
public function toArray(): array
|
|
{
|
|
return (array)$this->result->data;
|
|
}
|
|
|
|
public function __get(string $name)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
public function __isset(string $name): bool
|
|
{
|
|
return false;
|
|
}
|
|
}
|