diff --git a/.docker/symfony.conf b/.docker/symfony.conf index 0629d12c..a6b8d7a9 100644 --- a/.docker/symfony.conf +++ b/.docker/symfony.conf @@ -36,6 +36,10 @@ PassEnv SAML_ENABLED SAML_ROLE_MAPPING SAML_UPDATE_GROUP_ON_LOGIN SAML_IDP_ENTITY_ID SAML_IDP_SINGLE_SIGN_ON_SERVICE SAML_IDP_SINGLE_LOGOUT_SERVICE SAML_IDP_X509_CERT SAML_SP_ENTITY_ID SAML_SP_X509_CERT SAMLP_SP_PRIVATE_KEY PassEnv TABLE_DEFAULT_PAGE_SIZE + PassEnv PROVIDER_DIGIKEY_CLIENT_ID PROVIDER_DIGIKEY_SECRET PROVIDER_DIGIKEY_CURRENCY PROVIDER_DIGIKEY_LANGUAGE PROVIDER_DIGIKEY_COUNTRY + PassEnv PROVIDER_ELEMENT14_KEY PROVIDER_ELEMENT14_STORE_ID + PassEnv PROVIDER_TME_KEY PROVIDER_TME_SECRET PROVIDER_TME_CURRENCY PROVIDER_TME_LANGUAGE PROVIDER_TME_COUNTRY PROVIDER_TME_GET_GROSS_PRICES + # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the diff --git a/.env b/.env index ede0dd4b..d1a42993 100644 --- a/.env +++ b/.env @@ -91,6 +91,41 @@ ERROR_PAGE_SHOW_HELP=1 # The default page size for the part table (set to -1 to show all parts on one page) TABLE_DEFAULT_PAGE_SIZE=50 +################################################################################## +# Info provider settings +################################################################################## + +# Digikey Provider: +# You can get your client id and secret from https://developer.digikey.com/ +PROVIDER_DIGIKEY_CLIENT_ID= +PROVIDER_DIGIKEY_SECRET= +# The currency to get prices in +PROVIDER_DIGIKEY_CURRENCY=EUR +# The language to get results in (en, de, fr, it, es, zh, ja, ko) +PROVIDER_DIGIKEY_LANGUAGE=en +# The country to get results for +PROVIDER_DIGIKEY_COUNTRY=DE + +# Farnell Provider: +# You can get your API key from https://partner.element14.com/ +PROVIDER_ELEMENT14_KEY= +# Configure the store domain you want to use. This decides the language and currency of results. You can get a list of available stores from https://partner.element14.com/docs/Product_Search_API_REST__Description +PROVIDER_ELEMENT14_STORE_ID=de.farnell.com + +# TME Provider: +# You can get your API key from https://developers.tme.eu/en/ +PROVIDER_TME_KEY= +PROVIDER_TME_SECRET= +# The currency to get prices in +PROVIDER_TME_CURRENCY=EUR +# The language to get results in (en, de, pl) +PROVIDER_TME_LANGUAGE=en +# The country to get results for +PROVIDER_TME_COUNTRY=DE +# Set this to 1 to get gross prices (including VAT) instead of net prices +PROVIDER_TME_GET_GROSS_PRICES=1 + + ################################################################################### # SAML Single sign on-settings ################################################################################### diff --git a/config/services.yaml b/config/services.yaml index a026f63d..d8be9967 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -246,17 +246,27 @@ services: App\Services\InfoProviderSystem\Providers\Element14Provider: arguments: - $api_key: '%env(PROVIDER_ELEMENT14_KEY)%' + $api_key: '%env(string:PROVIDER_ELEMENT14_KEY)%' + $store_id: '%env(string:PROVIDER_ELEMENT14_STORE_ID)%' App\Services\InfoProviderSystem\Providers\DigikeyProvider: arguments: - $clientId: '%env(PROVIDER_DIGIKEY_CLIENT_ID)%' - $currency: '%partdb.default_currency%' + $clientId: '%env(string:PROVIDER_DIGIKEY_CLIENT_ID)%' + $currency: '%env(string:PROVIDER_DIGIKEY_CURRENCY)%' + $language: '%env(string:PROVIDER_DIGIKEY_LANGUAGE)%' + $country: '%env(string:PROVIDER_DIGIKEY_COUNTRY)%' App\Services\InfoProviderSystem\Providers\TMEClient: arguments: - $secret: '%env(PROVIDER_TME_SECRET)%' - $token: '%env(PROVIDER_TME_KEY)%' + $secret: '%env(string:PROVIDER_TME_SECRET)%' + $token: '%env(string:PROVIDER_TME_KEY)%' + + App\Services\InfoProviderSystem\Providers\TMEProvider: + arguments: + $currency: '%env(string:PROVIDER_TME_CURRENCY)%' + $country: '%env(string:PROVIDER_TME_COUNTRY)%' + $language: '%env(string:PROVIDER_TME_LANGUAGE)%' + $get_gross_prices: '%env(bool:PROVIDER_TME_GET_GROSS_PRICES)%' #################################################################################################################### # Symfony overrides diff --git a/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php b/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php index b1196fc7..f85db0aa 100644 --- a/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php +++ b/src/Services/InfoProviderSystem/Providers/DigikeyProvider.php @@ -46,15 +46,17 @@ class DigikeyProvider implements InfoProviderInterface private readonly HttpClientInterface $digikeyClient; - public function __construct(HttpClientInterface $httpClient, private readonly OAuthTokenManager $authTokenManager, private readonly string $currency, private readonly string $clientId) + public function __construct(HttpClientInterface $httpClient, private readonly OAuthTokenManager $authTokenManager, + private readonly string $currency, private readonly string $clientId, + private readonly string $language, private readonly string $country) { //Create the HTTP client with some default options $this->digikeyClient = $httpClient->withOptions([ "base_uri" => self::BASE_URI, "headers" => [ "X-DIGIKEY-Client-Id" => $clientId, - "X-DIGIKEY-Locale-Site" => 'DE', - "X-DIGIKEY-Locale-Language" => 'de', + "X-DIGIKEY-Locale-Site" => $this->country, + "X-DIGIKEY-Locale-Language" => $this->language, "X-DIGIKEY-Locale-Currency" => $this->currency, "X-DIGIKEY-Customer-Id" => 0, ] @@ -68,6 +70,7 @@ class DigikeyProvider implements InfoProviderInterface 'description' => 'This provider uses the DigiKey API to search for parts.', 'url' => 'https://www.digikey.com/', 'oauth_app_name' => self::OAUTH_APP_NAME, + 'disabled_help' => 'Set the PROVIDER_DIGIKEY_CLIENT_ID and PROVIDER_DIGIKEY_SECRET env option and connect OAuth to enable.' ]; } diff --git a/src/Services/InfoProviderSystem/Providers/Element14Provider.php b/src/Services/InfoProviderSystem/Providers/Element14Provider.php index b1954c51..d4383680 100644 --- a/src/Services/InfoProviderSystem/Providers/Element14Provider.php +++ b/src/Services/InfoProviderSystem/Providers/Element14Provider.php @@ -37,7 +37,6 @@ class Element14Provider implements InfoProviderInterface { private const ENDPOINT_URL = 'https://api.element14.com/catalog/products'; - private const FARNELL_STORE_ID = 'de.farnell.com'; private const API_VERSION_NUMBER = '1.2'; private const NUMBER_OF_RESULTS = 20; @@ -46,7 +45,7 @@ class Element14Provider implements InfoProviderInterface private const COMPLIANCE_ATTRIBUTES = ['euEccn', 'hazardous', 'MSL', 'productTraceability', 'rohsCompliant', 'rohsPhthalatesCompliant', 'SVHC', 'tariffCode', 'usEccn', 'hazardCode']; - public function __construct(private readonly HttpClientInterface $element14Client, private readonly string $api_key) + public function __construct(private readonly HttpClientInterface $element14Client, private readonly string $api_key, private readonly string $store_id) { } @@ -57,6 +56,7 @@ class Element14Provider implements InfoProviderInterface 'name' => 'Farnell element14', 'description' => 'This provider uses the Farnell element14 API to search for parts.', 'url' => 'https://www.element14.com/', + 'disabled_help' => 'Configure the API key in the PROVIDER_ELEMENT14_KEY environment variable to enable.' ]; } @@ -79,7 +79,7 @@ class Element14Provider implements InfoProviderInterface $response = $this->element14Client->request('GET', self::ENDPOINT_URL, [ 'query' => [ 'term' => $term, - 'storeInfo.id' => self::FARNELL_STORE_ID, + 'storeInfo.id' => $this->store_id, 'resultsSettings.offset' => 0, 'resultsSettings.numberOfResults' => self::NUMBER_OF_RESULTS, 'resultsSettings.responseGroup' => 'large', @@ -121,7 +121,7 @@ class Element14Provider implements InfoProviderInterface private function generateProductURL($sku): string { - return 'https://' . self::FARNELL_STORE_ID . '/' . $sku; + return 'https://' . $this->store_id . '/' . $sku; } /** @@ -154,7 +154,7 @@ class Element14Provider implements InfoProviderInterface $locale = 'en_US'; } - return 'https://' . self::FARNELL_STORE_ID . '/productimages/standard/' . $locale . $image['baseName']; + return 'https://' . $this->store_id . '/productimages/standard/' . $locale . $image['baseName']; } /** @@ -189,7 +189,7 @@ class Element14Provider implements InfoProviderInterface public function getUsedCurrency(): string { //Decide based on the shop ID - return match (self::FARNELL_STORE_ID) { + return match ($this->store_id) { 'bg.farnell.com' => 'EUR', 'cz.farnell.com' => 'CZK', 'dk.farnell.com' => 'DKK', @@ -237,7 +237,7 @@ class Element14Provider implements InfoProviderInterface 'tw.element14.com' => 'TWD', 'kr.element14.com' => 'KRW', 'vn.element14.com' => 'VND', - default => throw new \RuntimeException('Unknown store ID: ' . self::FARNELL_STORE_ID) + default => throw new \RuntimeException('Unknown store ID: ' . $this->store_id) }; } diff --git a/src/Services/InfoProviderSystem/Providers/TMEProvider.php b/src/Services/InfoProviderSystem/Providers/TMEProvider.php index 1540e82a..213f1bbc 100644 --- a/src/Services/InfoProviderSystem/Providers/TMEProvider.php +++ b/src/Services/InfoProviderSystem/Providers/TMEProvider.php @@ -38,15 +38,10 @@ class TMEProvider implements InfoProviderInterface private const VENDOR_NAME = 'TME'; - private string $country = 'DE'; - private string $language = 'en'; - private string $currency = 'EUR'; - /** - * @var bool If true, the prices are gross prices. If false, the prices are net prices. - */ - private bool $get_gross_prices = true; - - public function __construct(private readonly TMEClient $tmeClient) + public function __construct(private readonly TMEClient $tmeClient, private readonly string $country, + private readonly string $language, private readonly string $currency, + /** @var bool If true, the prices are gross prices. If false, the prices are net prices. */ + private readonly string $get_gross_prices) { } @@ -57,6 +52,7 @@ class TMEProvider implements InfoProviderInterface 'name' => 'TME', 'description' => 'This provider uses the API of TME (Transfer Multipart).', 'url' => 'https://tme.eu/', + 'disabled_help' => 'Configure the PROVIDER_TME_KEY and PROVIDER_TME_SECRET environment variables to use this provider.' ]; }