Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide a way to use custom payload renderer for Pusher #93

Open
wants to merge 1 commit into
base: 8.x-1.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions liveblog.services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@ services:
plugin.manager.liveblog.notification_channel:
class: Drupal\liveblog\NotificationChannel\NotificationChannelManager
arguments: ['@container.namespaces', '@cache.discovery', '@module_handler', '@config.factory']
pusher.payload_renderer.provider:
class: Drupal\liveblog\PusherPayloadRendererProvider
tags:
- { name: service_collector, tag: pusher_payload_renderer, call: addPayloadRenderer }
pusher.payload_renderer.default:
class: Drupal\liveblog\PusherPayloadRendererDefault
arguments: ['@entity_type.manager', '@liveblog.renderer']
tags:
- { name: pusher_payload_renderer}
liveblog.renderer:
class: Drupal\liveblog\LiveblogRenderer
arguments: ['@liveblog.ajax_response.attachments_processor', '@renderer']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\liveblog\Utility\Payload;
use Drupal\liveblog\Entity\LiveblogPost;
use Drupal\liveblog\NotificationChannel\NotificationChannelPluginBase;
use Drupal\liveblog\PusherPayloadRendererProvider;
use Drupal\liveblog_pusher\PusherLoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

Expand Down Expand Up @@ -36,6 +36,11 @@ class PusherNotificationChannel extends NotificationChannelPluginBase {
*/
protected $logger;

/**
* @var \Drupal\liveblog\PusherPayloadRendererProvider
*/
private $payloadRendererProvider;

/**
* Constructs an EntityForm object.
*
Expand All @@ -45,14 +50,19 @@ class PusherNotificationChannel extends NotificationChannelPluginBase {
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param EntityTypeManagerInterface $entity_type_manager
* Entity type manager.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The factory for configuration objects.
* @param \Drupal\liveblog_pusher\PusherLoggerInterface $logger
* The logger.
* @param \Drupal\liveblog\PusherPayloadRendererProvider $payloadRendererProvider
* Payload provider.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, PusherLoggerInterface $logger) {
public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, PusherLoggerInterface $logger, PusherPayloadRendererProvider $payloadRendererProvider) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $config_factory, $entity_type_manager);
$this->logger = $logger;
$this->payloadRendererProvider = $payloadRendererProvider;
}

/**
Expand All @@ -65,7 +75,8 @@ public static function create(ContainerInterface $container, array $configuratio
$plugin_definition,
$container->get('config.factory'),
$container->get('entity_type.manager'),
$container->get('liveblog_pusher.notification_channel.log')
$container->get('liveblog_pusher.notification_channel.log'),
$container->get('pusher.payload_renderer.provider')
);
}

Expand All @@ -85,7 +96,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
'#type' => 'textfield',
'#title' => t('Key'),
'#required' => TRUE,
'#default_value' => !empty($this->configuration['key']) ? $this->configuration['key']: '',
'#default_value' => !empty($this->configuration['key']) ? $this->configuration['key'] : '',
'#description' => t('Please enter your Pusher key.'),
];
$form['secret'] = [
Expand All @@ -111,7 +122,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
*/
private function loadPusherLibrary() {
if (!class_exists('\Pusher') && function_exists('libraries_get_path')) {
include_once (DRUPAL_ROOT.'/'.libraries_get_path('pusher') . '/lib/Pusher.php');
include_once(DRUPAL_ROOT . '/' . libraries_get_path('pusher') . '/lib/Pusher.php');
}
}

Expand Down Expand Up @@ -167,8 +178,10 @@ public function triggerLiveblogPostEvent(LiveblogPost $liveblog_post, $event) {
$client = $this->getClient();
$channel = "liveblog-{$liveblog_post->getLiveblog()->id()}";

/** @var \Drupal\liveblog\PusherPayloadRendererInterface $payloadRenderer */
$payloadRenderer = $this->payloadRendererProvider->getPayloadRenderer();
// Trigger an event by providing event name and payload.
$response = $client->trigger($channel, $event, Payload::create($liveblog_post)->getRenderedPayload(), null, true);
$response = $client->trigger($channel, $event, $payloadRenderer->getRenderedPayload($liveblog_post), NULL, TRUE);
if ($response['status'] !== 200) {
// Log response if there is an error.
$this->logger->saveLog('error');
Expand Down
16 changes: 15 additions & 1 deletion src/Controller/LiveblogListController.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ public function getList(Node $node) {
}

$content = $render_array = [];
/** @var \Drupal\liveblog\PusherPayloadRendererInterface $payloadRenderer */
$payloadRenderer = $this->getPayloadRenderer();
/* @var \Drupal\liveblog\Entity\LiveblogPost[] $entities */
foreach ($entities as $entity) {
$result = Payload::create($entity)->getPayload();
$result = $payloadRenderer->getPayload($entity);

// Collect all the render arrays. Will be used later to get the libraries
// and commands needed for the frontend.
Expand Down Expand Up @@ -105,4 +107,16 @@ protected function getRenderer() {
return \Drupal::service('renderer');
}

/**
* Returns payload renderer.
*
* @return \Drupal\liveblog\PusherPayloadRendererInterface
* Payload renderer.
*/
protected function getPayloadRenderer() {
/** @var \Drupal\liveblog\PusherPayloadRendererProvider $payloadProvider */
$payloadProvider = \Drupal::service('pusher.payload_renderer.provider');
return $payloadProvider->getPayloadRenderer();
}

}
85 changes: 30 additions & 55 deletions src/Utility/Payload.php → src/PusherPayloadRendererDefault.php
Original file line number Diff line number Diff line change
@@ -1,57 +1,55 @@
<?php

namespace Drupal\liveblog\Utility;
namespace Drupal\liveblog;

use Drupal\Core\Entity\EntityTypeManager;
use Drupal\liveblog\Entity\LiveblogPost;

/**
* Utility for liveblog post payload.
*
* @todo: Convert to a trait or service.
* Default Pusher payload renderer.
*/
class Payload {
class PusherPayloadRendererDefault implements PusherPayloadRendererInterface {

/**
* The liveblog post entity.
* Entity type manager.
*
* @var \Drupal\liveblog\Entity\LiveblogPost $entity
* @var \Drupal\Core\Entity\EntityTypeManager
*/
protected $entity;
private $entityTypeManager;

/**
* Constructors an instance.
* Renderer to render Liveblog entity.
*
* @param \Drupal\liveblog\Entity\LiveblogPost $entity
* The liveblog post entity.
* @var \Drupal\liveblog\LiveblogRenderer
*/
protected function __construct(LiveblogPost $entity) {
$this->entity = $entity;
}
private $liveblogRenderer;

/**
* Constructors an instance.
*
* @param \Drupal\liveblog\Entity\LiveblogPost $entity
* The liveblog post entity.
*
* @return self
* Instance of the class.
* @param \Drupal\Core\Entity\EntityTypeManager $entityTypeManager
* Entity type manager.
* @param \Drupal\liveblog\LiveblogRenderer $liveblogRenderer
* Liveblog entity renderer.
*/
public static function create(LiveblogPost $entity) {
return new static($entity);
public function __construct(EntityTypeManager $entityTypeManager, LiveblogRenderer $liveblogRenderer) {
$this->entityTypeManager = $entityTypeManager;
$this->liveblogRenderer = $liveblogRenderer;
}

/**
* Gets a rendered payload from the liveblog post entity.
*
* @return array
* The payload array.
* @inheritdoc
*/
public function getRenderedPayload() {
$entity = $this->entity;
public function isDefault() {
return TRUE;
}

$rendered_entity = $this->entityTypeManager()->getViewBuilder('liveblog_post')->view($entity);
$output = $this->getRenderer()->render($rendered_entity);
/**
* @inheritdoc
*/
public function getRenderedPayload(LiveblogPost $entity) {
$rendered_entity = $this->entityTypeManager->getViewBuilder('liveblog_post')->view($entity);
$output = $this->liveblogRenderer->render($rendered_entity);

$data['id'] = $entity->id();
$data['uuid'] = $entity->uuid();
Expand All @@ -71,15 +69,10 @@ public function getRenderedPayload() {
}

/**
* Gets payload from the liveblog post entity.
*
* @return array
* The payload array.
* @inheritdoc
*/
public function getPayload() {
$entity = $this->entity;

$rendered_entity = $this->entityTypeManager()->getViewBuilder('liveblog_post')->view($entity);
public function getPayload(LiveblogPost $entity) {
$rendered_entity = $this->entityTypeManager->getViewBuilder('liveblog_post')->view($entity);

$data['id'] = $entity->id();
$data['uuid'] = $entity->uuid();
Expand All @@ -98,22 +91,4 @@ public function getPayload() {
return $data;
}

/**
* Returns the render API renderer.
*
* @return \Drupal\liveblog\LiveblogRenderer
*/
protected function getRenderer() {
return \Drupal::service('liveblog.renderer');
}

/**
* Gets the entity type manager.
*
* @return \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected function entityTypeManager() {
return \Drupal::entityTypeManager();
}

}
42 changes: 42 additions & 0 deletions src/PusherPayloadRendererInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace Drupal\liveblog;

use Drupal\liveblog\Entity\LiveblogPost;

/**
* Pusher payload renderer interface.
*/
interface PusherPayloadRendererInterface {

/**
* Gets a rendered payload from the liveblog post entity.
*
* @param \Drupal\liveblog\Entity\LiveblogPost $entity
* Liveblog post.
*
* @return array
* The payload array.
*/
public function getRenderedPayload(LiveblogPost $entity);

/**
* Gets payload from the liveblog post entity.
*
* @param \Drupal\liveblog\Entity\LiveblogPost $entity
* Liveblog post.
*
* @return array
* The payload array.
*/
public function getPayload(LiveblogPost $entity);

/**
* If the renderer is marked as default. Last marked default renderer is used.
*
* @return bool
* If the renderer is default.
*/
public function isDefault();

}
62 changes: 62 additions & 0 deletions src/PusherPayloadRendererProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace Drupal\liveblog;

/**
* Pusher payload renderer provider.
*/
class PusherPayloadRendererProvider {

/**
* Default renderer to be used to render Pusher payload.
*
* @var \Drupal\liveblog\PusherPayloadRendererInterface
*/
protected $defaulRenderer;

/**
* List of registered Pusher payload renderers.
*
* @var \Drupal\liveblog\PusherPayloadRendererInterface[]
*/
protected $payloadRenderers;

/**
* Registers Pusher payload renderer.
*
* @param \Drupal\liveblog\PusherPayloadRendererInterface $payloadRenderer
* Payload renderer to register.
*/
public function addPayloadRenderer(PusherPayloadRendererInterface $payloadRenderer) {
$this->payloadRenderers[] = $payloadRenderer;
if ($payloadRenderer->isDefault()) {
$this->defaulRenderer = $payloadRenderer;
}
}

/**
* Gets Pusher payload renderer.
*
* @param mixed $key
* Key of the payload renderer to return.
*
* @throws \Exception
* Could not provide payload renderer.
*
* @return \Drupal\liveblog\PusherPayloadRendererInterface
* Payload renderer.
*/
public function getPayloadRenderer($key = NULL) {
// First return payload renderer under specific key in the list.
if (isset($this->payloadRenderers[$key])) {
$this->payloadRenderers[$key];
}
// Otherwise return the default renderer.
elseif (isset($this->defaulRenderer)) {
return $this->defaulRenderer;
}

throw new \Exception('Could not provide payload renderer.');
}

}