bbb-8.x-1.x-dev/src/Service/Meeting.php
src/Service/Meeting.php
<?php
namespace Drupal\bbb\Service;
use BigBlueButton\Parameters\CreateMeetingParameters;
use BigBlueButton\Parameters\EndMeetingParameters;
use BigBlueButton\Parameters\GetMeetingInfoParameters;
use BigBlueButton\Parameters\JoinMeetingParameters;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\PrivateKey;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Class Meeting.
*
* @package Drupal\bbb\Service
*/
class Meeting implements MeetingInterface {
use StringTranslationTrait;
/**
* Current user.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $currentUser;
/**
* Entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Meetings storage.
*
* @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
*/
protected $meetingCollection;
/**
* Logger.
*
* @var \Drupal\Core\Logger\LoggerChannelInterface
*/
protected $log;
/**
* Drupal API for BigBlueButton service.
*
* @var \Drupal\bbb\Service\Api
*/
protected $api;
/**
* Private key service.
*
* @var \Drupal\Core\PrivateKey
*/
protected $privateKey;
/**
* Meetings info cached collection.
*
* @var array
*/
protected static $meetings = [];
/**
* Meeting constructor.
*
* @param \Drupal\bbb\Service\Api $api
* Drupal API for BigBlueButton service.
* @param \Drupal\Core\PrivateKey $private_key
* Private key service.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* Module handler.
* @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $keyvalue
* Keyvalue service.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* Entity type manager.
* @param \Drupal\Core\Session\AccountInterface $current_user
* Current user instance.
* @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory
* Logger factory.
*/
public function __construct(
Api $api,
PrivateKey $private_key,
ModuleHandlerInterface $module_handler,
KeyValueFactoryInterface $keyvalue,
EntityTypeManagerInterface $entity_type_manager,
AccountInterface $current_user,
LoggerChannelFactoryInterface $logger_factory
) {
$this->api = $api;
$this->privateKey = $private_key;
$this->currentUser = $current_user;
$this->entityTypeManager = $entity_type_manager;
$this->moduleHandler = $module_handler;
$this->meetingCollection = $keyvalue->get('bbb_meetings');
$this->log = $logger_factory->get('bbb');
}
/**
* {@inheritdoc}
*/
public function get($id, AccountInterface $account = NULL, $cached = TRUE) {
if (empty($account)) {
$account = $this->currentUser;
}
if (!isset(self::$meetings[$id]) || !$cached) {
/** @var \BigBlueButton\Parameters\CreateMeetingParameters $meeting_created */
$meeting_created = $this->meetingCollection->get($id);
if ($meeting_created) {
$meeting_info = $this->api->getMeetingInfo(new GetMeetingInfoParameters($meeting_created->getMeetingId(), $meeting_created->getModeratorPassword()));
if ($meeting_info) {
$url = [
'attend' => $this->api->joinMeeting(
new JoinMeetingParameters(
$meeting_created->getMeetingId(),
$account->getDisplayName(),
$meeting_created->getAttendeePassword()
)
),
'moderate' => $this->api->joinMeeting(
new JoinMeetingParameters(
$meeting_created->getMeetingId(),
$account->getDisplayName(),
$meeting_created->getModeratorPassword()
)
),
];
$meeting = [
'info' => $meeting_info,
'created' => $meeting_created,
'url' => $url,
];
// Allow alteration for e.g. access control
// Just implement hook_bbb_meeting_alter(&$data) {} in your module.
$this->moduleHandler->alter('bbb_get_meeting', $meeting);
// Static cache.
self::$meetings[$id] = $meeting;
}
}
}
return isset(self::$meetings[$id]) ? self::$meetings[$id] : [];
}
/**
* {@inheritdoc}
*/
public function update($key, CreateMeetingParameters $params) {
$this->meetingCollection->set($key, $params);
return $key;
}
/**
* {@inheritdoc}
*/
public function create($key, CreateMeetingParameters $params) {
if ($data = $this->api->createMeeting($params)) {
return $data;
}
return FALSE;
}
/**
* {@inheritdoc}
*/
public function store($key, CreateMeetingParameters $params) {
return $this->update($key, $params);
}
/**
* {@inheritdoc}
*/
public function delete($key) {
if ($this->meetingCollection->has($key)) {
$this->meetingCollection->delete($key);
}
else {
$this->log->warning($this->t('Meeting @key not found during removal: It was removed before manually or never exists.', ['@key' => $key]));
}
$meeting = $this->get($key);
$params = new EndMeetingParameters(
$meeting->meetingID,
$meeting->moderatorPW
);
$request = $this->api->endMeeting($params);
return $request;
}
}
