@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

Add transactions to Drydock blueprint editing

Summary: Ref T2015. Fixes TODO.

Test Plan: {F100338}

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T2015

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

+177 -7
+21
resources/sql/autopatches/20140109.ddxactions.sql
··· 1 + CREATE TABLE {$NAMESPACE}_drydock.drydock_blueprinttransaction ( 2 + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 3 + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, 4 + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, 5 + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, 6 + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, 7 + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, 8 + commentPHID VARCHAR(64) COLLATE utf8_bin, 9 + commentVersion INT UNSIGNED NOT NULL, 10 + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, 11 + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, 12 + newValue LONGTEXT NOT NULL COLLATE utf8_bin, 13 + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, 14 + metadata LONGTEXT NOT NULL COLLATE utf8_bin, 15 + dateCreated INT UNSIGNED NOT NULL, 16 + dateModified INT UNSIGNED NOT NULL, 17 + 18 + UNIQUE KEY `key_phid` (phid), 19 + KEY `key_object` (objectPHID) 20 + 21 + ) ENGINE=InnoDB, COLLATE utf8_general_ci;
+6
src/__phutil_library_map__.php
··· 647 647 'DrydockBlueprintController' => 'applications/drydock/controller/DrydockBlueprintController.php', 648 648 'DrydockBlueprintCreateController' => 'applications/drydock/controller/DrydockBlueprintCreateController.php', 649 649 'DrydockBlueprintEditController' => 'applications/drydock/controller/DrydockBlueprintEditController.php', 650 + 'DrydockBlueprintEditor' => 'applications/drydock/editor/DrydockBlueprintEditor.php', 650 651 'DrydockBlueprintImplementation' => 'applications/drydock/blueprint/DrydockBlueprintImplementation.php', 651 652 'DrydockBlueprintListController' => 'applications/drydock/controller/DrydockBlueprintListController.php', 652 653 'DrydockBlueprintQuery' => 'applications/drydock/query/DrydockBlueprintQuery.php', 653 654 'DrydockBlueprintScopeGuard' => 'applications/drydock/util/DrydockBlueprintScopeGuard.php', 654 655 'DrydockBlueprintSearchEngine' => 'applications/drydock/query/DrydockBlueprintSearchEngine.php', 656 + 'DrydockBlueprintTransaction' => 'applications/drydock/storage/DrydockBlueprintTransaction.php', 657 + 'DrydockBlueprintTransactionQuery' => 'applications/drydock/query/DrydockBlueprintTransactionQuery.php', 655 658 'DrydockBlueprintViewController' => 'applications/drydock/controller/DrydockBlueprintViewController.php', 656 659 'DrydockCapabilityCreateBlueprints' => 'applications/drydock/capability/DrydockCapabilityCreateBlueprints.php', 657 660 'DrydockCapabilityDefaultEdit' => 'applications/drydock/capability/DrydockCapabilityDefaultEdit.php', ··· 3075 3078 'DrydockBlueprintController' => 'DrydockController', 3076 3079 'DrydockBlueprintCreateController' => 'DrydockBlueprintController', 3077 3080 'DrydockBlueprintEditController' => 'DrydockBlueprintController', 3081 + 'DrydockBlueprintEditor' => 'PhabricatorApplicationTransactionEditor', 3078 3082 'DrydockBlueprintListController' => 3079 3083 array( 3080 3084 0 => 'DrydockBlueprintController', ··· 3082 3086 ), 3083 3087 'DrydockBlueprintQuery' => 'DrydockQuery', 3084 3088 'DrydockBlueprintSearchEngine' => 'PhabricatorApplicationSearchEngine', 3089 + 'DrydockBlueprintTransaction' => 'PhabricatorApplicationTransaction', 3090 + 'DrydockBlueprintTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3085 3091 'DrydockBlueprintViewController' => 'DrydockBlueprintController', 3086 3092 'DrydockCapabilityCreateBlueprints' => 'PhabricatorPolicyCapability', 3087 3093 'DrydockCapabilityDefaultEdit' => 'PhabricatorPolicyCapability',
+20 -6
src/applications/drydock/controller/DrydockBlueprintEditController.php
··· 57 57 $errors[] = pht('You must name this blueprint.'); 58 58 } 59 59 60 - // TODO: We should use transactions here. 61 - $blueprint->setViewPolicy($v_view_policy); 62 - $blueprint->setEditPolicy($v_edit_policy); 63 - $blueprint->setBlueprintName($v_name); 60 + if (!$errors) { 61 + $xactions = array(); 62 + 63 + $xactions[] = id(new DrydockBlueprintTransaction()) 64 + ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) 65 + ->setNewValue($v_view_policy); 64 66 65 - if (!$errors) { 66 - $blueprint->save(); 67 + $xactions[] = id(new DrydockBlueprintTransaction()) 68 + ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY) 69 + ->setNewValue($v_edit_policy); 70 + 71 + $xactions[] = id(new DrydockBlueprintTransaction()) 72 + ->setTransactionType(DrydockBlueprintTransaction::TYPE_NAME) 73 + ->setNewValue($v_name); 74 + 75 + $editor = id(new DrydockBlueprintEditor()) 76 + ->setActor($viewer) 77 + ->setContentSourceFromRequest($request) 78 + ->setContinueOnNoEffect(true); 79 + 80 + $editor->applyTransactions($blueprint, $xactions); 67 81 68 82 $id = $blueprint->getID(); 69 83 $save_uri = $this->getApplicationURI("blueprint/{$id}/");
+16 -1
src/applications/drydock/controller/DrydockBlueprintViewController.php
··· 53 53 ->setHeader($header) 54 54 ->addPropertyList($properties); 55 55 56 + $xactions = id(new DrydockBlueprintTransactionQuery()) 57 + ->setViewer($viewer) 58 + ->withObjectPHIDs(array($blueprint->getPHID())) 59 + ->execute(); 60 + 61 + $engine = id(new PhabricatorMarkupEngine()) 62 + ->setViewer($viewer); 63 + 64 + $timeline = id(new PhabricatorApplicationTransactionView()) 65 + ->setUser($viewer) 66 + ->setObjectPHID($blueprint->getPHID()) 67 + ->setTransactions($xactions) 68 + ->setMarkupEngine($engine); 69 + 56 70 return $this->buildApplicationPage( 57 71 array( 58 72 $crumbs, 59 73 $object_box, 60 - $resource_list 74 + $resource_list, 75 + $timeline, 61 76 ), 62 77 array( 63 78 'device' => true,
+65
src/applications/drydock/editor/DrydockBlueprintEditor.php
··· 1 + <?php 2 + 3 + final class DrydockBlueprintEditor 4 + extends PhabricatorApplicationTransactionEditor { 5 + 6 + public function getTransactionTypes() { 7 + $types = parent::getTransactionTypes(); 8 + 9 + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 10 + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 11 + $types[] = DrydockBlueprintTransaction::TYPE_NAME; 12 + 13 + return $types; 14 + } 15 + 16 + protected function getCustomTransactionOldValue( 17 + PhabricatorLiskDAO $object, 18 + PhabricatorApplicationTransaction $xaction) { 19 + 20 + switch ($xaction->getTransactionType()) { 21 + case DrydockBlueprintTransaction::TYPE_NAME: 22 + return $object->getBlueprintName(); 23 + } 24 + } 25 + 26 + protected function getCustomTransactionNewValue( 27 + PhabricatorLiskDAO $object, 28 + PhabricatorApplicationTransaction $xaction) { 29 + 30 + switch ($xaction->getTransactionType()) { 31 + case DrydockBlueprintTransaction::TYPE_NAME: 32 + return $xaction->getNewValue(); 33 + } 34 + } 35 + 36 + protected function applyCustomInternalTransaction( 37 + PhabricatorLiskDAO $object, 38 + PhabricatorApplicationTransaction $xaction) { 39 + 40 + switch ($xaction->getTransactionType()) { 41 + case DrydockBlueprintTransaction::TYPE_NAME: 42 + $object->setBlueprintName($xaction->getNewValue()); 43 + break; 44 + } 45 + } 46 + 47 + protected function applyCustomExternalTransaction( 48 + PhabricatorLiskDAO $object, 49 + PhabricatorApplicationTransaction $xaction) { 50 + return; 51 + } 52 + 53 + protected function extractFilePHIDsFromCustomTransaction( 54 + PhabricatorLiskDAO $object, 55 + PhabricatorApplicationTransaction $xaction) { 56 + return array(); 57 + } 58 + 59 + protected function shouldSendMail( 60 + PhabricatorLiskDAO $object, 61 + array $xactions) { 62 + return false; 63 + } 64 + 65 + }
+10
src/applications/drydock/query/DrydockBlueprintTransactionQuery.php
··· 1 + <?php 2 + 3 + final class DrydockBlueprintTransactionQuery 4 + extends PhabricatorApplicationTransactionQuery { 5 + 6 + public function getTemplateApplicationTransaction() { 7 + return new DrydockBlueprintTransaction(); 8 + } 9 + 10 + }
+39
src/applications/drydock/storage/DrydockBlueprintTransaction.php
··· 1 + <?php 2 + 3 + final class DrydockBlueprintTransaction 4 + extends PhabricatorApplicationTransaction { 5 + 6 + const TYPE_NAME = 'drydock:blueprint:name'; 7 + 8 + public function getApplicationName() { 9 + return 'drydock'; 10 + } 11 + 12 + public function getApplicationTransactionType() { 13 + return DrydockPHIDTypeBlueprint::TYPECONST; 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + $author_handle = $this->renderHandleLink($this->getAuthorPHID()); 20 + 21 + switch ($this->getTransactionType()) { 22 + case self::TYPE_NAME: 23 + if (!strlen($old)) { 24 + return pht( 25 + '%s created this blueprint.', 26 + $author_handle); 27 + } else { 28 + return pht( 29 + '%s renamed this blueprint from "%s" to "%s".', 30 + $author_handle, 31 + $old, 32 + $new); 33 + } 34 + } 35 + 36 + return parent::getTitle(); 37 + } 38 + 39 + }