# API-Client Framework

Diese Komponente bietet eine einheitliche Schnittstelle für die Kommunikation mit verschiedenen externen APIs.

## Verfügbare API-Clients

### RapidMailClient

Integration mit der RapidMail API für E-Mail-Marketing:

```php
$client = new RapidMailClient(
    ApiConfig::RAPIDMAIL_USERNAME->value,
    ApiConfig::RAPIDMAIL_PASSWORD->value
);

// Abonnent zur Liste hinzufügen
$result = $client->addRecipient('user@example.com', ApiConfig::getRapidmailListId());
```

### ShopifyClient

Integration mit der Shopify REST API für E-Commerce:

```php
$client = new ShopifyClient(
    ApiConfig::SHOPIFY_SHOP_DOMAIN->value,
    ApiConfig::SHOPIFY_ACCESS_TOKEN->value,
    ApiConfig::SHOPIFY_API_VERSION->value
);

// Produkte abrufen
$products = $client->getProducts(['limit' => 50]);

// Einzelnes Produkt abrufen
$product = $client->getProduct(12345678);
```

### GitHubClient

Integration mit der GitHub API:

```php
$client = new GitHubClient('github_personal_access_token');

// Repository-Informationen abrufen
$repo = $client->getRepository('username', 'repo-name');
```

## Implementierung eines neuen API-Clients

Neue API-Clients können einfach durch Verwendung des `ApiRequestTrait` erstellt werden:

```php
use App\Framework\Api\ApiRequestTrait;

final class NewApiClient
{
    use ApiRequestTrait;

    public function __construct(string $apiKey)
    {
        $this->baseUrl = 'https://api.example.com/v1';
        $this->defaultOptions = new ClientOptions(
            auth: AuthConfig::bearer($apiKey)
        );
        $this->httpClient = new CurlHttpClient();
    }

    public function getSomeResource(): array
    {
        $response = $this->sendRequest(
            method: HttpMethod::GET,
            endpoint: 'resources'
        );

        return $this->decodeJson($response);
    }
}
```

## Fehlerbehandlung

Alle API-Clients werfen eine standardisierte `ApiException` bei Fehlern:

```php
try {
    $result = $client->getSomeResource();
} catch (ApiException $e) {
    // Zugriff auf Details des Fehlers
    $statusCode = $e->getCode();
    $message = $e->getMessage();
    $responseData = $e->getResponseData();
}
```
