Commit eed8289d authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Appel du WS d'import : meilleure gestion des erreurs rencontées lors de l'appel au WS

parent e71091c5
Loading
Loading
Loading
Loading
Loading
+95 −29
Original line number Diff line number Diff line
@@ -2,11 +2,16 @@

namespace Import\Service;

use DateTime;
use Doctrine\ORM\EntityManager;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Exception\ServerException;
use GuzzleHttp\Psr7;
use UnicaenApp\Exception\RuntimeException;
use Zend\Http\Response;
use DateTime;
use UnicaenApp\Exception;

/**
 * FetcherService est un service dédié à la récupération des données provenant du Web Service fournit par chaque
@@ -26,6 +31,7 @@ class FetcherService

    /**
     * $entityManager et $config sont fournis par la factory et permettent l'acces à la BD et à la config
     *
     * @var EntityManager $entityManager
     * @var array         $config
     */
@@ -33,7 +39,9 @@ class FetcherService
    protected $config;

    /**
     * les quatres variables $url, $code, $user et $password sont des données de configuration pour l'acces au Web Service
     * les quatres variables $url, $code, $user et $password sont des données de configuration pour l'acces au Web
     * Service
     *
     * @var string         $url      : le chemin d'acces au web service
     * @var string         $code     : le code de l'établissement
     * @var string         $user     : l'identifiant pour l'authentification
@@ -51,6 +59,7 @@ class FetcherService

    /**
     * Constructor ...
     *
     * @param EntityManager $entityManager
     * @param array         $config
     */
