Deprecated: Constant E_STRICT is deprecated in /home/pastorz/old-espace-client/vendor/symfony/error-handler/ErrorHandler.php on line 58

Deprecated: Constant E_STRICT is deprecated in /home/pastorz/old-espace-client/vendor/symfony/error-handler/ErrorHandler.php on line 76
Symfony Profiler

src/Service/Auctionis/AuctionisService.php line 77

Open in your IDE?
  1. <?php
  2. namespace App\Service\Auctionis;
  3. use App\Model\Auctionis\ErrorApiResponse;
  4. use App\Model\Auctionis\SuccessApiResponse;
  5. use DateTime;
  6. use Psr\Log\LoggerInterface;
  7. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  8. use Symfony\Component\HttpFoundation\Cookie;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\Routing\RouterInterface;
  11. use Symfony\Component\Serializer\SerializerInterface;
  12. use Symfony\Contracts\HttpClient\HttpClientInterface;
  13. use Symfony\Contracts\HttpClient\ResponseInterface;
  14. class AuctionisService
  15. {
  16.     private ?string $jwt;
  17.     public function __construct(
  18.         private RequestStack $requestStack,
  19.         private HttpClientInterface $auctionisClient,
  20.         private LoggerInterface $auctionisLogger,
  21.         private RouterInterface $router,
  22.         private SerializerInterface $serializer,
  23.         private ParameterBagInterface $params
  24.     )
  25.     {
  26.         $this->jwt $requestStack->getCurrentRequest()?->cookies->get('auctionisJwt');
  27.     }
  28.     public function login(): string
  29.     {
  30.         $params = [
  31.             'POST''login_check', [
  32.                 'json' => [
  33.                     'username' => 'bo.npcj',
  34.                     'password' => 'bo.npcj',
  35.                 ]
  36.             ],
  37.         ];
  38.         $response $this->auctionisClient->request(...$params);
  39.         $apiResponse $this->handleResponse($response$params);
  40.         return $apiResponse->getData()['token'];
  41.     }
  42.     public function createTokenCookie(string $token): Cookie
  43.     {
  44.         return Cookie::create('auctionisJwt'$token);
  45.     }
  46.     public function tokenIsExpired(): bool
  47.     {
  48.         if (!$this->jwt) {
  49.             return true;
  50.         }
  51.         return new DateTime() > (new DateTime())->setTimestamp($this->tokenDecode($this->jwt)->exp);
  52.     }
  53.     public function getToken(): ?string
  54.     {
  55.         return $this->jwt;
  56.     }
  57.     private function tokenDecode($token)
  58.     {
  59.         list($header$payload) = explode('.'$token);
  60.         return json_decode(base64_decode($payload));
  61.     }
  62.     public function request(string $methodstring $path, array $body null, array $query nullstring $dto nullstring $errorRedirectRoute 'app_security_login', array $errorRedirectRouteParameters = []): mixed
  63.     {
  64.         if ($this->tokenIsExpired()) {
  65.             $this->jwt null;
  66.         }
  67.         if ($path === 'login_buyer_folder') {
  68.             $this->jwt null;
  69.         }
  70.         if (!$this->jwt) {
  71.             $token $this->login();
  72.             $this->jwt $token;
  73.         }
  74.         $params = [
  75.             $method$path, [
  76.                 'query' => $query,
  77.                 'json' => $body,
  78.                 'headers' => [
  79.                     'Content-Type' => $method === 'PATCH' 'application/merge-patch+json' 'application/json',
  80.                     'Authorization' => sprintf('Bearer %s'$this->jwt),
  81.                 ],
  82.             ],
  83.         ];
  84.         $response $this->auctionisClient->request(...$params);
  85.         $apiResponse $this->handleResponse($response$params);
  86.         if ($apiResponse instanceof ErrorApiResponse) {
  87.             if ($apiResponse->getStatusCode() == 401 && $apiResponse->getMessage() == "JWT Token not found") {
  88.                 $this->requestStack->getSession()->getFlashBag()->add('error''Vous devez être connecté pour accéder à cette page');
  89.             } else {
  90.                 $this->requestStack->getSession()->getFlashBag()->add('error'$apiResponse->getMessage());
  91.             }
  92.         }
  93.         if (empty($apiResponse->getData())) {
  94.             return null;
  95.         }
  96.         $data $apiResponse->getData();
  97.         if (!$dto) {
  98.             return $data ?? $apiResponse;
  99.         }
  100.         if (str_ends_with($dto'[]')) {
  101.             $data $data['hydra:member'];
  102.         }
  103.         return $this->serializer->deserialize(json_encode($data), $dto'json');
  104.     }
  105.     private function handleResponse(ResponseInterface $response, array $params): ErrorApiResponse|SuccessApiResponse
  106.     {
  107.         if ($response->getStatusCode() >= 500) {
  108.             $headers $response->getHeaders(false);
  109.             $debugLink array_key_exists('x-debug-token-link'$headers) ? $headers['x-debug-token-link'][0] : '';
  110.             $this->auctionisLogger->error(sprintf('Auctionis API server error (%s): %s'$debugLink$response->getContent(false)), [
  111.                 'status_code' => $response->getStatusCode(),
  112.                 'response_headers' => $headers,
  113.                 'params' => $params,
  114.             ]);
  115.             $message 'error.server_error';
  116.             if ($this->params->get('env') === 'dev') {
  117.                 $message .= ' - ' $debugLink;
  118.             }
  119.             return new ErrorApiResponse($response->getStatusCode(), message$message);
  120.         }
  121.         if ($response->getStatusCode() >= 400) {
  122.             $headers $response->getHeaders(false);
  123.             $debugLink array_key_exists('x-debug-token-link'$headers) ? $headers['x-debug-token-link'][0] : '';
  124.             // Do not log 401 errors (JWT Token not found / Invalid credentials)
  125.             if ($response->getStatusCode() !== 401) {
  126.                 $this->auctionisLogger->error(sprintf('Auctionis API client error (%s): %s'$debugLink$response->getContent(false)), [
  127.                     'status_code' => $response->getStatusCode(),
  128.                     'response_headers' => $headers,
  129.                     'params' => $params,
  130.                 ]);
  131.             }
  132.             $data $response->toArray(false);
  133.             if (array_key_exists('message'$data)) {
  134.                 $message $data['message'];
  135.             } elseif (array_key_exists('hydra:description'$data)) {
  136.                 $message $data['hydra:description'];
  137.             } else {
  138.                 $message 'error.client_error';
  139.             }
  140.             return new ErrorApiResponse($response->getStatusCode(), $message$data);
  141.         }
  142.         if ($response->getStatusCode() >= 300) {
  143.             return new ErrorApiResponse($response->getStatusCode(), 'error.server_error');
  144.         }
  145.         return new SuccessApiResponse($response->getStatusCode(), 'success'$response->toArray(false));
  146.     }
  147. }