View source
<?php
namespace Drupal\acquia_contenthub\Form;
use Drupal\acquia_contenthub\ContentHubSubscription;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
class WebhooksSettingsForm extends ConfigFormBase {
protected $configFactory;
protected $contentHubSubscription;
public function __construct(ConfigFactoryInterface $config_factory, ContentHubSubscription $contenthub_subscription) {
$this->configFactory = $config_factory;
$this->contentHubSubscription = $contenthub_subscription;
}
public static function create(ContainerInterface $container) {
$config_factory = $container
->get('config.factory');
$contenthub_subscription = $container
->get('acquia_contenthub.acquia_contenthub_subscription');
return new static($config_factory, $contenthub_subscription);
}
public function getFormId() {
return 'acquia_contenthub.admin_settings';
}
protected function getEditableConfigNames() {
return [
'acquia_contenthub.admin_settings',
];
}
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this->configFactory
->getEditable('acquia_contenthub.admin_settings');
$form['webhook_settings'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Administer Webhooks'),
'#collapsible' => TRUE,
'#description' => $this
->t('Manage Acquia Content Hub Webhooks'),
];
if ($config
->get('webhook_url')) {
$webhook_url = $config
->get('webhook_url');
}
else {
$webhook_url = Url::fromUri('internal:/acquia-contenthub/webhook', [
'absolute' => TRUE,
])
->toString();
}
$webhook_uuid = $config
->get('webhook_uuid');
$remote_uuid = NULL;
$settings = $this->contentHubSubscription
->getSettings();
if ($settings) {
$webhooks = $settings
->getWebhooks();
foreach ($webhooks as $webhook) {
if ($webhook['url'] === $webhook_url) {
$remote_uuid = $webhook['uuid'];
break;
}
}
}
if ($remote_uuid != $webhook_uuid) {
$config
->set('webhook_uuid', $remote_uuid);
$config
->set('webhook_url', $webhook_url);
$config
->save();
$webhook_uuid = $remote_uuid;
}
if ((bool) $webhook_uuid) {
$title = $this
->t('Receive Webhooks (uuid = %uuid)', [
'%uuid' => $webhook_uuid,
]);
}
else {
$title = $this
->t('Receive Webhooks');
}
$form['webhook_settings']['webhook_url'] = [
'#type' => 'textfield',
'#title' => $this
->t('Acquia Content Hub URL'),
'#description' => $this
->t('Please use a full URL (Ex. http://example.com/acquia-contenthub/webhook). This is the end-point where this site will receive webhooks from Acquia Content Hub.'),
'#default_value' => $webhook_url,
'#required' => TRUE,
];
$form['webhook_settings']['webhook_uuid'] = [
'#type' => 'checkbox',
'#title' => $title,
'#default_value' => (bool) $webhook_uuid,
'#description' => $this
->t('Webhooks must be enabled to receive updates from Acquia Content Hub'),
];
return parent::buildForm($form, $form_state);
}
public function validateForm(array &$form, FormStateInterface $form_state) {
if (!UrlHelper::isValid($form_state
->getValue('webhook_url'), TRUE)) {
return $form_state
->setErrorByName('webhook_url', $this
->t('This is not a valid URL. Please insert it again.'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$webhook_url = NULL;
if ($form_state
->hasValue('webhook_url')) {
$webhook_url = $form_state
->getValue('webhook_url');
}
$webhook_register = (bool) $form_state
->getValue('webhook_uuid');
$config = $this->configFactory
->getEditable('acquia_contenthub.admin_settings');
$webhook_uuid = $config
->get('webhook_uuid');
if ($webhook_register && $webhook_uuid) {
$this
->messenger()
->addWarning($this
->t('No change in webhook status was taken.'));
}
elseif ($webhook_register) {
$success = $this->contentHubSubscription
->registerWebhook($webhook_url);
if (!$success) {
$this
->messenger()
->addError($this
->t('There was a problem trying to register this webhook.'));
}
}
else {
$success = $this->contentHubSubscription
->unregisterWebhook($webhook_url);
if (!$success) {
$this
->messenger()
->addError($this
->t('There was a problem trying to unregister this webhook.'));
}
}
}
}