diff --git a/web/modules/custom/joinup_assessment/src/Drush/Commands/WebformAssessmentCommands.php b/web/modules/custom/joinup_assessment/src/Drush/Commands/WebformAssessmentCommands.php index d4fa0805282152a3c5301b51cfe31bf141c2b552..018ffc228efe34bf64c61c6a62515a1313dbbfbe 100644 --- a/web/modules/custom/joinup_assessment/src/Drush/Commands/WebformAssessmentCommands.php +++ b/web/modules/custom/joinup_assessment/src/Drush/Commands/WebformAssessmentCommands.php @@ -4,18 +4,36 @@ namespace Drupal\joinup_assessment\Drush\Commands; +use Consolidation\AnnotatedCommand\CommandData; use Consolidation\AnnotatedCommand\Hooks\HookManager; +use Drupal\Core\DependencyInjection\AutowireTrait; +use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; +use Drupal\mysql\Driver\Database\mysql\Connection; use Drush\Attributes as CLI; use Drush\Commands\DrushCommands; use Drush\Commands\sql\sanitize\SanitizeCommands; +use Drush\Commands\sql\sanitize\SanitizePluginInterface; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\DependencyInjection\Attribute\Autowire; /** * Overwrites Webform Drush sanitization plugins. * * @see \Drush\Commands\sql\sanitize\SanitizeCommands::sanitize() */ -class WebformAssessmentCommands extends DrushCommands { +class WebformAssessmentCommands extends DrushCommands implements SanitizePluginInterface { + + use AutowireTrait; + + public function __construct( + #[Autowire(service: 'database')] + protected readonly Connection $database, + protected readonly EntityTypeManagerInterface $entityTypeManager, + protected readonly ModuleHandlerInterface $moduleHandler, + ) { + parent::__construct(); + } /** * Disables default webform sanitization. @@ -31,4 +49,40 @@ public function disableDefaultWebformSanitization(InputInterface $input): void { $input->setOption('sanitize-webform-submissions', 'no'); } + /** + * {@inheritdoc} + */ + #[CLI\Hook(type: HookManager::POST_COMMAND_HOOK, target: 'sql-sanitize')] + public function sanitize($result, CommandData $commandData): void { + $webformStorage = $this->entityTypeManager->getStorage('webform_submission'); + $querySubmission = $webformStorage->getQuery() + ->condition('webform_id', 'assessment', '!=') + ->accessCheck(FALSE); + + do { + $sids = $querySubmission->range(0, 50)->execute(); + + if (!empty($sids)) { + $webformStorage->delete( + $webformStorage->loadMultiple($sids) + ); + } + } while (!empty($sids)); + + if ($this->moduleHandler->moduleExists('webform_submission_log')) { + $this->database->truncate('webform_submission_log')->execute(); + } + + $this->logger() + ->success('Webform submission tables truncated except for the assessment.'); + } + + /** + * {@inheritdoc} + */ + #[CLI\Hook(type: HookManager::ON_EVENT, target: SanitizeCommands::CONFIRMS)] + public function messages(&$messages, InputInterface $input): void { + $messages[] = dt('Sanitize webform submission data except for the assessment.'); + } + }