. */ declare(strict_types=1); namespace App\Services\InfoProviderSystem\Providers; use App\Services\InfoProviderSystem\DTOs\PartDetailDTO; use App\Services\InfoProviderSystem\DTOs\SearchResultDTO; use App\Settings\InfoProviderSystem\ConradSettings; use Symfony\Contracts\HttpClient\HttpClientInterface; readonly class ConradProvider implements InfoProviderInterface { private const SEARCH_ENDPOINT = 'https://api.conrad.de/search/1/v3/facetSearch'; public function __construct(private HttpClientInterface $httpClient, private ConradSettings $settings) { } public function getProviderInfo(): array { return [ 'name' => 'Pollin', 'description' => 'Retrieves part information from conrad.de', 'url' => 'https://www.conrad.de/', 'disabled_help' => 'Set API key in settings', 'settings_class' => ConradSettings::class, ]; } public function getProviderKey(): string { return 'conrad'; } public function isActive(): bool { return !empty($this->settings->apiKey); } public function searchByKeyword(string $keyword): array { $url = self::SEARCH_ENDPOINT . '/' . $this->settings->country . '/' . $this->settings->language . '/' . $this->settings->customerType; $response = $this->httpClient->request('POST', $url, [ 'query' => [ 'apikey' => $this->settings->apiKey, ], 'json' => [ 'query' => $keyword, ], ]); $out = []; $results = $response->toArray(); foreach($results as $result) { $out[] = new SearchResultDTO( provider_key: $this->getProviderKey(), provider_id: $result['productId'], name: $result['title'], description: '', manufacturer: $result['brand']['name'] ?? null, mpn: $result['manufacturerId'] ?? null, preview_image_url: $result['image'] ?? null, ); } return $out; } public function getDetails(string $id): PartDetailDTO { // TODO: Implement getDetails() method. } public function getCapabilities(): array { return [ProviderCapabilities::BASIC, ProviderCapabilities::PICTURE, ProviderCapabilities::PRICE,]; } }