From b656ba019c09c4838607b1c1ec5bc941312d2671 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Thu, 2 Jun 2022 18:14:41 -0700 Subject: [PATCH] Civi::queue() - Add support for 'template' queues Overview -------- Suppose you are in the habit of making separate queue-instances for different batches of work. However, you want to allow the sysadmin to configure options like `type`, `batch_limit`, and `retry_interval`. Solution: Make a template After ----- ```php // Use the API to register a template, eg \Civi\Api4\Queue::create()->setValues([ 'name' => 'template-name', 'is_template' => TRUE, ... ])->execute(); // Later, create a queue from the template $q = Civi::queue('new-queue', ['template' => 'template-name']); ``` --- CRM/Queue/Service.php | 6 +++++ tests/phpunit/CRM/Queue/QueueTest.php | 32 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/CRM/Queue/Service.php b/CRM/Queue/Service.php index 0fd874a96b..338c46eac2 100644 --- a/CRM/Queue/Service.php +++ b/CRM/Queue/Service.php @@ -142,6 +142,12 @@ class CRM_Queue_Service { return $loaded; } + if (isset($queueSpec['template'])) { + $base = $this->findQueueSpec(['name' => $queueSpec['template']]); + $reset = ['is_template' => 0]; + $queueSpec = array_merge($base, $reset, $queueSpec); + } + $this->validateQueueSpec($queueSpec); $dao = new CRM_Queue_DAO_Queue(); diff --git a/tests/phpunit/CRM/Queue/QueueTest.php b/tests/phpunit/CRM/Queue/QueueTest.php index 781da94e5f..e3fe0010aa 100644 --- a/tests/phpunit/CRM/Queue/QueueTest.php +++ b/tests/phpunit/CRM/Queue/QueueTest.php @@ -107,6 +107,38 @@ class CRM_Queue_QueueTest extends CiviUnitTestCase { } } + public function testTemplating() { + \Civi\Api4\Queue::create()->setValues([ + 'is_template' => TRUE, + 'name' => 'test/template', + 'type' => 'SqlParallel', + 'runner' => 'task', + 'error' => 'delete', + ])->execute(); + $this->assertDBQuery(1, "SELECT is_template FROM civicrm_queue WHERE name = 'test/template'"); + + $qActive = Civi::queue('test/my-active', [ + 'template' => 'test/template', + ]); + $this->assertEquals('test/my-active', $qActive->getName()); + $this->assertEquals('SqlParallel', $qActive->getSpec('type')); + $this->assertEquals('task', $qActive->getSpec('runner')); + $this->assertEquals('delete', $qActive->getSpec('error')); + $this->assertDBQuery('active', "SELECT status FROM civicrm_queue WHERE name = 'test/my-active'"); + $this->assertDBQuery(0, "SELECT is_template FROM civicrm_queue WHERE name = 'test/my-active'"); + + $qDraft = Civi::queue('test/my-draft', [ + 'template' => 'test/template', + 'status' => 'draft', + ]); + $this->assertEquals('test/my-draft', $qDraft->getName()); + $this->assertEquals('SqlParallel', $qDraft->getSpec('type')); + $this->assertEquals('task', $qDraft->getSpec('runner')); + $this->assertEquals('delete', $qDraft->getSpec('error')); + $this->assertDBQuery('draft', "SELECT status FROM civicrm_queue WHERE name = 'test/my-draft'"); + $this->assertDBQuery(0, "SELECT is_template FROM civicrm_queue WHERE name = 'test/my-active'"); + } + /** * Create a few queue items; alternately enqueue and dequeue various * -- 2.25.1