diff --git a/src/Jobs/ContentReviewNotificationJob.php b/src/Jobs/ContentReviewNotificationJob.php index a558952..379bb4b 100644 --- a/src/Jobs/ContentReviewNotificationJob.php +++ b/src/Jobs/ContentReviewNotificationJob.php @@ -5,9 +5,11 @@ use SilverStripe\ContentReview\Tasks\ContentReviewEmails; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\Config\Config; +use SilverStripe\HybridExecution\HybridOutput; use Symbiote\QueuedJobs\Services\AbstractQueuedJob; use Symbiote\QueuedJobs\Services\QueuedJob; use Symbiote\QueuedJobs\Services\QueuedJobService; +use Symfony\Component\Console\Input\ArrayInput; if (!class_exists(AbstractQueuedJob::class)) { return; @@ -94,7 +96,10 @@ public function process() $this->queueNextRun(); $task = ContentReviewEmails::create(); - $task->run(new HTTPRequest("GET", "/dev/tasks/ContentReviewEmails")); + $output = HybridOutput::create(HybridOutput::FORMAT_ANSI); + $input = new ArrayInput([]); + $input->setInteractive(false); + $task->run($input, $output); $this->currentStep = 1; $this->isComplete = true; diff --git a/src/Tasks/ContentReviewEmails.php b/src/Tasks/ContentReviewEmails.php index 2131796..d5c0ac4 100644 --- a/src/Tasks/ContentReviewEmails.php +++ b/src/Tasks/ContentReviewEmails.php @@ -3,11 +3,10 @@ namespace SilverStripe\ContentReview\Tasks; use Page; -use RuntimeException; use SilverStripe\ContentReview\Compatibility\ContentReviewCompatability; use SilverStripe\Control\Email\Email; -use SilverStripe\Control\HTTPRequest; use SilverStripe\Dev\BuildTask; +use SilverStripe\HybridExecution\HybridOutput; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\FieldType\DBDatetime; use SilverStripe\ORM\FieldType\DBField; @@ -16,6 +15,8 @@ use SilverStripe\SiteConfig\SiteConfig; use SilverStripe\View\ArrayData; use SilverStripe\View\SSViewer; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; /** * Daily task to send emails to the owners of content items when the review date rolls around. @@ -24,19 +25,16 @@ class ContentReviewEmails extends BuildTask { private array $invalid_emails = []; - /** - * @param HTTPRequest $request - * @throws RuntimeException - */ - public function run($request) + protected function execute(InputInterface $input, HybridOutput $output): int { if (!$this->isValidEmail($senderEmail = SiteConfig::current_site_config()->ReviewFrom)) { - throw new RuntimeException( + $output->writeln( sprintf( - 'Provided sender email address is invalid: "%s".', + 'Provided sender email address is invalid: "%s".', $senderEmail ) ); + return Command::FAILURE; } $compatibility = ContentReviewCompatability::start(); @@ -57,13 +55,16 @@ public function run($request) if (is_array($this->invalid_emails) && count($this->invalid_emails) > 0) { $plural = count($this->invalid_emails) > 1 ? 's are' : ' is'; - throw new RuntimeException( + $output->writeln( sprintf( - 'Provided email' . $plural . ' invalid: "%s".', + 'Provided email' . $plural . ' invalid: "%s".', implode(', ', $this->invalid_emails) ) ); + return Command::FAILURE; } + + return Command::SUCCESS; } /** diff --git a/src/Tasks/ContentReviewOwnerMigrationTask.php b/src/Tasks/ContentReviewOwnerMigrationTask.php index f3536b6..c0eb72d 100644 --- a/src/Tasks/ContentReviewOwnerMigrationTask.php +++ b/src/Tasks/ContentReviewOwnerMigrationTask.php @@ -2,24 +2,23 @@ namespace SilverStripe\ContentReview\Tasks; -use SilverStripe\Control\HTTPRequest; use SilverStripe\Dev\BuildTask; +use SilverStripe\HybridExecution\HybridOutput; use SilverStripe\ORM\DB; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; /** * Task which migrates the ContentReview Module's SiteTree->OwnerID column to a new column name. */ class ContentReviewOwnerMigrationTask extends BuildTask { - /** - * @param HTTPRequest $request - */ - public function run($request) + protected function execute(InputInterface $input, HybridOutput $output): int { $results = DB::query("SHOW columns from \"SiteTree\" WHERE \"field\" = 'OwnerID'"); if ($results->numRecords() == 0) { - echo "

No need to run task. SiteTree->OwnerID doesn't exist

"; + $output->writeln('No need to run task. SiteTree->OwnerID doesn\'t exist'); } else { DB::query("UPDATE \"SiteTree\" SET \"ContentReviewOwnerID\" = \"OwnerID\""); DB::query("UPDATE \"SiteTree_Live\" SET \"ContentReviewOwnerID\" = \"OwnerID\""); @@ -27,7 +26,9 @@ public function run($request) DB::query("ALTER TABLE \"SiteTree\" DROP COLUMN \"OwnerID\""); DB::query("ALTER TABLE \"SiteTree_Live\" DROP COLUMN \"OwnerID\""); DB::query("ALTER TABLE \"SiteTree_Versions\" DROP COLUMN \"OwnerID\""); - echo "

Migrated 3 tables. Dropped obsolete OwnerID column

"; + $output->writeln('Migrated 3 tables. Dropped obsolete OwnerID column'); } + + return Command::SUCCESS; } } diff --git a/tests/php/ContentReviewNotificationTest.php b/tests/php/ContentReviewNotificationTest.php index 241dd9c..c3e74c5 100644 --- a/tests/php/ContentReviewNotificationTest.php +++ b/tests/php/ContentReviewNotificationTest.php @@ -18,6 +18,9 @@ use SilverStripe\Security\Member; use SilverStripe\SiteConfig\SiteConfig; use SilverStripe\ContentReview\Models\ContentReviewLog; +use SilverStripe\HybridExecution\HybridOutput; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\BufferedOutput; class ContentReviewNotificationTest extends SapphireTest { @@ -58,7 +61,11 @@ public function testContentReviewEmails() $childParentPage->write(); $task = new ContentReviewEmails(); - $task->run(new HTTPRequest('GET', '/dev/tasks/ContentReviewEmails')); + $buffer = new BufferedOutput(); + $output = new HybridOutput(HybridOutput::FORMAT_ANSI, wrappedOutput: $buffer); + $input = new ArrayInput([]); + $input->setInteractive(false); + $task->run($input, $output); // Set template variables (as per variable case) $ToEmail = 'author@example.com'; @@ -124,7 +131,11 @@ public function testContentReviewNeeded() $this->assertCount(1, $childParentPage->ReviewLogs()); $task = new ContentReviewEmails(); - $task->run(new HTTPRequest('GET', '/dev/tasks/ContentReviewEmails')); + $buffer = new BufferedOutput(); + $output = new HybridOutput(HybridOutput::FORMAT_ANSI, wrappedOutput: $buffer); + $input = new ArrayInput([]); + $input->setInteractive(false); + $task->run($input, $output); // Expecting to not send the email as content review for page is done $email = $this->findEmail($member->Email);