Browse Source

add error management for each api based viewhelper

Olivier Massot 5 years ago
parent
commit
faede57e19

+ 18 - 3
ot_templating/Classes/ViewHelpers/Donors/GetAllViewHelper.php

@@ -5,6 +5,9 @@ namespace Opentalent\OtTemplating\ViewHelpers\Donors;
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\DonorRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -20,8 +23,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetAllViewHelper extends AbstractViewHelper {
+class GetAllViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
     /**
      * >> Required to prevent typo3 to escape the html output
@@ -71,6 +75,7 @@ class GetAllViewHelper extends AbstractViewHelper {
      */
     public function render()
     {
+
         // Get current settings
         $as = $this->arguments['as'];
         $organizationId = $this->arguments['organizationId'];
@@ -78,10 +83,20 @@ class GetAllViewHelper extends AbstractViewHelper {
 
         if ($fromParents) {
             // Get the donors of the parent structures
-            $donors = $this->donorRepository->findParentsByOrganizationId($organizationId);
+            try {
+                $donors = $this->donorRepository->findParentsByOrganizationId($organizationId);
+            } catch (ApiRequestException $e) {
+                $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+                $donors = [];
+            }
         } else {
             // Get donors of the structure
-            $donors = $this->donorRepository->findByOrganizationId($organizationId);
+            try {
+                $donors = $this->donorRepository->findByOrganizationId($organizationId);
+            } catch (ApiRequestException $e) {
+                $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+                $donors = [];
+            }
         }
 
         $variables = [$as => $donors];

+ 10 - 2
ot_templating/Classes/ViewHelpers/Events/GetAllViewHelper.php

@@ -5,6 +5,8 @@ namespace Opentalent\OtTemplating\ViewHelpers\Events;
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\EventRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -20,8 +22,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetAllViewHelper extends AbstractViewHelper {
+class GetAllViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -98,7 +101,12 @@ class GetAllViewHelper extends AbstractViewHelper {
             $searchParams['children'] = '1';
         }
 
-        $events = $this->eventRepository->searchBy($organizationId, $searchParams);
+        try {
+            $events = $this->eventRepository->searchBy($organizationId, $searchParams);
+        } catch (ApiRequestException $e) {
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+            $events = [];
+        }
         $variables = [$as => $events];
         return $this->renderChildrenWithVariables($variables);
     }

+ 13 - 2
ot_templating/Classes/ViewHelpers/Events/GetByIdViewHelper.php

@@ -3,8 +3,11 @@
 namespace Opentalent\OtTemplating\ViewHelpers\Events;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
+use Opentalent\OtTemplating\Domain\Model\Event;
 use Opentalent\OtTemplating\Domain\Repository\EventRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -19,8 +22,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetByIdViewHelper extends AbstractViewHelper {
+class GetByIdViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -66,7 +70,14 @@ class GetByIdViewHelper extends AbstractViewHelper {
         $as = $this->arguments['as'];
         $eventId = $this->arguments['eventId'];
 
-        $event = $this->eventRepository->findById($eventId);
+        try {
+            $event = $this->eventRepository->findById($eventId);
+        } catch (ApiRequestException $e) {
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+            $event = new Event();
+            $event->setName("<Erreur: impossible d'afficher l'évènement>");
+            $event->setDescription("Une erreur s'est produite et ne permet pas l'affichage de cet évènement. Veuillez nous excusez pour la gêne occasionnée.");
+        }
         $variables = [$as => $event];
         return $this->renderChildrenWithVariables($variables);
     }

+ 5 - 3
ot_templating/Classes/ViewHelpers/Events/GetNextViewHelper.php

@@ -6,6 +6,8 @@ use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use FluidTYPO3\Vhs\Utility\ErrorUtility;
 use Opentalent\OtTemplating\Domain\Repository\EventRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3\CMS\Core\TimeTracker\TimeTracker;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
@@ -25,8 +27,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetNextViewHelper extends AbstractViewHelper {
+class GetNextViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -139,8 +142,7 @@ class GetNextViewHelper extends AbstractViewHelper {
                 $events = $this->eventRepository->findByOrganizationId($organizationId, $fromDate, $toDate, $limit);
             }
         } catch (ApiRequestException $e) {
-            $timeTracker = GeneralUtility::makeInstance(TimeTracker::class);
-            $timeTracker->setTSlogMessage('Error while requesting the API: ', 3);
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
             $events = [];
         }
 

+ 12 - 3
ot_templating/Classes/ViewHelpers/Members/GetAllCaViewHelper.php

@@ -4,6 +4,9 @@ namespace Opentalent\OtTemplating\ViewHelpers\Members;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\MemberRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -19,8 +22,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetAllCaViewHelper extends AbstractViewHelper {
+class GetAllCaViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -99,7 +103,12 @@ class GetAllCaViewHelper extends AbstractViewHelper {
         ];
 
         // Get members of the structure (only CA members)
-        $members = $this->memberRepository->findByOrganizationId($organizationId, true);
+        try {
+            $members = $this->memberRepository->findByOrganizationId($organizationId, true);
+        } catch (ApiRequestException $e) {
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+            $members = [];
+        }
 
         $members = array_filter($members, function($m) use ($missions) {
             return array_search($m->getMission(), $missions) !== false;
@@ -118,7 +127,7 @@ class GetAllCaViewHelper extends AbstractViewHelper {
             }
         );
 
-        if ($groupByMissions) {
+        if ($groupByMissions && !empty($members)) {
 
             // Missions to display (sorted)
             $membersByMission = [];

+ 12 - 4
ot_templating/Classes/ViewHelpers/Members/GetAllViewHelper.php

@@ -5,6 +5,8 @@ namespace Opentalent\OtTemplating\ViewHelpers\Members;
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\MemberRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -20,8 +22,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetAllViewHelper extends AbstractViewHelper {
+class GetAllViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -78,8 +81,13 @@ class GetAllViewHelper extends AbstractViewHelper {
         $organizationId = $this->arguments['organizationId'];
         $groupByInstruments = $this->arguments['groupByInstruments'];
 
-        // Get members of the structure
-        $members = $this->memberRepository->findByOrganizationId($organizationId);
+        try {
+            // Get members of the structure
+            $members = $this->memberRepository->findByOrganizationId($organizationId);
+        } catch (ApiRequestException $e) {
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+            $members = [];
+        }
 
         // Sort by instrument (conductor first), then alphabetically by name
         usort($members,
@@ -96,7 +104,7 @@ class GetAllViewHelper extends AbstractViewHelper {
             }
         );
 
-        if ($groupByInstruments) {
+        if ($groupByInstruments && !empty($members)) {
 
             // Instruments to display in first place (next will be sorted alphabetically)
             $stack1 = ['CONDUCTOR' => []];

+ 12 - 2
ot_templating/Classes/ViewHelpers/Organizations/GetByIdViewHelper.php

@@ -3,8 +3,11 @@
 namespace Opentalent\OtTemplating\ViewHelpers\Organizations;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
+use Opentalent\OtTemplating\Domain\Model\Organization;
 use Opentalent\OtTemplating\Domain\Repository\OrganizationRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -19,8 +22,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetByIdViewHelper extends AbstractViewHelper {
+class GetByIdViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -67,7 +71,13 @@ class GetByIdViewHelper extends AbstractViewHelper {
         $as = $this->arguments['as'];
         $organizationId = $this->arguments['organizationId'];
 
-        $organization = $this->organizationRepository->findById($organizationId);
+        try {
+            $organization = $this->organizationRepository->findById($organizationId);
+        } catch (ApiRequestException $e) {
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+            $organization = new Organization();
+            $organization->setName("<Erreur: impossible d'afficher le résultat>");
+        }
         $variables = [$as => $organization];
         return $this->renderChildrenWithVariables($variables);
     }

+ 12 - 3
ot_templating/Classes/ViewHelpers/Organizations/GetChildrenViewHelper.php

@@ -5,6 +5,8 @@ namespace Opentalent\OtTemplating\ViewHelpers\Organizations;
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\OrganizationRepository;
 use Opentalent\OtTemplating\Exception\ApiRequestException;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -19,8 +21,9 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */
-class GetChildrenViewHelper extends AbstractViewHelper {
+class GetChildrenViewHelper extends AbstractViewHelper implements LoggerAwareInterface {
 
+    use LoggerAwareTrait;
     use TemplateVariableViewHelperTrait;
 
     /**
@@ -73,8 +76,14 @@ class GetChildrenViewHelper extends AbstractViewHelper {
             $searchParams['where'] = $_REQUEST['search-loc'];
         }
 
-        $organization = $this->organizationRepository->findChildrenById($organizationId, $searchParams);
-        $variables = [$as => $organization];
+        try {
+            $organizations = $this->organizationRepository->findChildrenById($organizationId, $searchParams);
+        } catch (ApiRequestException $e) {
+            $this->logger->error(sprintf('API Error: %s', $e->getMessage()));
+            $organizations = [];
+        }
+
+        $variables = [$as => $organizations];
         return $this->renderChildrenWithVariables($variables);
     }
 

+ 2 - 2
ot_templating/Configuration/TypoScript/setup.txt

@@ -21,8 +21,8 @@
 # TODO: Réflechir à un système pour pouvoir afficher un message sur tous les minisites, type 'Maintenance prévue le...' ou autre
 
 ## DEBUG MODE: tout commenter pour la prod ##
-config.debug = 0
-config.contentObjectExceptionHandler = 1
+config.debug = 1
+config.contentObjectExceptionHandler = 0
 config.no_cache = 0
 config.admPanel = 0
 

+ 1 - 0
ot_templating/composer.json

@@ -13,6 +13,7 @@
         "fluidtypo3/vhs": "^6",
         "fluidtypo3/flux": "^9",
         "fluidtypo3/fluidpages": "^5",
+        "co-stack/logs": "",
         "guzzlehttp/guzzle": "^6",
         "ext-json": "^1.6"
     },

+ 23 - 0
ot_templating/ext_localconf.php

@@ -1,4 +1,10 @@
 <?php
+
+use TYPO3\CMS\Core\Core\Environment;
+use TYPO3\CMS\Core\Log\LogLevel;
+use TYPO3\CMS\Core\Log\Writer\DatabaseWriter;
+use TYPO3\CMS\Core\Log\Writer\FileWriter;
+
 if (!defined('TYPO3_MODE')) {
     die('Access denied.');
 }
@@ -13,3 +19,20 @@ if (!defined('TYPO3_MODE')) {
     'OpenTalent.OtTemplating',
     'Content'
 );
+
+$GLOBALS['TYPO3_CONF_VARS']['LOG']['Opentalent']['OtTemplating']['writerConfiguration'] = [
+    // configuration for ERROR level log entries
+    LogLevel::DEBUG => [
+        // add a FileWriter
+        FileWriter::class => [
+            // configuration for the writer
+            'logFile' => Environment::getVarPath() . '/log/typo3_ottemplating.log'
+        ]
+    ],
+    LogLevel::WARNING => [
+        // add a DatabaseWriter
+        DatabaseWriter::class => [
+            'logTable' => 'tx_opentalent_log'
+        ]
+    ]
+];

+ 14 - 0
ot_templating/ext_tables.sql

@@ -8,3 +8,17 @@ CREATE TABLE pages (
     tx_opentalent_template varchar(100) DEFAULT '',
     tx_opentalent_template_preferences text DEFAULT ''
 );
+
+#
+# Table structure for table 'tx_opentalent_log'
+#
+CREATE TABLE tx_opentalent_log (
+    request_id varchar(13) DEFAULT '' NOT NULL,
+    time_micro double(16,4) NOT NULL default '0.0000',
+    component varchar(255) DEFAULT '' NOT NULL,
+    level tinyint(1) unsigned DEFAULT '0' NOT NULL,
+    message text,
+    data text,
+
+    KEY request (request_id)
+);