Skip to content
Snippets Groups Projects
Commit f1b6d72a authored by Ken Mortimer's avatar Ken Mortimer Committed by Ken Mortimer
Browse files

Issue #3349512 by mortim07: Make use of stale state

parent f10229da
No related branches found
No related tags found
No related merge requests found
proactive_stale_check: 0
......@@ -32,3 +32,11 @@ preview_site.strategy.deploy_settings.preview_site_public:
views.field.preview_site_item_count:
type: views.field.numeric
label: 'Number of items'
preview_site.settings:
type: config_object
label: 'Preview site settings'
mapping:
proactive_stale_check:
type: integer
label: 'Proactive stale check'
......@@ -31,3 +31,10 @@ function preview_site_update_9001(): TranslatableMarkup {
\Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('paths', 'preview_site_build', 'preview_site', $path);
return new TranslatableMarkup('Added path field');
}
/**
* Set a default value for preview_site.settings.proactive_stale_check.
*/
function preview_site_update_9002(): void {
\Drupal::configFactory()->getEditable('preview_site.settings')->set('proactive_stale_check', 0)->save(TRUE);
}
......@@ -15,3 +15,9 @@ entity.preview_site_build.collection:
route_name: entity.preview_site_build.collection
parent: preview_site.preview_site_overview
description: 'Manage preview site builds.'
preview_site.settings:
title: 'Preview site settings'
route_name: preview_site.settings
parent: preview_site.preview_site_overview
description: 'Manage preview site settings.'
......@@ -7,6 +7,7 @@
use Drupal\Core\Access\AccessResultNeutral;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Database\Query\AlterableInterface;
......@@ -102,3 +103,29 @@ function preview_site_cron() {
$queue->createItem($id);
}
}
/**
* Implements hook_entity_update().
*/
function preview_site_entity_update(EntityInterface $entity): void {
$proactive_stale_check = \Drupal::config('preview_site.settings')->get('proactive_stale_check');
if (!$proactive_stale_check) {
return;
}
$content_entity_types = array_filter(\Drupal::entityTypeManager()->getDefinitions(), fn($entity_type) => $entity_type instanceof ContentEntityTypeInterface);
if (!in_array($entity->getEntityType(), $content_entity_types)) {
return;
}
$preview_site_build_storage = \Drupal::entityTypeManager()->getStorage('preview_site_build');
// Find 'built' preview site builds that are connected to this content entity
// and update their status to stale.
$entity_query = $preview_site_build_storage->getQuery();
$entity_query->condition('contents', [$entity->id()], 'IN');
$entity_query->condition('status', PreviewSiteBuildInterface::STATUS_BUILT);
if (!empty($preview_site_builds = $entity_query->execute())) {
foreach ($preview_site_build_storage->loadMultiple($preview_site_builds) as $preview_site_build) {
/** @var \Drupal\preview_site\Entity\PreviewSiteBuildInterface $preview_site */
$preview_site_build->set('status', PreviewSiteBuildInterface::STATUS_STALE)->save();
}
}
}
......@@ -5,3 +5,11 @@ preview_site.overview:
_title: 'Preview site'
requirements:
_permission: 'administer preview_site builds+administer preview_site strategies'
preview_site.settings:
path: '/admin/structure/preview-site/settings'
defaults:
_form: '\Drupal\preview_site\Form\PreviewSiteSettingsForm'
_title: 'Preview site settings'
requirements:
_permission: 'administer preview_site builds+administer preview_site strategies'
......@@ -297,9 +297,28 @@ class PreviewSiteBuild extends ContentEntityBase implements PreviewSiteBuildInte
*/
public function preSave(EntityStorageInterface $storage) {
parent::preSave($storage);
if ($this->get('status')->isEmpty()) {
if (empty($this->getStatus())) {
$this->status = self::STATUS_PENDING;
return;
}
if ($this->isStale()) {
$this->status = self::STATUS_STALE;
}
}
/**
* {@inheritdoc}
*/
public function isStale(): bool {
if ($this->getStatus() === self::STATUS_STALE) {
return TRUE;
}
// If we have the original preview site and it's contents is different
// to the current preview site, then it is stale. This is useful in the
// pre-save context.
return (!empty($this->original) &&
$this->getStatus() === self::STATUS_BUILT &&
FALSE === $this->get('contents')->equals($this->original->contents));
}
/**
......
......@@ -58,6 +58,14 @@ interface PreviewSiteBuildInterface extends ContentEntityInterface, EntityChange
*/
public function getStrategy(): ?PreviewStrategyInterface;
/**
* A method to determine whether the preview site is stale.
*
* @return bool
* The result.
*/
public function isStale(): bool;
/**
* Queues generation.
*
......
<?php
declare(strict_types=1);
namespace Drupal\preview_site\Form;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
/**
* A form for managing the preview site settings.
*
* @codeCoverageIgnore
*/
class PreviewSiteSettingsForm extends ConfigFormBase {
/**
* {@inheritdoc}
*/
protected function getEditableConfigNames(): array {
return ['preview_site.settings'];
}
/**
* {@inheritdoc}
*/
public function getFormId(): string {
return 'preview_site_settings_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state): array {
$form['proactive_stale_check'] = [
'#type' => 'checkbox',
'#title' => $this->t('Proactive stale check'),
'#description' => $this->t("By enabling this option a check will be run on every entity save to find 'built' preview sites that are connected and mark them as stale."),
'#default_value' => $this->config('preview_site.settings')->get('proactive_stale_check'),
];
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state): void {
$this->config('preview_site.settings')->set('proactive_stale_check', $form_state->getValue('proactive_stale_check'))->save();
parent::submitForm($form, $form_state);
}
}
......@@ -116,6 +116,56 @@ class PreviewSiteBuildEntityTest extends PreviewSiteKernelTestBase {
}));
}
/**
* Tests to ensure a built preview site build enters a stale state.
*/
public function testStaleStatus(): void {
$strategy_label = $this->randomMachineName();
$label = $this->randomMachineName();
$prefix = $this->randomMachineName();
$strategy = $this->createStrategy($strategy_label, $this->randomMachineName(), $prefix);
$entity_test = EntityTest::create();
$file = $this->getTestFile();
// Create a preview site build and set the status to built.
$build = $this->createPreviewSiteBuild([
'strategy' => $strategy->id(),
'label' => $label,
'contents' => [
$entity_test,
],
'artifacts' => $file->id(),
'log' => 'stuff',
'processed_paths' => ['/some/path'],
'status' => PreviewSiteBuildInterface::STATUS_BUILT,
]);
$this->assertEquals(PreviewSiteBuildInterface::STATUS_BUILT, $build->getStatus());
// Create an additional entity and add it to the preview site build.
$entity_test_1 = EntityTest::create();
$build->get('contents')->appendItem($entity_test_1);
$build->save();
// The preview site build status should now be 'stale'.
$this->assertEquals(PreviewSiteBuildInterface::STATUS_STALE, $build->getStatus());
// Reset the preview site build status to 'built'.
$build->set('status', PreviewSiteBuildInterface::STATUS_BUILT);
$build->save();
// Change the additional entity's title.
$entity_test_1_title = $this->randomMachineName();
$entity_test_1->set('name', $entity_test_1_title);
$entity_test_1->save();
// The preview site build status should still be 'built'.
$this->assertNotEquals(PreviewSiteBuildInterface::STATUS_STALE, $build->getStatus());
// Turn on preview_site.settings.proactive_stale_check.
$this->config('preview_site.settings')->set('proactive_stale_check', 1)->save();
// Change the additional entity's title.
$entity_test_1_title = $this->randomMachineName();
$entity_test_1->set('name', $entity_test_1_title);
$entity_test_1->save();
// The preview site build status should now be 'stale'.
// It requires a reload.
$this->assertEquals(PreviewSiteBuildInterface::STATUS_STALE, $build::load($build->id())->getStatus());
}
/**
* Tests generate and deployment queues..
*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment