@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Provide a generic transaction-oriented bulk job worker

Summary:
Depends on D18806. Ref T13025. See PHI173. Currently, Maniphest bulk edits are processed by a Maniphest-specific worker. I want to replace this with a generic worker which can apply transactional edits to any object.

This implements a generic worker, although it has no callers yet. Future changes give it callers, and later remove the Maniphest-specific worker.

Test Plan: See next changes.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13025

Differential Revision: https://secure.phabricator.com/D18862

+84
+2
src/__phutil_library_map__.php
··· 2729 2729 'PhabricatorEdgesDestructionEngineExtension' => 'infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php', 2730 2730 'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php', 2731 2731 'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php', 2732 + 'PhabricatorEditEngineBulkJobType' => 'applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php', 2732 2733 'PhabricatorEditEngineCheckboxesCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineCheckboxesCommentAction.php', 2733 2734 'PhabricatorEditEngineColumnsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineColumnsCommentAction.php', 2734 2735 'PhabricatorEditEngineCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineCommentAction.php', ··· 8110 8111 'PhabricatorPolicyInterface', 8111 8112 ), 8112 8113 'PhabricatorEditEngineAPIMethod' => 'ConduitAPIMethod', 8114 + 'PhabricatorEditEngineBulkJobType' => 'PhabricatorWorkerBulkJobType', 8113 8115 'PhabricatorEditEngineCheckboxesCommentAction' => 'PhabricatorEditEngineCommentAction', 8114 8116 'PhabricatorEditEngineColumnsCommentAction' => 'PhabricatorEditEngineCommentAction', 8115 8117 'PhabricatorEditEngineCommentAction' => 'Phobject',
+82
src/applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineBulkJobType 4 + extends PhabricatorWorkerBulkJobType { 5 + 6 + public function getBulkJobTypeKey() { 7 + return 'transaction.edit'; 8 + } 9 + 10 + public function getJobName(PhabricatorWorkerBulkJob $job) { 11 + return pht('Bulk Edit'); 12 + } 13 + 14 + public function getDescriptionForConfirm(PhabricatorWorkerBulkJob $job) { 15 + return pht( 16 + 'You are about to apply a bulk edit which will affect '. 17 + '%s object(s).', 18 + new PhutilNumber($job->getSize())); 19 + } 20 + 21 + public function getJobSize(PhabricatorWorkerBulkJob $job) { 22 + return count($job->getParameter('objectPHIDs', array())); 23 + } 24 + 25 + public function getDoneURI(PhabricatorWorkerBulkJob $job) { 26 + return $job->getParameter('doneURI'); 27 + } 28 + 29 + public function createTasks(PhabricatorWorkerBulkJob $job) { 30 + $tasks = array(); 31 + 32 + foreach ($job->getParameter('objectPHIDs', array()) as $phid) { 33 + $tasks[] = PhabricatorWorkerBulkTask::initializeNewTask($job, $phid); 34 + } 35 + 36 + return $tasks; 37 + } 38 + 39 + public function runTask( 40 + PhabricatorUser $actor, 41 + PhabricatorWorkerBulkJob $job, 42 + PhabricatorWorkerBulkTask $task) { 43 + 44 + $object = id(new PhabricatorObjectQuery()) 45 + ->setViewer($actor) 46 + ->withPHIDs(array($task->getObjectPHID())) 47 + ->requireCapabilities( 48 + array( 49 + PhabricatorPolicyCapability::CAN_VIEW, 50 + PhabricatorPolicyCapability::CAN_EDIT, 51 + )) 52 + ->executeOne(); 53 + if (!$object) { 54 + return; 55 + } 56 + 57 + $raw_xactions = $job->getParameter('xactions'); 58 + $xactions = $this->buildTransactions($object, $raw_xactions); 59 + 60 + $editor = $object->getApplicationTransactionEditor() 61 + ->setActor($actor) 62 + ->setContentSource($job->newContentSource()) 63 + ->setContinueOnNoEffect(true) 64 + ->setContinueOnMissingFields(true) 65 + ->applyTransactions($object, $xactions); 66 + } 67 + 68 + private function buildTransactions($object, array $raw_xactions) { 69 + $xactions = array(); 70 + 71 + foreach ($raw_xactions as $raw_xaction) { 72 + $xaction = $object->getApplicationTransactionTemplate() 73 + ->setTransactionType($raw_xaction['type']) 74 + ->setNewValue($raw_xaction['value']); 75 + 76 + $xactions[] = $xaction; 77 + } 78 + 79 + return $xactions; 80 + } 81 + 82 + }