diff --git a/main/inc/lib/PortfolioController.php b/main/inc/lib/PortfolioController.php index 29da200b12..9e27be8962 100644 --- a/main/inc/lib/PortfolioController.php +++ b/main/inc/lib/PortfolioController.php @@ -3173,6 +3173,14 @@ class PortfolioController $em->flush(); + HookPortfolioItemVisibility::create() + ->setEventData([ + 'item' => $item, + 'recipients' => array_values($recipients), + ]) + ->notifyItemVisibility() + ; + Display::addFlash( Display::return_message(get_lang('VisibilityChanged'), 'success') ); diff --git a/main/inc/lib/hook/HookPortfolioItemVisibility.php b/main/inc/lib/hook/HookPortfolioItemVisibility.php new file mode 100644 index 0000000000..9553359d16 --- /dev/null +++ b/main/inc/lib/hook/HookPortfolioItemVisibility.php @@ -0,0 +1,22 @@ +observers as $observer) { + $observer->hookItemVisibility($this); + } + } +} diff --git a/main/inc/lib/hook/interfaces/HookPortfolioItemVisibilityEventInterface.php b/main/inc/lib/hook/interfaces/HookPortfolioItemVisibilityEventInterface.php new file mode 100644 index 0000000000..c0753d97e6 --- /dev/null +++ b/main/inc/lib/hook/interfaces/HookPortfolioItemVisibilityEventInterface.php @@ -0,0 +1,11 @@ +get(self::SETTING_NOTIFY_PORTFOLIO)) { $portfolioItemAddedEvent->attach($portfolioItemAddedObserver); $portfolioItemEditedEvent->attach($portfolioItemEditedObserver); $portfolioItemDeletedEvent->attach($portfolioItemDeletedObserver); + $portfolioItemVisibilityEvent->attach($portfolioItemVisibilityObserver); } else { $portfolioItemAddedEvent->detach($portfolioItemAddedObserver); $portfolioItemEditedEvent->detach($portfolioItemEditedObserver); $portfolioItemDeletedEvent->detach($portfolioItemDeletedObserver); + $portfolioItemVisibilityEvent->detach($portfolioItemVisibilityObserver); } $lpCreatedEvent = HookLearningPathCreated::create(); @@ -92,16 +96,19 @@ class ExternalNotificationConnectPlugin extends Plugin implements HookPluginInte $portfolioItemAddedEvent = HookPortfolioItemAdded::create(); $portfolioItemEditedEvent = HookPortfolioItemEdited::create(); $portfolioItemDeletedEvent = HookPortfolioItemDeleted::create(); + $portfolioItemVisibilityEvent = HookPortfolioItemVisibility::create(); $lpCreatedEvent = HookLearningPathCreated::create(); $portfolioItemAddedObserver = ExternalNotificationConnectPortfolioItemAddedHookObserver::create(); $portfolioItemEditedObserver = ExternalNotificationConnectPortfolioItemEditedHookObserver::create(); $portfolioItemDeletedObserver = ExternalNotificationConnectPortfolioItemDeletedHookObserver::create(); + $portfolioItemVisibilityObserver = ExternalNotificationConnectPortfolioItemVisibilityHookObserver::create(); $lpCreatedObserver = ExternalNotificationConnectLearningPathCreatedHookObserver::create(); $portfolioItemAddedEvent->detach($portfolioItemAddedObserver); $portfolioItemEditedEvent->detach($portfolioItemEditedObserver); $portfolioItemDeletedEvent->detach($portfolioItemDeletedObserver); + $portfolioItemVisibilityEvent->detach($portfolioItemVisibilityObserver); $lpCreatedEvent->detach($lpCreatedObserver); } diff --git a/plugin/externalnotificationconnect/src/Hook/ExternalNotificationConnectPortfolioItemVisibilityHookObserver.php b/plugin/externalnotificationconnect/src/Hook/ExternalNotificationConnectPortfolioItemVisibilityHookObserver.php new file mode 100644 index 0000000000..97cf7ed9eb --- /dev/null +++ b/plugin/externalnotificationconnect/src/Hook/ExternalNotificationConnectPortfolioItemVisibilityHookObserver.php @@ -0,0 +1,44 @@ +getEventData()['item']; + $recipients = $event->getEventData()['recipients']; + + try { + $json = $this->doVisibilityRequest( + [ + 'content_id' => $item->getId(), + 'content_type' => 'eportfolio', + 'visibility' => $item->getVisibility(), + 'user_list' => $recipients, + ] + ); + } catch (Exception $e) { + Display::addFlash( + Display::return_message($e->getMessage(), 'error') + ); + + return; + } + + if (empty($json)) { + return; + } + + error_log('ExtNotifConn: Portfolio item visibility: ID '.$json['data']['notification_id']); + } +} diff --git a/plugin/externalnotificationconnect/src/Traits/RequestTrait.php b/plugin/externalnotificationconnect/src/Traits/RequestTrait.php index c45da9c12b..f440e6614a 100644 --- a/plugin/externalnotificationconnect/src/Traits/RequestTrait.php +++ b/plugin/externalnotificationconnect/src/Traits/RequestTrait.php @@ -107,6 +107,48 @@ trait RequestTrait return $json; } + /** + * @throws Exception + */ + protected function doVisibilityRequest(array $data) + { + try { + $token = $this->plugin->getAccessToken(); + } catch (OptimisticLockException|ORMException|Exception $e) { + throw new Exception($e->getMessage()); + } + + $options = [ + 'headers' => [ + 'Authorization' => "Bearer $token", + ], + 'json' => $data, + ]; + + $client = new Client(); + + try { + $response = $client->post( + $this->plugin->get(ExternalNotificationConnectPlugin::SETTING_NOTIFICATION_URL).'/visibility', + $options + ); + } catch (ClientException|ServerException $e) { + if (!$e->hasResponse()) { + throw new Exception($e->getMessage()); + } + + $response = $e->getResponse(); + } + + $json = json_decode((string) $response->getBody(), true); + + if (isset($json['status']) && 500 === $json['status']) { + throw new Exception($json['message']); + } + + return $json; + } + /** * @throws Exception */