mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2025-12-06 11:09:29 +00:00
Try to show an more detailed error message, if digikey needs oauth reconnection
This commit is contained in:
parent
43601e060c
commit
70354c8599
4 changed files with 87 additions and 8 deletions
|
|
@ -25,6 +25,7 @@ namespace App\Controller;
|
||||||
|
|
||||||
use App\Entity\Parts\Manufacturer;
|
use App\Entity\Parts\Manufacturer;
|
||||||
use App\Entity\Parts\Part;
|
use App\Entity\Parts\Part;
|
||||||
|
use App\Exceptions\OAuthReconnectRequiredException;
|
||||||
use App\Form\InfoProviderSystem\PartSearchType;
|
use App\Form\InfoProviderSystem\PartSearchType;
|
||||||
use App\Services\InfoProviderSystem\ExistingPartFinder;
|
use App\Services\InfoProviderSystem\ExistingPartFinder;
|
||||||
use App\Services\InfoProviderSystem\PartInfoRetriever;
|
use App\Services\InfoProviderSystem\PartInfoRetriever;
|
||||||
|
|
@ -175,8 +176,11 @@ class InfoProviderController extends AbstractController
|
||||||
$this->addFlash('error',$e->getMessage());
|
$this->addFlash('error',$e->getMessage());
|
||||||
//Log the exception
|
//Log the exception
|
||||||
$exceptionLogger->error('Error during info provider search: ' . $e->getMessage(), ['exception' => $e]);
|
$exceptionLogger->error('Error during info provider search: ' . $e->getMessage(), ['exception' => $e]);
|
||||||
|
} catch (OAuthReconnectRequiredException $e) {
|
||||||
|
$this->addFlash('error', t('info_providers.search.error.oauth_reconnect', ['%provider%' => $e->getProviderName()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// modify the array to an array of arrays that has a field for a matching local Part
|
// modify the array to an array of arrays that has a field for a matching local Part
|
||||||
// the advantage to use that format even when we don't look for local parts is that we
|
// the advantage to use that format even when we don't look for local parts is that we
|
||||||
// always work with the same interface
|
// always work with the same interface
|
||||||
|
|
|
||||||
48
src/Exceptions/OAuthReconnectRequiredException.php
Normal file
48
src/Exceptions/OAuthReconnectRequiredException.php
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2025 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
|
||||||
|
namespace App\Exceptions;
|
||||||
|
|
||||||
|
use Throwable;
|
||||||
|
|
||||||
|
class OAuthReconnectRequiredException extends \RuntimeException
|
||||||
|
{
|
||||||
|
private string $providerName;
|
||||||
|
|
||||||
|
public function __construct(string $message = "You need to reconnect the OAuth connection for this provider!", int $code = 0, ?Throwable $previous = null)
|
||||||
|
{
|
||||||
|
parent::__construct($message, $code, $previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function forProvider(string $providerName): self
|
||||||
|
{
|
||||||
|
$exception = new self("You need to reconnect the OAuth connection for the provider '$providerName'!");
|
||||||
|
$exception->providerName = $providerName;
|
||||||
|
return $exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getProviderName(): string
|
||||||
|
{
|
||||||
|
return $this->providerName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -24,6 +24,7 @@ declare(strict_types=1);
|
||||||
namespace App\Services\InfoProviderSystem\Providers;
|
namespace App\Services\InfoProviderSystem\Providers;
|
||||||
|
|
||||||
use App\Entity\Parts\ManufacturingStatus;
|
use App\Entity\Parts\ManufacturingStatus;
|
||||||
|
use App\Exceptions\OAuthReconnectRequiredException;
|
||||||
use App\Services\InfoProviderSystem\DTOs\FileDTO;
|
use App\Services\InfoProviderSystem\DTOs\FileDTO;
|
||||||
use App\Services\InfoProviderSystem\DTOs\ParameterDTO;
|
use App\Services\InfoProviderSystem\DTOs\ParameterDTO;
|
||||||
use App\Services\InfoProviderSystem\DTOs\PartDetailDTO;
|
use App\Services\InfoProviderSystem\DTOs\PartDetailDTO;
|
||||||
|
|
@ -117,12 +118,22 @@ class DigikeyProvider implements InfoProviderInterface
|
||||||
];
|
];
|
||||||
|
|
||||||
//$response = $this->digikeyClient->request('POST', '/Search/v3/Products/Keyword', [
|
//$response = $this->digikeyClient->request('POST', '/Search/v3/Products/Keyword', [
|
||||||
|
try {
|
||||||
$response = $this->digikeyClient->request('POST', '/products/v4/search/keyword', [
|
$response = $this->digikeyClient->request('POST', '/products/v4/search/keyword', [
|
||||||
'json' => $request,
|
'json' => $request,
|
||||||
'auth_bearer' => $this->authTokenManager->getAlwaysValidTokenString(self::OAUTH_APP_NAME)
|
'auth_bearer' => $this->authTokenManager->getAlwaysValidTokenString(self::OAUTH_APP_NAME)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$response_array = $response->toArray();
|
$response_array = $response->toArray();
|
||||||
|
} catch (\InvalidArgumentException $exception) {
|
||||||
|
//Check if the exception was caused by an invalid or expired token
|
||||||
|
if (str_contains($exception->getMessage(), 'access_token')) {
|
||||||
|
throw OAuthReconnectRequiredException::forProvider($this->getProviderKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
@ -150,9 +161,18 @@ class DigikeyProvider implements InfoProviderInterface
|
||||||
|
|
||||||
public function getDetails(string $id): PartDetailDTO
|
public function getDetails(string $id): PartDetailDTO
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
$response = $this->digikeyClient->request('GET', '/products/v4/search/' . urlencode($id) . '/productdetails', [
|
$response = $this->digikeyClient->request('GET', '/products/v4/search/' . urlencode($id) . '/productdetails', [
|
||||||
'auth_bearer' => $this->authTokenManager->getAlwaysValidTokenString(self::OAUTH_APP_NAME)
|
'auth_bearer' => $this->authTokenManager->getAlwaysValidTokenString(self::OAUTH_APP_NAME)
|
||||||
]);
|
]);
|
||||||
|
} catch (\InvalidArgumentException $exception) {
|
||||||
|
//Check if the exception was caused by an invalid or expired token
|
||||||
|
if (str_contains($exception->getMessage(), 'access_token')) {
|
||||||
|
throw OAuthReconnectRequiredException::forProvider($this->getProviderKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
|
||||||
$response_array = $response->toArray();
|
$response_array = $response->toArray();
|
||||||
$product = $response_array['Product'];
|
$product = $response_array['Product'];
|
||||||
|
|
|
||||||
|
|
@ -14244,5 +14244,12 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
||||||
<target>If checked, the part tables for categories, footprints, etc. should include all parts of child categories. If not checked, only parts that strictly belong to the clicked node are shown.</target>
|
<target>If checked, the part tables for categories, footprints, etc. should include all parts of child categories. If not checked, only parts that strictly belong to the clicked node are shown.</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Gdlnmav" name="info_providers.search.error.oauth_reconnect">
|
||||||
|
<segment>
|
||||||
|
<source>info_providers.search.error.oauth_reconnect</source>
|
||||||
|
<target>You need to reconnect OAuth for following providers: %provider%
|
||||||
|
You can do this in the provider info list.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue