View source
<?php
namespace Drupal\build_hooks_netlify\Plugin\FrontendEnvironment;
use Drupal\build_hooks\Plugin\FrontendEnvironmentBase;
use Drupal\build_hooks_netlify\NetlifyManager;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\MessengerTrait;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use GuzzleHttp\Exception\GuzzleException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\build_hooks\BuildHookDetails;
class NetlifyFrontendEnvironment extends FrontendEnvironmentBase implements ContainerFactoryPluginInterface {
use MessengerTrait;
protected $netlifyManager;
public function __construct(array $configuration, $plugin_id, $plugin_definition, NetlifyManager $netlifyManager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->netlifyManager = $netlifyManager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('build_hooks_netlify.netlify_manager'));
}
public function frontEndEnvironmentForm($form, FormStateInterface $form_state) {
$form['build_hook_url'] = [
'#type' => 'url',
'#title' => $this
->t('Build hook url'),
'#maxlength' => 255,
'#default_value' => isset($this->configuration['build_hook_url']) ? $this->configuration['build_hook_url'] : '',
'#description' => $this
->t("Build hook url for this environment and branch."),
'#required' => TRUE,
];
$form['api_id'] = [
'#type' => 'textfield',
'#title' => $this
->t('API id'),
'#maxlength' => 255,
'#default_value' => isset($this->configuration['api_id']) ? $this->configuration['api_id'] : '',
'#description' => $this
->t("Netlify API ID of this environment"),
'#required' => TRUE,
];
$form['branch'] = [
'#type' => 'textfield',
'#title' => $this
->t('Git branch'),
'#maxlength' => 255,
'#default_value' => isset($this->configuration['branch']) ? $this->configuration['branch'] : '',
'#description' => $this
->t("Git branch that the build hook refers to."),
'#required' => TRUE,
];
return $form;
}
public function frontEndEnvironmentSubmit($form, FormStateInterface $form_state) {
$this->configuration['api_id'] = $form_state
->getValue('api_id');
$this->configuration['branch'] = $form_state
->getValue('branch');
$this->configuration['build_hook_url'] = $form_state
->getValue('build_hook_url');
}
public function getBuildHookDetails() {
$buildHookDetails = new BuildHookDetails();
$buildHookDetails
->setUrl($this->configuration['build_hook_url']);
$buildHookDetails
->setMethod('POST');
return $buildHookDetails;
}
public function getAdditionalDeployFormElements(FormStateInterface $form_state) {
$form = [];
$form['latestNetlifyDeployments'] = [
'#type' => 'details',
'#title' => $this
->t('Recent deployments'),
'#description' => $this
->t('Here you can see the details for the latest deployments for this environment.'),
'#open' => TRUE,
];
try {
$form['latestNetlifyDeployments']['table'] = $this
->getLastNetlifyDeploymentsTable($this
->getConfiguration());
$form['latestNetlifyDeployments']['refresher'] = [
'#type' => 'button',
'#ajax' => [
'callback' => [
NetlifyFrontendEnvironment::class,
'refreshDeploymentTable',
],
'wrapper' => 'ajax-replace-table',
'effect' => 'fade',
'progress' => [
'type' => 'throbber',
'message' => $this
->t('Refreshing deployment status...'),
],
],
'#value' => $this
->t('Refresh'),
];
} catch (GuzzleException $e) {
$this
->messenger()
->addError('Unable to retrieve information about the last deployments for this environment. Check configuration.');
}
return $form;
}
private function getLastNetlifyDeploymentsTable(array $settings) {
$netlifyData = $this->netlifyManager
->retrieveLatestBuildsFromNetlifyForEnvironment($settings, 8);
$element = [
'#type' => 'table',
'#attributes' => [
'id' => 'ajax-replace-table',
],
'#header' => [
$this
->t('Status'),
$this
->t('Started at'),
$this
->t('Finished at'),
$this
->t('Message'),
],
];
if (!empty($netlifyData)) {
foreach ($netlifyData as $netlifyDeployment) {
$element[$netlifyDeployment['id']]['status'] = [
'#type' => 'item',
'#markup' => '<strong>' . $netlifyDeployment['state'] . '</strong>',
];
$started_time = $netlifyDeployment['created_at'] ? $this->netlifyManager
->formatNetlifyDateTime($netlifyDeployment['created_at']) : '';
$element[$netlifyDeployment['id']]['started_at'] = [
'#type' => 'item',
'#markup' => $started_time,
];
$stopped_time = $netlifyDeployment['published_at'] ? $this->netlifyManager
->formatNetlifyDateTime($netlifyDeployment['published_at']) : '';
$element[$netlifyDeployment['id']]['finished_at'] = [
'#type' => 'item',
'#markup' => $stopped_time,
];
$message = $netlifyDeployment['error_message'] ? $netlifyDeployment['error_message'] : '';
$element[$netlifyDeployment['id']]['error_message'] = [
'#type' => 'item',
'#markup' => $message,
];
}
}
return $element;
}
public static function refreshDeploymentTable(array $form, FormStateInterface $form_state) {
return $form['latestNetlifyDeployments']['table'];
}
}