Plugin: External Notification Connect: Send notification when changing post visibility - refs BT#20443

pull/4616/head
Angel Fernando Quiroz Campos 3 years ago
parent d32f518ed5
commit 2675965ec5
  1. 8
      main/inc/lib/PortfolioController.php
  2. 22
      main/inc/lib/hook/HookPortfolioItemVisibility.php
  3. 11
      main/inc/lib/hook/interfaces/HookPortfolioItemVisibilityEventInterface.php
  4. 11
      main/inc/lib/hook/interfaces/HookPortfolioItemVisibilityObserverInterface.php
  5. 7
      plugin/externalnotificationconnect/src/ExternalNotificationConnectPlugin.php
  6. 44
      plugin/externalnotificationconnect/src/Hook/ExternalNotificationConnectPortfolioItemVisibilityHookObserver.php
  7. 42
      plugin/externalnotificationconnect/src/Traits/RequestTrait.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')
);

@ -0,0 +1,22 @@
<?php
/* For licensing terms, see /license.txt */
class HookPortfolioItemVisibility extends HookEvent implements HookPortfolioItemVisibilityEventInterface
{
protected function __construct()
{
parent::__construct('HookPortfolioItemVisibility');
}
/**
* {@inheritDoc}
*/
public function notifyItemVisibility()
{
/** @var HookPortfolioItemVisibilityObserverInterface $observer */
foreach ($this->observers as $observer) {
$observer->hookItemVisibility($this);
}
}
}

@ -0,0 +1,11 @@
<?php
/* For licensing terms, see /license.txt */
interface HookPortfolioItemVisibilityEventInterface extends HookEventInterface
{
/**
* @return void
*/
public function notifyItemVisibility();
}

@ -0,0 +1,11 @@
<?php
/* For licensing terms, see /license.txt */
interface HookPortfolioItemVisibilityObserverInterface extends HookObserverInterface
{
/**
* @return void
*/
public function hookItemVisibility(HookPortfolioItemVisibilityEventInterface $event);
}

@ -55,19 +55,23 @@ class ExternalNotificationConnectPlugin extends Plugin implements HookPluginInte
$portfolioItemAddedEvent = HookPortfolioItemAdded::create();
$portfolioItemEditedEvent = HookPortfolioItemEdited::create();
$portfolioItemDeletedEvent = HookPortfolioItemDeleted::create();
$portfolioItemVisibilityEvent = HookPortfolioItemVisibility::create();
$portfolioItemAddedObserver = ExternalNotificationConnectPortfolioItemAddedHookObserver::create();
$portfolioItemEditedObserver = ExternalNotificationConnectPortfolioItemEditedHookObserver::create();
$portfolioItemDeletedObserver = ExternalNotificationConnectPortfolioItemDeletedHookObserver::create();
$portfolioItemVisibilityObserver = ExternalNotificationConnectPortfolioItemVisibilityHookObserver::create();
if ('true' === $this->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);
}

@ -0,0 +1,44 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Portfolio;
use Chamilo\PluginBundle\ExternalNotificationConnect\Traits\RequestTrait\RequestTrait;
class ExternalNotificationConnectPortfolioItemVisibilityHookObserver extends ExternalNotificationConnectHookObserver implements HookPortfolioItemVisibilityObserverInterface
{
use RequestTrait;
/**
* {@inheritDoc}
*/
public function hookItemVisibility(HookPortfolioItemVisibilityEventInterface $event)
{
/** @var Portfolio $item */
$item = $event->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']);
}
}

@ -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
*/

Loading…
Cancel
Save