@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

Fully modularize DestructionEngine

Summary: Ref T9979. Convert all DestructionEngine behaviors to extensions.

Test Plan:
{F1033244}

Destroyed an object, verifying:

- Herald transcripts were destroyed;
- edges were destroyed;
- flags were destroyed;
- tokens were destroyed;
- transactions were destroyed;
- worker tasks were cancelled.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T9979

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

+246 -118
+17 -3
src/__phutil_library_map__.php
··· 1196 1196 'HeraldTransactionQuery' => 'applications/herald/query/HeraldTransactionQuery.php', 1197 1197 'HeraldTranscript' => 'applications/herald/storage/transcript/HeraldTranscript.php', 1198 1198 'HeraldTranscriptController' => 'applications/herald/controller/HeraldTranscriptController.php', 1199 + 'HeraldTranscriptDestructionEngineExtension' => 'applications/herald/engineextension/HeraldTranscriptDestructionEngineExtension.php', 1199 1200 'HeraldTranscriptGarbageCollector' => 'applications/herald/garbagecollector/HeraldTranscriptGarbageCollector.php', 1200 1201 'HeraldTranscriptListController' => 'applications/herald/controller/HeraldTranscriptListController.php', 1201 1202 'HeraldTranscriptQuery' => 'applications/herald/query/HeraldTranscriptQuery.php', ··· 1876 1877 'PhabricatorChatLogQuery' => 'applications/chatlog/query/PhabricatorChatLogQuery.php', 1877 1878 'PhabricatorChunkedFileStorageEngine' => 'applications/files/engine/PhabricatorChunkedFileStorageEngine.php', 1878 1879 'PhabricatorClusterConfigOptions' => 'applications/config/option/PhabricatorClusterConfigOptions.php', 1879 - 'PhabricatorCommentEditEngineExtension' => 'applications/transactions/editengineextension/PhabricatorCommentEditEngineExtension.php', 1880 + 'PhabricatorCommentEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorCommentEditEngineExtension.php', 1880 1881 'PhabricatorCommentEditField' => 'applications/transactions/editfield/PhabricatorCommentEditField.php', 1881 1882 'PhabricatorCommentEditType' => 'applications/transactions/edittype/PhabricatorCommentEditType.php', 1882 1883 'PhabricatorCommitBranchesField' => 'applications/repository/customfield/PhabricatorCommitBranchesField.php', ··· 2157 2158 'PhabricatorEdgeTestCase' => 'infrastructure/edges/__tests__/PhabricatorEdgeTestCase.php', 2158 2159 'PhabricatorEdgeType' => 'infrastructure/edges/type/PhabricatorEdgeType.php', 2159 2160 'PhabricatorEdgeTypeTestCase' => 'infrastructure/edges/type/__tests__/PhabricatorEdgeTypeTestCase.php', 2161 + 'PhabricatorEdgesDestructionEngineExtension' => 'infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php', 2160 2162 'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php', 2161 2163 'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php', 2162 2164 'PhabricatorEditEngineCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineCommentAction.php', ··· 2180 2182 'PhabricatorEditEngineConfigurationTransactionQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationTransactionQuery.php', 2181 2183 'PhabricatorEditEngineConfigurationViewController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php', 2182 2184 'PhabricatorEditEngineController' => 'applications/transactions/controller/PhabricatorEditEngineController.php', 2183 - 'PhabricatorEditEngineExtension' => 'applications/transactions/editengineextension/PhabricatorEditEngineExtension.php', 2184 - 'PhabricatorEditEngineExtensionModule' => 'applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php', 2185 + 'PhabricatorEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorEditEngineExtension.php', 2186 + 'PhabricatorEditEngineExtensionModule' => 'applications/transactions/engineextension/PhabricatorEditEngineExtensionModule.php', 2185 2187 'PhabricatorEditEngineListController' => 'applications/transactions/controller/PhabricatorEditEngineListController.php', 2186 2188 'PhabricatorEditEngineQuery' => 'applications/transactions/query/PhabricatorEditEngineQuery.php', 2187 2189 'PhabricatorEditEngineSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineSearchEngine.php', ··· 2315 2317 'PhabricatorFlagController' => 'applications/flag/controller/PhabricatorFlagController.php', 2316 2318 'PhabricatorFlagDAO' => 'applications/flag/storage/PhabricatorFlagDAO.php', 2317 2319 'PhabricatorFlagDeleteController' => 'applications/flag/controller/PhabricatorFlagDeleteController.php', 2320 + 'PhabricatorFlagDestructionEngineExtension' => 'applications/flag/engineextension/PhabricatorFlagDestructionEngineExtension.php', 2318 2321 'PhabricatorFlagEditController' => 'applications/flag/controller/PhabricatorFlagEditController.php', 2319 2322 'PhabricatorFlagListController' => 'applications/flag/controller/PhabricatorFlagListController.php', 2320 2323 'PhabricatorFlagQuery' => 'applications/flag/query/PhabricatorFlagQuery.php', ··· 2538 2541 'PhabricatorNotificationClient' => 'applications/notification/client/PhabricatorNotificationClient.php', 2539 2542 'PhabricatorNotificationConfigOptions' => 'applications/config/option/PhabricatorNotificationConfigOptions.php', 2540 2543 'PhabricatorNotificationController' => 'applications/notification/controller/PhabricatorNotificationController.php', 2544 + 'PhabricatorNotificationDestructionEngineExtension' => 'applications/notification/engineextension/PhabricatorNotificationDestructionEngineExtension.php', 2541 2545 'PhabricatorNotificationIndividualController' => 'applications/notification/controller/PhabricatorNotificationIndividualController.php', 2542 2546 'PhabricatorNotificationListController' => 'applications/notification/controller/PhabricatorNotificationListController.php', 2543 2547 'PhabricatorNotificationPanelController' => 'applications/notification/controller/PhabricatorNotificationPanelController.php', ··· 3213 3217 'PhabricatorTokenCount' => 'applications/tokens/storage/PhabricatorTokenCount.php', 3214 3218 'PhabricatorTokenCountQuery' => 'applications/tokens/query/PhabricatorTokenCountQuery.php', 3215 3219 'PhabricatorTokenDAO' => 'applications/tokens/storage/PhabricatorTokenDAO.php', 3220 + 'PhabricatorTokenDestructionEngineExtension' => 'applications/tokens/engineextension/PhabricatorTokenDestructionEngineExtension.php', 3216 3221 'PhabricatorTokenGiveController' => 'applications/tokens/controller/PhabricatorTokenGiveController.php', 3217 3222 'PhabricatorTokenGiven' => 'applications/tokens/storage/PhabricatorTokenGiven.php', 3218 3223 'PhabricatorTokenGivenController' => 'applications/tokens/controller/PhabricatorTokenGivenController.php', ··· 3231 3236 'PhabricatorTooltipUIExample' => 'applications/uiexample/examples/PhabricatorTooltipUIExample.php', 3232 3237 'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php', 3233 3238 'PhabricatorTransactionsApplication' => 'applications/transactions/application/PhabricatorTransactionsApplication.php', 3239 + 'PhabricatorTransactionsDestructionEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsDestructionEngineExtension.php', 3234 3240 'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php', 3235 3241 'PhabricatorTranslationsConfigOptions' => 'applications/config/option/PhabricatorTranslationsConfigOptions.php', 3236 3242 'PhabricatorTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorTriggerAction.php', ··· 3313 3319 'PhabricatorWorkerBulkJobWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobWorker.php', 3314 3320 'PhabricatorWorkerBulkTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkTask.php', 3315 3321 'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php', 3322 + 'PhabricatorWorkerDestructionEngineExtension' => 'infrastructure/daemon/workers/engineextension/PhabricatorWorkerDestructionEngineExtension.php', 3316 3323 'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php', 3317 3324 'PhabricatorWorkerManagementCancelWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php', 3318 3325 'PhabricatorWorkerManagementExecuteWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php', ··· 5213 5220 'PhabricatorDestructibleInterface', 5214 5221 ), 5215 5222 'HeraldTranscriptController' => 'HeraldController', 5223 + 'HeraldTranscriptDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 5216 5224 'HeraldTranscriptGarbageCollector' => 'PhabricatorGarbageCollector', 5217 5225 'HeraldTranscriptListController' => 'HeraldController', 5218 5226 'HeraldTranscriptQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 6329 6337 'PhabricatorEdgeTestCase' => 'PhabricatorTestCase', 6330 6338 'PhabricatorEdgeType' => 'Phobject', 6331 6339 'PhabricatorEdgeTypeTestCase' => 'PhabricatorTestCase', 6340 + 'PhabricatorEdgesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 6332 6341 'PhabricatorEditEngine' => array( 6333 6342 'Phobject', 6334 6343 'PhabricatorPolicyInterface', ··· 6525 6534 'PhabricatorFlagController' => 'PhabricatorController', 6526 6535 'PhabricatorFlagDAO' => 'PhabricatorLiskDAO', 6527 6536 'PhabricatorFlagDeleteController' => 'PhabricatorFlagController', 6537 + 'PhabricatorFlagDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 6528 6538 'PhabricatorFlagEditController' => 'PhabricatorFlagController', 6529 6539 'PhabricatorFlagListController' => 'PhabricatorFlagController', 6530 6540 'PhabricatorFlagQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 6766 6776 'PhabricatorNotificationClient' => 'Phobject', 6767 6777 'PhabricatorNotificationConfigOptions' => 'PhabricatorApplicationConfigOptions', 6768 6778 'PhabricatorNotificationController' => 'PhabricatorController', 6779 + 'PhabricatorNotificationDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 6769 6780 'PhabricatorNotificationIndividualController' => 'PhabricatorNotificationController', 6770 6781 'PhabricatorNotificationListController' => 'PhabricatorNotificationController', 6771 6782 'PhabricatorNotificationPanelController' => 'PhabricatorNotificationController', ··· 7571 7582 'PhabricatorTokenCount' => 'PhabricatorTokenDAO', 7572 7583 'PhabricatorTokenCountQuery' => 'PhabricatorOffsetPagedQuery', 7573 7584 'PhabricatorTokenDAO' => 'PhabricatorLiskDAO', 7585 + 'PhabricatorTokenDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 7574 7586 'PhabricatorTokenGiveController' => 'PhabricatorTokenController', 7575 7587 'PhabricatorTokenGiven' => array( 7576 7588 'PhabricatorTokenDAO', ··· 7591 7603 'PhabricatorTooltipUIExample' => 'PhabricatorUIExample', 7592 7604 'PhabricatorTransactions' => 'Phobject', 7593 7605 'PhabricatorTransactionsApplication' => 'PhabricatorApplication', 7606 + 'PhabricatorTransactionsDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 7594 7607 'PhabricatorTransformedFile' => 'PhabricatorFileDAO', 7595 7608 'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions', 7596 7609 'PhabricatorTriggerAction' => 'Phobject', ··· 7694 7707 'PhabricatorWorkerBulkJobWorker' => 'PhabricatorWorker', 7695 7708 'PhabricatorWorkerBulkTask' => 'PhabricatorWorkerDAO', 7696 7709 'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO', 7710 + 'PhabricatorWorkerDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 7697 7711 'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery', 7698 7712 'PhabricatorWorkerManagementCancelWorkflow' => 'PhabricatorWorkerManagementWorkflow', 7699 7713 'PhabricatorWorkerManagementExecuteWorkflow' => 'PhabricatorWorkerManagementWorkflow',
+35
src/applications/flag/engineextension/PhabricatorFlagDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorFlagDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'flags'; 7 + 8 + public function getExtensionName() { 9 + return pht('Flags'); 10 + } 11 + 12 + public function destroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + 16 + $object_phid = $object->getPHID(); 17 + 18 + if ($object instanceof PhabricatorFlaggableInterface) { 19 + $flags = id(new PhabricatorFlag())->loadAllWhere( 20 + 'objectPHID = %s', 21 + $object_phid); 22 + foreach ($flags as $flag) { 23 + $flag->delete(); 24 + } 25 + } 26 + 27 + $flags = id(new PhabricatorFlag())->loadAllWhere( 28 + 'ownerPHID = %s', 29 + $object_phid); 30 + foreach ($flags as $flag) { 31 + $flag->delete(); 32 + } 33 + } 34 + 35 + }
+26
src/applications/herald/engineextension/HeraldTranscriptDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class HeraldTranscriptDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'herald.transcripts'; 7 + 8 + public function getExtensionName() { 9 + return pht('Herald Transcripts'); 10 + } 11 + 12 + public function destroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + 16 + $object_phid = $object->getPHID(); 17 + 18 + $transcripts = id(new HeraldTranscript())->loadAllWhere( 19 + 'objectPHID = %s', 20 + $object_phid); 21 + foreach ($transcripts as $transcript) { 22 + $engine->destroyObject($transcript); 23 + } 24 + } 25 + 26 + }
+26
src/applications/notification/engineextension/PhabricatorNotificationDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorNotificationDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'notifications'; 7 + 8 + public function getExtensionName() { 9 + return pht('Notifications'); 10 + } 11 + 12 + public function destroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + 16 + $table = new PhabricatorFeedStoryNotification(); 17 + $conn_w = $table->establishConnection('w'); 18 + 19 + queryfx( 20 + $conn_w, 21 + 'DELETE FROM %T WHERE primaryObjectPHID = %s', 22 + $table->getTableName(), 23 + $object->getPHID()); 24 + } 25 + 26 + }
+9 -113
src/applications/system/engine/PhabricatorDestructionEngine.php
··· 38 38 39 39 $object->destroyObjectPermanently($this); 40 40 41 - $extensions = PhabricatorDestructionEngineExtension::getAllExtensions(); 42 - foreach ($extensions as $key => $extension) { 43 - if (!$extension->canDestroyObject($this, $object)) { 44 - unset($extensions[$key]); 45 - continue; 46 - } 47 - } 48 - 49 - foreach ($extensions as $key => $extension) { 50 - $extension->destroyObject($this, $object); 51 - } 52 - 53 41 if ($object_phid) { 54 - $this->destroyEdges($object_phid); 55 - 56 - if ($object instanceof PhabricatorApplicationTransactionInterface) { 57 - $template = $object->getApplicationTransactionTemplate(); 58 - $this->destroyTransactions($template, $object_phid); 59 - } 60 - 61 - $this->destroyWorkerTasks($object_phid); 62 - $this->destroyNotifications($object_phid); 63 - } 64 - 65 - // Nuke any Herald transcripts of the object, because they may contain 66 - // field data. 67 - 68 - // TODO: Define an interface so we don't have to do this for transactions 69 - // and other objects with no Herald adapters? 70 - $transcripts = id(new HeraldTranscript())->loadAllWhere( 71 - 'objectPHID = %s', 72 - $object_phid); 73 - foreach ($transcripts as $transcript) { 74 - $transcript->destroyObjectPermanently($this); 75 - } 76 - 77 - // TODO: Remove stuff from search indexes? 78 - 79 - if ($object instanceof PhabricatorFlaggableInterface) { 80 - $flags = id(new PhabricatorFlag())->loadAllWhere( 81 - 'objectPHID = %s', $object_phid); 82 - 83 - foreach ($flags as $flag) { 84 - $flag->delete(); 85 - } 86 - } 87 - 88 - $flags = id(new PhabricatorFlag())->loadAllWhere( 89 - 'ownerPHID = %s', $object_phid); 90 - foreach ($flags as $flag) { 91 - $flag->delete(); 92 - } 93 - 94 - if ($object instanceof PhabricatorTokenReceiverInterface) { 95 - $tokens = id(new PhabricatorTokenGiven())->loadAllWhere( 96 - 'objectPHID = %s', $object_phid); 97 - 98 - foreach ($tokens as $token) { 99 - $token->delete(); 100 - } 101 - } 102 - } 103 - 104 - private function destroyEdges($src_phid) { 105 - try { 106 - $edges = id(new PhabricatorEdgeQuery()) 107 - ->withSourcePHIDs(array($src_phid)) 108 - ->execute(); 109 - } catch (Exception $ex) { 110 - // This is (presumably) a "no edges for this PHID type" exception. 111 - return; 112 - } 113 - 114 - $editor = new PhabricatorEdgeEditor(); 115 - foreach ($edges as $type => $type_edges) { 116 - foreach ($type_edges as $src => $src_edges) { 117 - foreach ($src_edges as $dst => $edge) { 118 - $editor->removeEdge($edge['src'], $edge['type'], $edge['dst']); 42 + $extensions = PhabricatorDestructionEngineExtension::getAllExtensions(); 43 + foreach ($extensions as $key => $extension) { 44 + if (!$extension->canDestroyObject($this, $object)) { 45 + unset($extensions[$key]); 46 + continue; 119 47 } 120 48 } 121 - } 122 - $editor->save(); 123 - } 124 49 125 - private function destroyTransactions( 126 - PhabricatorApplicationTransaction $template, 127 - $object_phid) { 128 - 129 - $xactions = $template->loadAllWhere('objectPHID = %s', $object_phid); 130 - foreach ($xactions as $xaction) { 131 - $this->destroyObject($xaction); 132 - } 133 - } 134 - 135 - private function destroyWorkerTasks($object_phid) { 136 - $tasks = id(new PhabricatorWorkerActiveTask())->loadAllWhere( 137 - 'objectPHID = %s', 138 - $object_phid); 139 - 140 - foreach ($tasks as $task) { 141 - $task->archiveTask( 142 - PhabricatorWorkerArchiveTask::RESULT_CANCELLED, 143 - 0); 50 + foreach ($extensions as $key => $extension) { 51 + $extension->destroyObject($this, $object); 52 + } 144 53 } 145 54 } 146 55 147 - private function destroyNotifications($object_phid) { 148 - $table = new PhabricatorFeedStoryNotification(); 149 - $conn_w = $table->establishConnection('w'); 150 - 151 - queryfx( 152 - $conn_w, 153 - 'DELETE FROM %T WHERE primaryObjectPHID = %s', 154 - $table->getTableName(), 155 - $object_phid); 156 - } 157 - 158 - private function destroyAlmanacProperties($object_phid) {} 159 - 160 - public function getObjectPHID($object) { 56 + private function getObjectPHID($object) { 161 57 if (!is_object($object)) { 162 58 return null; 163 59 }
+6 -2
src/applications/system/engine/PhabricatorDestructionEngineExtension.php
··· 7 7 } 8 8 9 9 abstract public function getExtensionName(); 10 - abstract public function canDestroyObject( 10 + 11 + public function canDestroyObject( 11 12 PhabricatorDestructionEngine $engine, 12 - $object); 13 + $object) { 14 + return true; 15 + } 16 + 13 17 abstract public function destroyObject( 14 18 PhabricatorDestructionEngine $engine, 15 19 $object);
+31
src/applications/tokens/engineextension/PhabricatorTokenDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorTokenDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'tokens'; 7 + 8 + public function getExtensionName() { 9 + return pht('Tokens'); 10 + } 11 + 12 + public function canDestroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + return ($object instanceof PhabricatorTokenReceiverInterface); 16 + } 17 + 18 + public function destroyObject( 19 + PhabricatorDestructionEngine $engine, 20 + $object) { 21 + 22 + $tokens = id(new PhabricatorTokenGiven())->loadAllWhere( 23 + 'objectPHID = %s', 24 + $object->getPHID()); 25 + 26 + foreach ($tokens as $token) { 27 + $token->delete(); 28 + } 29 + } 30 + 31 + }
src/applications/transactions/editengineextension/PhabricatorCommentEditEngineExtension.php src/applications/transactions/engineextension/PhabricatorCommentEditEngineExtension.php
src/applications/transactions/editengineextension/PhabricatorEditEngineExtension.php src/applications/transactions/engineextension/PhabricatorEditEngineExtension.php
src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php src/applications/transactions/engineextension/PhabricatorEditEngineExtensionModule.php
+31
src/applications/transactions/engineextension/PhabricatorTransactionsDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorTransactionsDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'transactions'; 7 + 8 + public function getExtensionName() { 9 + return pht('Transactions'); 10 + } 11 + 12 + public function canDestroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + return ($object instanceof PhabricatorApplicationTransactionInterface); 16 + } 17 + 18 + public function destroyObject( 19 + PhabricatorDestructionEngine $engine, 20 + $object) { 21 + 22 + $template = $object->getApplicationTransactionTemplate(); 23 + $xactions = $template->loadAllWhere( 24 + 'objectPHID = %s', 25 + $object->getPHID()); 26 + foreach ($xactions as $xaction) { 27 + $engine->destroyObject($xaction); 28 + } 29 + } 30 + 31 + }
+27
src/infrastructure/daemon/workers/engineextension/PhabricatorWorkerDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorWorkerDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'workers'; 7 + 8 + public function getExtensionName() { 9 + return pht('Worker Tasks'); 10 + } 11 + 12 + public function destroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + 16 + $tasks = id(new PhabricatorWorkerActiveTask())->loadAllWhere( 17 + 'objectPHID = %s', 18 + $object->getPHID()); 19 + 20 + foreach ($tasks as $task) { 21 + $task->archiveTask( 22 + PhabricatorWorkerArchiveTask::RESULT_CANCELLED, 23 + 0); 24 + } 25 + } 26 + 27 + }
+38
src/infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php
··· 1 + <?php 2 + 3 + final class PhabricatorEdgesDestructionEngineExtension 4 + extends PhabricatorDestructionEngineExtension { 5 + 6 + const EXTENSIONKEY = 'edges'; 7 + 8 + public function getExtensionName() { 9 + return pht('Edges'); 10 + } 11 + 12 + public function destroyObject( 13 + PhabricatorDestructionEngine $engine, 14 + $object) { 15 + 16 + $src_phid = $object->getPHID(); 17 + 18 + try { 19 + $edges = id(new PhabricatorEdgeQuery()) 20 + ->withSourcePHIDs(array($src_phid)) 21 + ->execute(); 22 + } catch (Exception $ex) { 23 + // This is (presumably) a "no edges for this PHID type" exception. 24 + return; 25 + } 26 + 27 + $editor = new PhabricatorEdgeEditor(); 28 + foreach ($edges as $type => $type_edges) { 29 + foreach ($type_edges as $src => $src_edges) { 30 + foreach ($src_edges as $dst => $edge) { 31 + $editor->removeEdge($edge['src'], $edge['type'], $edge['dst']); 32 + } 33 + } 34 + } 35 + $editor->save(); 36 + } 37 + 38 + }