@@ -65,50 +74,78 @@ class FetcherService
    /**
     * Accessors ...
     */
    public function getEntityManager()    {
    public function getEntityManager()
    {
        return $this->entityManager;
    }
    public function setEntityManager(EntityManager $entityManager) {

    public function setEntityManager(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    public function getUrl() {

    public function getUrl()
    {
        return $this->url;
    }
    public function setUrl($url)     {

    public function setUrl($url)
    {
        $this->url = $url;
    }
    public function getUser()     {

    public function getUser()
    {
        return $this->user;
    }
    public function setUser($user)     {

    public function setUser($user)
    {
        $this->user = $user;
    }
    public function getPassword()     {

    public function getPassword()
    {
        return $this->password;
    }
    public function setPassword($password)    {

    public function setPassword($password)
    {
        $this->password = $password;
    }
    public function getCode()    {

    public function getCode()
    {
        return $this->code;
    }
    public function setCode($code)    {

    public function setCode($code)
    {
        $this->code = $code;
    }
    public function getProxy()      {

    public function getProxy()
    {
        return $this->proxy;
    }
    public function setProxy($proxy)    {

    public function setProxy($proxy)
    {
        $this->proxy = $proxy;
    }
    public function getVerify()     {

    public function getVerify()
    {
        return $this->verify;
    }
    public function setVerify($verify)   {

    public function setVerify($verify)
    {
        $this->verify = $verify;
    }

    /** Cette fonction retourne la position d'un extablissement dans la table des établissements (voir config)
     *
     * @param string $etablissement
     * @return int
     * @throws \Exception;
@@ -124,12 +161,14 @@ class FetcherService
        }
        if ($position === -1) {
            print "<span style='background-color:salmon;'> L'établissement [" . $etablissement . "] n'a pas pu être trouvée.</span><br/>";
            throw new Exception\RuntimeException("L'établissement [" . $etablissement . "] n'a pas pu être trouvée.");
            throw new RuntimeException("L'établissement [" . $etablissement . "] n'a pas pu être trouvée.");
        }

        return $position;
    }

    public function setConfigWithPosition($positionEtablissement) {
    public function setConfigWithPosition($positionEtablissement)
    {
        $this->code = $this->config['import-api']['etablissements'][$positionEtablissement]['code'];
        $this->url = $this->config['import-api']['etablissements'][$positionEtablissement]['url'];
        $this->proxy = $this->config['import-api']['etablissements'][$positionEtablissement]['proxy'];
@@ -167,26 +206,40 @@ class FetcherService
            $options['verify'] = $this->verify;
        }

        try {
        $client = new Client($options);
        try {
            $response = $client->request('GET', $uri);
        } catch (\Exception $e) {
            $response = new Response();
            $response->setStatusCode(500);
            $response->setReasonPhrase($e->getCode()." - ".$e->getMessage());
            throw $e;
        } catch (ClientException $e) {
            throw new RuntimeException("Erreur ClientException rencontrée lors de l'envoi de la requête au WS", null, $e);
        } catch (ServerException $e) {
            $message = "Erreur distante rencontrée par le serveur du WS";
            $previous = null;
            if ($e->hasResponse()) {
                $previous = new RuntimeException($e->getResponse()->getBody());
            }
            throw new RuntimeException($message, null, $previous);
        } catch (RequestException $e) {
            $message = "Erreur réseau rencontrée lors de l'envoi de la requête au WS";
            if ($e->hasResponse()) {
                $message .= " : " . Psr7\str($e->getResponse());
            }
//        var_dump($response);
            throw new RuntimeException($message, null, $e);
        } catch (GuzzleException $e) {
            throw new RuntimeException("Erreur inattendue rencontrée lors de l'envoi de la requête au WS", null, $e);
        }

        return $response;
    }

    /**
     * Fonction de mise en forme des données typées pour les requêtes Oracle
     *
     * @param mixed  $value : la value à formater
     * @param string $type  : le type de la donnée à formater
     * @return string la donnée formatée
     *
     * RMQ si un format n'est pas prévu par le traitement la valeur est retournée sans traitement et un message est affiché
     * RMQ si un format n'est pas prévu par le traitement la valeur est retournée sans traitement et un message est
     * affiché
     */
    protected function prepValue($value, $type)
    {
@@ -206,23 +259,28 @@ class FetcherService
                $nvalue = $value;
                break;
        }

        return $nvalue;
    }

    protected function prepString($value)
    {
        return ("'" . str_replace("'", "''", $value) . "'");
    }

    protected function prepDate($value)
    {
        if ($value === null) {
            return "null";
        }
        $date = explode(' ', $value->{'date'})[0];

        return "to_date('" . $date . "','YYYY-MM-DD')";
    }

    /**
     * Fonction écrivant dans la table des logs API_LOGS
     *
     * @param DateTime $start_date : date de début du traitement
     * @param DateTime $end_date   : date de fin (avec succés ou échec) du traitement
     * @param string   $route      : la route du traitement
@@ -258,10 +316,12 @@ class FetcherService

    /**
     * Fonction en charge de l'affichage des metadonnées associées à une entity
     *
     * @param string $dataName    : le nom de l'entité
     * @param string $entityClass : le chemin vers l'entité (namespace)
     */
    public function displayMetadata($dataName, $entityClass) {
    public function displayMetadata($dataName, $entityClass)
    {
        $metadata = $this->entityManager->getClassMetadata($entityClass);
        $tableName = $metadata->table['name'];
        $tableRelation = $metadata->columnNames;
@@ -276,6 +336,7 @@ class FetcherService

    /**
     * Mise sous forme de table des données appartenant à une entité
     *
     * @param mixed $entity_json : le json associé à une entité
     * @param mixed metadata : les metadonnées associées à lentité
     * @return array les données mises sous forme d'un tableau
@@ -301,11 +362,13 @@ class FetcherService
            else $value = $entity_json->{$propriete};
            $valuesArray[] = $this->prepValue($value, $type);
        }

        return $valuesArray;
    }

    /**
     * Fonction en charge de préparer et d'appelé fetchOne ou fetchAll
     *
     * @param string $dataName
     * @param string $entityClass
     * @param mixed  $source_code
@@ -320,6 +383,7 @@ class FetcherService
        } else {
            $logs = $this->fetchAll($dataName, $entityClass, 0);
        }

        return $logs;

    }
@@ -327,7 +391,8 @@ class FetcherService
    /**
     * @throws \Doctrine\DBAL\DBALException
     */
    public function updateBDD() {
    public function updateBDD()
    {
        $this->entityManager->getConnection()->executeQuery("begin APP_IMPORT.SYNCHRONISATION(); end;");
    }

@@ -390,6 +455,7 @@ class FetcherService
        }
        $_fin = microtime(true);
        if ($debug_level > 0) print "<p><span style='background-color:lightgreen;'> ExecQueries: " . ($_fin - $_debut) . " secondes.</span></p>";

        return $this->doLog($start_date, new DateTime(), $this->url . "/" . $dataName . "/" . $sourceCode, "OK", "Récupération de " . $dataName . ":" . $sourceCode . " de [" . $this->code . "] en " . ($_fin - $debut) . " seconde(s).");
    }