@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.

Modularize Almanac property transactions

Summary:
Depends on D19329. Ref T13120. Ref T12414. Recent changes have mostly modularized Almanac transactions, but the "property" transactions remained written in an older style with the logic on the Editor/Transaction classes.

This moves them to modern modular transactions. These end up being a little bit copy-pastey, but it doesn't feel too terribly bad.

Test Plan: Created, edited, and deleted properties on services, devices and bindings. Grepped for removed constants.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13120, T12414

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

+332 -273
+23 -11
src/__phutil_library_map__.php
··· 12 12 'AlamancServiceEditConduitAPIMethod' => 'applications/almanac/conduit/AlamancServiceEditConduitAPIMethod.php', 13 13 'AlmanacAddress' => 'applications/almanac/util/AlmanacAddress.php', 14 14 'AlmanacBinding' => 'applications/almanac/storage/AlmanacBinding.php', 15 + 'AlmanacBindingDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php', 15 16 'AlmanacBindingDisableController' => 'applications/almanac/controller/AlmanacBindingDisableController.php', 16 17 'AlmanacBindingDisableTransaction' => 'applications/almanac/xaction/AlmanacBindingDisableTransaction.php', 17 18 'AlmanacBindingEditController' => 'applications/almanac/controller/AlmanacBindingEditController.php', ··· 20 21 'AlmanacBindingPHIDType' => 'applications/almanac/phid/AlmanacBindingPHIDType.php', 21 22 'AlmanacBindingPropertyEditEngine' => 'applications/almanac/editor/AlmanacBindingPropertyEditEngine.php', 22 23 'AlmanacBindingQuery' => 'applications/almanac/query/AlmanacBindingQuery.php', 24 + 'AlmanacBindingSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php', 23 25 'AlmanacBindingTableView' => 'applications/almanac/view/AlmanacBindingTableView.php', 24 26 'AlmanacBindingTransaction' => 'applications/almanac/storage/AlmanacBindingTransaction.php', 25 27 'AlmanacBindingTransactionQuery' => 'applications/almanac/query/AlmanacBindingTransactionQuery.php', ··· 40 42 'AlmanacDAO' => 'applications/almanac/storage/AlmanacDAO.php', 41 43 'AlmanacDevice' => 'applications/almanac/storage/AlmanacDevice.php', 42 44 'AlmanacDeviceController' => 'applications/almanac/controller/AlmanacDeviceController.php', 45 + 'AlmanacDeviceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php', 43 46 'AlmanacDeviceEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceEditConduitAPIMethod.php', 44 47 'AlmanacDeviceEditController' => 'applications/almanac/controller/AlmanacDeviceEditController.php', 45 48 'AlmanacDeviceEditEngine' => 'applications/almanac/editor/AlmanacDeviceEditEngine.php', ··· 52 55 'AlmanacDeviceQuery' => 'applications/almanac/query/AlmanacDeviceQuery.php', 53 56 'AlmanacDeviceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceSearchConduitAPIMethod.php', 54 57 'AlmanacDeviceSearchEngine' => 'applications/almanac/query/AlmanacDeviceSearchEngine.php', 58 + 'AlmanacDeviceSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php', 55 59 'AlmanacDeviceTransaction' => 'applications/almanac/storage/AlmanacDeviceTransaction.php', 56 60 'AlmanacDeviceTransactionQuery' => 'applications/almanac/query/AlmanacDeviceTransactionQuery.php', 57 61 'AlmanacDeviceTransactionType' => 'applications/almanac/xaction/AlmanacDeviceTransactionType.php', ··· 80 84 'AlmanacManagementTrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementTrustKeyWorkflow.php', 81 85 'AlmanacManagementUntrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementUntrustKeyWorkflow.php', 82 86 'AlmanacManagementWorkflow' => 'applications/almanac/management/AlmanacManagementWorkflow.php', 87 + 'AlmanacModularTransaction' => 'applications/almanac/storage/AlmanacModularTransaction.php', 83 88 'AlmanacNames' => 'applications/almanac/util/AlmanacNames.php', 84 89 'AlmanacNamesTestCase' => 'applications/almanac/util/__tests__/AlmanacNamesTestCase.php', 85 90 'AlmanacNamespace' => 'applications/almanac/storage/AlmanacNamespace.php', ··· 127 132 'AlmanacService' => 'applications/almanac/storage/AlmanacService.php', 128 133 'AlmanacServiceController' => 'applications/almanac/controller/AlmanacServiceController.php', 129 134 'AlmanacServiceDatasource' => 'applications/almanac/typeahead/AlmanacServiceDatasource.php', 135 + 'AlmanacServiceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php', 130 136 'AlmanacServiceEditController' => 'applications/almanac/controller/AlmanacServiceEditController.php', 131 137 'AlmanacServiceEditEngine' => 'applications/almanac/editor/AlmanacServiceEditEngine.php', 132 138 'AlmanacServiceEditor' => 'applications/almanac/editor/AlmanacServiceEditor.php', ··· 138 144 'AlmanacServiceQuery' => 'applications/almanac/query/AlmanacServiceQuery.php', 139 145 'AlmanacServiceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacServiceSearchConduitAPIMethod.php', 140 146 'AlmanacServiceSearchEngine' => 'applications/almanac/query/AlmanacServiceSearchEngine.php', 147 + 'AlmanacServiceSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php', 141 148 'AlmanacServiceTransaction' => 'applications/almanac/storage/AlmanacServiceTransaction.php', 142 149 'AlmanacServiceTransactionQuery' => 'applications/almanac/query/AlmanacServiceTransactionQuery.php', 143 150 'AlmanacServiceTransactionType' => 'applications/almanac/xaction/AlmanacServiceTransactionType.php', ··· 146 153 'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php', 147 154 'AlmanacServiceTypeTransaction' => 'applications/almanac/xaction/AlmanacServiceTypeTransaction.php', 148 155 'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php', 149 - 'AlmanacTransaction' => 'applications/almanac/storage/AlmanacTransaction.php', 150 156 'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php', 151 157 'AphlictDropdownDataQuery' => 'applications/aphlict/query/AphlictDropdownDataQuery.php', 152 158 'Aphront304Response' => 'aphront/response/Aphront304Response.php', ··· 5194 5200 'PhabricatorDestructibleInterface', 5195 5201 'PhabricatorExtendedPolicyInterface', 5196 5202 ), 5203 + 'AlmanacBindingDeletePropertyTransaction' => 'AlmanacBindingTransactionType', 5197 5204 'AlmanacBindingDisableController' => 'AlmanacServiceController', 5198 5205 'AlmanacBindingDisableTransaction' => 'AlmanacBindingTransactionType', 5199 5206 'AlmanacBindingEditController' => 'AlmanacServiceController', ··· 5202 5209 'AlmanacBindingPHIDType' => 'PhabricatorPHIDType', 5203 5210 'AlmanacBindingPropertyEditEngine' => 'AlmanacPropertyEditEngine', 5204 5211 'AlmanacBindingQuery' => 'AlmanacQuery', 5212 + 'AlmanacBindingSetPropertyTransaction' => 'AlmanacBindingTransactionType', 5205 5213 'AlmanacBindingTableView' => 'AphrontView', 5206 - 'AlmanacBindingTransaction' => 'PhabricatorModularTransaction', 5214 + 'AlmanacBindingTransaction' => 'AlmanacModularTransaction', 5207 5215 'AlmanacBindingTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5208 5216 'AlmanacBindingTransactionType' => 'AlmanacTransactionType', 5209 5217 'AlmanacBindingViewController' => 'AlmanacServiceController', ··· 5233 5241 'PhabricatorExtendedPolicyInterface', 5234 5242 ), 5235 5243 'AlmanacDeviceController' => 'AlmanacController', 5244 + 'AlmanacDeviceDeletePropertyTransaction' => 'AlmanacDeviceTransactionType', 5236 5245 'AlmanacDeviceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 5237 5246 'AlmanacDeviceEditController' => 'AlmanacDeviceController', 5238 5247 'AlmanacDeviceEditEngine' => 'PhabricatorEditEngine', ··· 5245 5254 'AlmanacDeviceQuery' => 'AlmanacQuery', 5246 5255 'AlmanacDeviceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 5247 5256 'AlmanacDeviceSearchEngine' => 'PhabricatorApplicationSearchEngine', 5248 - 'AlmanacDeviceTransaction' => 'PhabricatorModularTransaction', 5257 + 'AlmanacDeviceSetPropertyTransaction' => 'AlmanacDeviceTransactionType', 5258 + 'AlmanacDeviceTransaction' => 'AlmanacModularTransaction', 5249 5259 'AlmanacDeviceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5250 5260 'AlmanacDeviceTransactionType' => 'AlmanacTransactionType', 5251 5261 'AlmanacDeviceViewController' => 'AlmanacDeviceController', ··· 5265 5275 'AlmanacInterfaceDeviceTransaction' => 'AlmanacInterfaceTransactionType', 5266 5276 'AlmanacInterfaceEditController' => 'AlmanacDeviceController', 5267 5277 'AlmanacInterfaceEditEngine' => 'PhabricatorEditEngine', 5268 - 'AlmanacInterfaceEditor' => 'PhabricatorApplicationTransactionEditor', 5278 + 'AlmanacInterfaceEditor' => 'AlmanacEditor', 5269 5279 'AlmanacInterfaceNetworkTransaction' => 'AlmanacInterfaceTransactionType', 5270 5280 'AlmanacInterfacePHIDType' => 'PhabricatorPHIDType', 5271 5281 'AlmanacInterfacePortTransaction' => 'AlmanacInterfaceTransactionType', 5272 5282 'AlmanacInterfaceQuery' => 'AlmanacQuery', 5273 5283 'AlmanacInterfaceTableView' => 'AphrontView', 5274 - 'AlmanacInterfaceTransaction' => 'PhabricatorModularTransaction', 5284 + 'AlmanacInterfaceTransaction' => 'AlmanacModularTransaction', 5275 5285 'AlmanacInterfaceTransactionType' => 'AlmanacTransactionType', 5276 5286 'AlmanacKeys' => 'Phobject', 5277 5287 'AlmanacManageClusterServicesCapability' => 'PhabricatorPolicyCapability', ··· 5279 5289 'AlmanacManagementTrustKeyWorkflow' => 'AlmanacManagementWorkflow', 5280 5290 'AlmanacManagementUntrustKeyWorkflow' => 'AlmanacManagementWorkflow', 5281 5291 'AlmanacManagementWorkflow' => 'PhabricatorManagementWorkflow', 5292 + 'AlmanacModularTransaction' => 'PhabricatorModularTransaction', 5282 5293 'AlmanacNames' => 'Phobject', 5283 5294 'AlmanacNamesTestCase' => 'PhabricatorTestCase', 5284 5295 'AlmanacNamespace' => array( ··· 5293 5304 'AlmanacNamespaceController' => 'AlmanacController', 5294 5305 'AlmanacNamespaceEditController' => 'AlmanacNamespaceController', 5295 5306 'AlmanacNamespaceEditEngine' => 'PhabricatorEditEngine', 5296 - 'AlmanacNamespaceEditor' => 'PhabricatorApplicationTransactionEditor', 5307 + 'AlmanacNamespaceEditor' => 'AlmanacEditor', 5297 5308 'AlmanacNamespaceListController' => 'AlmanacNamespaceController', 5298 5309 'AlmanacNamespaceNameNgrams' => 'PhabricatorSearchNgrams', 5299 5310 'AlmanacNamespaceNameTransaction' => 'AlmanacNamespaceTransactionType', 5300 5311 'AlmanacNamespacePHIDType' => 'PhabricatorPHIDType', 5301 5312 'AlmanacNamespaceQuery' => 'AlmanacQuery', 5302 5313 'AlmanacNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine', 5303 - 'AlmanacNamespaceTransaction' => 'PhabricatorModularTransaction', 5314 + 'AlmanacNamespaceTransaction' => 'AlmanacModularTransaction', 5304 5315 'AlmanacNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5305 5316 'AlmanacNamespaceTransactionType' => 'AlmanacTransactionType', 5306 5317 'AlmanacNamespaceViewController' => 'AlmanacNamespaceController', ··· 5314 5325 'AlmanacNetworkController' => 'AlmanacController', 5315 5326 'AlmanacNetworkEditController' => 'AlmanacNetworkController', 5316 5327 'AlmanacNetworkEditEngine' => 'PhabricatorEditEngine', 5317 - 'AlmanacNetworkEditor' => 'PhabricatorApplicationTransactionEditor', 5328 + 'AlmanacNetworkEditor' => 'AlmanacEditor', 5318 5329 'AlmanacNetworkListController' => 'AlmanacNetworkController', 5319 5330 'AlmanacNetworkNameNgrams' => 'PhabricatorSearchNgrams', 5320 5331 'AlmanacNetworkNameTransaction' => 'AlmanacNetworkTransactionType', 5321 5332 'AlmanacNetworkPHIDType' => 'PhabricatorPHIDType', 5322 5333 'AlmanacNetworkQuery' => 'AlmanacQuery', 5323 5334 'AlmanacNetworkSearchEngine' => 'PhabricatorApplicationSearchEngine', 5324 - 'AlmanacNetworkTransaction' => 'PhabricatorModularTransaction', 5335 + 'AlmanacNetworkTransaction' => 'AlmanacModularTransaction', 5325 5336 'AlmanacNetworkTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5326 5337 'AlmanacNetworkTransactionType' => 'AlmanacTransactionType', 5327 5338 'AlmanacNetworkViewController' => 'AlmanacNetworkController', ··· 5352 5363 ), 5353 5364 'AlmanacServiceController' => 'AlmanacController', 5354 5365 'AlmanacServiceDatasource' => 'PhabricatorTypeaheadDatasource', 5366 + 'AlmanacServiceDeletePropertyTransaction' => 'AlmanacServiceTransactionType', 5355 5367 'AlmanacServiceEditController' => 'AlmanacServiceController', 5356 5368 'AlmanacServiceEditEngine' => 'PhabricatorEditEngine', 5357 5369 'AlmanacServiceEditor' => 'AlmanacEditor', ··· 5363 5375 'AlmanacServiceQuery' => 'AlmanacQuery', 5364 5376 'AlmanacServiceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 5365 5377 'AlmanacServiceSearchEngine' => 'PhabricatorApplicationSearchEngine', 5366 - 'AlmanacServiceTransaction' => 'PhabricatorModularTransaction', 5378 + 'AlmanacServiceSetPropertyTransaction' => 'AlmanacServiceTransactionType', 5379 + 'AlmanacServiceTransaction' => 'AlmanacModularTransaction', 5367 5380 'AlmanacServiceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 5368 5381 'AlmanacServiceTransactionType' => 'AlmanacTransactionType', 5369 5382 'AlmanacServiceType' => 'Phobject', ··· 5371 5384 'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase', 5372 5385 'AlmanacServiceTypeTransaction' => 'AlmanacServiceTransactionType', 5373 5386 'AlmanacServiceViewController' => 'AlmanacServiceController', 5374 - 'AlmanacTransaction' => 'PhabricatorApplicationTransaction', 5375 5387 'AlmanacTransactionType' => 'PhabricatorModularTransactionType', 5376 5388 'AphlictDropdownDataQuery' => 'Phobject', 5377 5389 'Aphront304Response' => 'AphrontResponse',
+3 -1
src/applications/almanac/controller/AlmanacPropertyDeleteController.php
··· 39 39 40 40 $validation_exception = null; 41 41 if ($request->isFormPost()) { 42 + $xaction_type = $object->getAlmanacPropertyDeleteTransactionType(); 43 + 42 44 $xaction = $object->getApplicationTransactionTemplate() 43 - ->setTransactionType(AlmanacTransaction::TYPE_PROPERTY_REMOVE) 45 + ->setTransactionType($xaction_type) 44 46 ->setMetadataValue('almanac.property', $key); 45 47 46 48 $editor = $object->getApplicationTransactionEditor()
+4
src/applications/almanac/editor/AlmanacBindingEditor.php
··· 15 15 return pht('%s created %s.', $author, $object); 16 16 } 17 17 18 + protected function supportsSearch() { 19 + return true; 20 + } 21 + 18 22 }
+12
src/applications/almanac/editor/AlmanacDeviceEditor.php
··· 7 7 return pht('Almanac Device'); 8 8 } 9 9 10 + public function getCreateObjectTitle($author, $object) { 11 + return pht('%s created this device.', $author); 12 + } 13 + 14 + public function getCreateObjectTitleForFeed($author, $object) { 15 + return pht('%s created %s.', $author, $object); 16 + } 17 + 18 + protected function supportsSearch() { 19 + return true; 20 + } 21 + 10 22 public function getTransactionTypes() { 11 23 $types = parent::getTransactionTypes(); 12 24
-146
src/applications/almanac/editor/AlmanacEditor.php
··· 7 7 return 'PhabricatorAlmanacApplication'; 8 8 } 9 9 10 - protected function supportsSearch() { 11 - return true; 12 - } 13 - 14 - public function getTransactionTypes() { 15 - $types = parent::getTransactionTypes(); 16 - 17 - $types[] = AlmanacTransaction::TYPE_PROPERTY_UPDATE; 18 - $types[] = AlmanacTransaction::TYPE_PROPERTY_REMOVE; 19 - 20 - return $types; 21 - } 22 - 23 - protected function getCustomTransactionOldValue( 24 - PhabricatorLiskDAO $object, 25 - PhabricatorApplicationTransaction $xaction) { 26 - switch ($xaction->getTransactionType()) { 27 - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: 28 - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: 29 - $property_key = $xaction->getMetadataValue('almanac.property'); 30 - $exists = $object->hasAlmanacProperty($property_key); 31 - $value = $object->getAlmanacPropertyValue($property_key); 32 - return array( 33 - 'existed' => $exists, 34 - 'value' => $value, 35 - ); 36 - } 37 - 38 - return parent::getCustomTransactionOldValue($object, $xaction); 39 - } 40 - 41 - protected function getCustomTransactionNewValue( 42 - PhabricatorLiskDAO $object, 43 - PhabricatorApplicationTransaction $xaction) { 44 - 45 - switch ($xaction->getTransactionType()) { 46 - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: 47 - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: 48 - return $xaction->getNewValue(); 49 - } 50 - 51 - return parent::getCustomTransactionNewValue($object, $xaction); 52 - } 53 - 54 - protected function applyCustomInternalTransaction( 55 - PhabricatorLiskDAO $object, 56 - PhabricatorApplicationTransaction $xaction) { 57 - 58 - switch ($xaction->getTransactionType()) { 59 - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: 60 - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: 61 - return; 62 - } 63 - 64 - return parent::applyCustomInternalTransaction($object, $xaction); 65 - } 66 - 67 - protected function applyCustomExternalTransaction( 68 - PhabricatorLiskDAO $object, 69 - PhabricatorApplicationTransaction $xaction) { 70 - 71 - switch ($xaction->getTransactionType()) { 72 - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: 73 - $property_key = $xaction->getMetadataValue('almanac.property'); 74 - if ($object->hasAlmanacProperty($property_key)) { 75 - $property = $object->getAlmanacProperty($property_key); 76 - } else { 77 - $property = id(new AlmanacProperty()) 78 - ->setObjectPHID($object->getPHID()) 79 - ->setFieldName($property_key); 80 - } 81 - $property 82 - ->setFieldValue($xaction->getNewValue()) 83 - ->save(); 84 - return; 85 - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: 86 - $property_key = $xaction->getMetadataValue('almanac.property'); 87 - if ($object->hasAlmanacProperty($property_key)) { 88 - $property = $object->getAlmanacProperty($property_key); 89 - $property->delete(); 90 - } 91 - return; 92 - } 93 - 94 - return parent::applyCustomExternalTransaction($object, $xaction); 95 - } 96 - 97 - protected function validateTransaction( 98 - PhabricatorLiskDAO $object, 99 - $type, 100 - array $xactions) { 101 - 102 - $errors = parent::validateTransaction($object, $type, $xactions); 103 - 104 - switch ($type) { 105 - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: 106 - foreach ($xactions as $xaction) { 107 - $property_key = $xaction->getMetadataValue('almanac.property'); 108 - 109 - $message = null; 110 - try { 111 - AlmanacNames::validateName($property_key); 112 - } catch (Exception $ex) { 113 - $message = $ex->getMessage(); 114 - } 115 - 116 - if ($message !== null) { 117 - $error = new PhabricatorApplicationTransactionValidationError( 118 - $type, 119 - pht('Invalid'), 120 - $message, 121 - $xaction); 122 - $errors[] = $error; 123 - continue; 124 - } 125 - 126 - $new_value = $xaction->getNewValue(); 127 - try { 128 - phutil_json_encode($new_value); 129 - } catch (Exception $ex) { 130 - $message = pht( 131 - 'Almanac property values must be representable in JSON. %s', 132 - $ex->getMessage()); 133 - } 134 - 135 - if ($message !== null) { 136 - $error = new PhabricatorApplicationTransactionValidationError( 137 - $type, 138 - pht('Invalid'), 139 - $message, 140 - $xaction); 141 - $errors[] = $error; 142 - continue; 143 - } 144 - } 145 - break; 146 - 147 - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: 148 - // NOTE: No name validation on removals since it's OK to delete 149 - // an invalid property that somehow came into existence. 150 - break; 151 - } 152 - 153 - return $errors; 154 - } 155 - 156 10 }
+1 -5
src/applications/almanac/editor/AlmanacInterfaceEditor.php
··· 1 1 <?php 2 2 3 3 final class AlmanacInterfaceEditor 4 - extends PhabricatorApplicationTransactionEditor { 5 - 6 - public function getEditorApplicationClass() { 7 - return 'PhabricatorAlmanacApplication'; 8 - } 4 + extends AlmanacEditor { 9 5 10 6 public function getEditorObjectsDescription() { 11 7 return pht('Almanac Interface');
+1 -5
src/applications/almanac/editor/AlmanacNamespaceEditor.php
··· 1 1 <?php 2 2 3 3 final class AlmanacNamespaceEditor 4 - extends PhabricatorApplicationTransactionEditor { 5 - 6 - public function getEditorApplicationClass() { 7 - return 'PhabricatorAlmanacApplication'; 8 - } 4 + extends AlmanacEditor { 9 5 10 6 public function getEditorObjectsDescription() { 11 7 return pht('Almanac Namespace');
+5 -9
src/applications/almanac/editor/AlmanacNetworkEditor.php
··· 1 1 <?php 2 2 3 3 final class AlmanacNetworkEditor 4 - extends PhabricatorApplicationTransactionEditor { 5 - 6 - public function getEditorApplicationClass() { 7 - return 'PhabricatorAlmanacApplication'; 8 - } 4 + extends AlmanacEditor { 9 5 10 6 public function getEditorObjectsDescription() { 11 7 return pht('Almanac Network'); 12 8 } 13 9 14 - protected function supportsSearch() { 15 - return true; 16 - } 17 - 18 10 public function getCreateObjectTitle($author, $object) { 19 11 return pht('%s created this network.', $author); 20 12 } 21 13 22 14 public function getCreateObjectTitleForFeed($author, $object) { 23 15 return pht('%s created %s.', $author, $object); 16 + } 17 + 18 + protected function supportsSearch() { 19 + return true; 24 20 } 25 21 26 22 public function getTransactionTypes() {
+1 -1
src/applications/almanac/editor/AlmanacPropertyEditEngine.php
··· 64 64 65 65 protected function buildCustomEditFields($object) { 66 66 $property_key = $this->getPropertyKey(); 67 - $xaction_type = AlmanacTransaction::TYPE_PROPERTY_UPDATE; 67 + $xaction_type = $object->getAlmanacPropertySetTransactionType(); 68 68 69 69 return array( 70 70 id(new PhabricatorTextEditField())
+2
src/applications/almanac/property/AlmanacPropertyInterface.php
··· 9 9 public function getAlmanacPropertyValue($key, $default = null); 10 10 public function getAlmanacPropertyFieldSpecifications(); 11 11 public function newAlmanacPropertyEditEngine(); 12 + public function getAlmanacPropertySetTransactionType(); 13 + public function getAlmanacPropertyDeleteTransactionType(); 12 14 13 15 }
+8
src/applications/almanac/storage/AlmanacBinding.php
··· 134 134 return new AlmanacBindingPropertyEditEngine(); 135 135 } 136 136 137 + public function getAlmanacPropertySetTransactionType() { 138 + return AlmanacBindingSetPropertyTransaction::TRANSACTIONTYPE; 139 + } 140 + 141 + public function getAlmanacPropertyDeleteTransactionType() { 142 + return AlmanacBindingDeletePropertyTransaction::TRANSACTIONTYPE; 143 + } 144 + 137 145 138 146 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 139 147
+1 -9
src/applications/almanac/storage/AlmanacBindingTransaction.php
··· 1 1 <?php 2 2 3 3 final class AlmanacBindingTransaction 4 - extends PhabricatorModularTransaction { 5 - 6 - public function getApplicationName() { 7 - return 'almanac'; 8 - } 4 + extends AlmanacModularTransaction { 9 5 10 6 public function getApplicationTransactionType() { 11 7 return AlmanacBindingPHIDType::TYPECONST; 12 - } 13 - 14 - public function getApplicationTransactionCommentObject() { 15 - return null; 16 8 } 17 9 18 10 public function getBaseTransactionClass() {
+8
src/applications/almanac/storage/AlmanacDevice.php
··· 143 143 return new AlmanacDevicePropertyEditEngine(); 144 144 } 145 145 146 + public function getAlmanacPropertySetTransactionType() { 147 + return AlmanacDeviceSetPropertyTransaction::TRANSACTIONTYPE; 148 + } 149 + 150 + public function getAlmanacPropertyDeleteTransactionType() { 151 + return AlmanacDeviceDeletePropertyTransaction::TRANSACTIONTYPE; 152 + } 153 + 146 154 147 155 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 148 156
+1 -9
src/applications/almanac/storage/AlmanacDeviceTransaction.php
··· 1 1 <?php 2 2 3 3 final class AlmanacDeviceTransaction 4 - extends PhabricatorModularTransaction { 5 - 6 - public function getApplicationName() { 7 - return 'almanac'; 8 - } 4 + extends AlmanacModularTransaction { 9 5 10 6 public function getApplicationTransactionType() { 11 7 return AlmanacDevicePHIDType::TYPECONST; 12 - } 13 - 14 - public function getApplicationTransactionCommentObject() { 15 - return null; 16 8 } 17 9 18 10 public function getBaseTransactionClass() {
+1 -9
src/applications/almanac/storage/AlmanacInterfaceTransaction.php
··· 1 1 <?php 2 2 3 3 final class AlmanacInterfaceTransaction 4 - extends PhabricatorModularTransaction { 5 - 6 - public function getApplicationName() { 7 - return 'almanac'; 8 - } 4 + extends AlmanacModularTransaction { 9 5 10 6 public function getApplicationTransactionType() { 11 7 return AlmanacInterfacePHIDType::TYPECONST; 12 - } 13 - 14 - public function getApplicationTransactionCommentObject() { 15 - return null; 16 8 } 17 9 18 10 public function getBaseTransactionClass() {
+14
src/applications/almanac/storage/AlmanacModularTransaction.php
··· 1 + <?php 2 + 3 + abstract class AlmanacModularTransaction 4 + extends PhabricatorModularTransaction { 5 + 6 + public function getApplicationName() { 7 + return 'almanac'; 8 + } 9 + 10 + public function getApplicationTransactionCommentObject() { 11 + return null; 12 + } 13 + 14 + }
+8
src/applications/almanac/storage/AlmanacNamespace.php
··· 150 150 throw new PhutilMethodNotImplementedException(); 151 151 } 152 152 153 + public function getAlmanacPropertySetTransactionType() { 154 + throw new PhutilMethodNotImplementedException(); 155 + } 156 + 157 + public function getAlmanacPropertyDeleteTransactionType() { 158 + throw new PhutilMethodNotImplementedException(); 159 + } 160 + 153 161 154 162 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 155 163
+1 -9
src/applications/almanac/storage/AlmanacNamespaceTransaction.php
··· 1 1 <?php 2 2 3 3 final class AlmanacNamespaceTransaction 4 - extends PhabricatorModularTransaction { 5 - 6 - public function getApplicationName() { 7 - return 'almanac'; 8 - } 4 + extends AlmanacModularTransaction { 9 5 10 6 public function getApplicationTransactionType() { 11 7 return AlmanacNamespacePHIDType::TYPECONST; 12 - } 13 - 14 - public function getApplicationTransactionCommentObject() { 15 - return null; 16 8 } 17 9 18 10 public function getBaseTransactionClass() {
+1 -9
src/applications/almanac/storage/AlmanacNetworkTransaction.php
··· 1 1 <?php 2 2 3 3 final class AlmanacNetworkTransaction 4 - extends PhabricatorModularTransaction { 5 - 6 - public function getApplicationName() { 7 - return 'almanac'; 8 - } 4 + extends AlmanacModularTransaction { 9 5 10 6 public function getApplicationTransactionType() { 11 7 return AlmanacNetworkPHIDType::TYPECONST; 12 - } 13 - 14 - public function getApplicationTransactionCommentObject() { 15 - return null; 16 8 } 17 9 18 10 public function getBaseTransactionClass() {
+2 -2
src/applications/almanac/storage/AlmanacProperty.php
··· 54 54 } 55 55 56 56 $xactions[] = id(clone $template) 57 - ->setTransactionType(AlmanacTransaction::TYPE_PROPERTY_UPDATE) 57 + ->setTransactionType($object->getAlmanacPropertySetTransactionType()) 58 58 ->setMetadataValue('almanac.property', $name) 59 59 ->setNewValue($property); 60 60 } ··· 71 71 $xactions = array(); 72 72 foreach ($properties as $property) { 73 73 $xactions[] = id(clone $template) 74 - ->setTransactionType(AlmanacTransaction::TYPE_PROPERTY_REMOVE) 74 + ->setTransactionType($object->getAlmanacPropertyDeleteTransactionType()) 75 75 ->setMetadataValue('almanac.property', $property) 76 76 ->setNewValue(null); 77 77 }
+8
src/applications/almanac/storage/AlmanacService.php
··· 160 160 return new AlmanacServicePropertyEditEngine(); 161 161 } 162 162 163 + public function getAlmanacPropertySetTransactionType() { 164 + return AlmanacServiceSetPropertyTransaction::TRANSACTIONTYPE; 165 + } 166 + 167 + public function getAlmanacPropertyDeleteTransactionType() { 168 + return AlmanacServiceDeletePropertyTransaction::TRANSACTIONTYPE; 169 + } 170 + 163 171 164 172 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 165 173
+1 -9
src/applications/almanac/storage/AlmanacServiceTransaction.php
··· 1 1 <?php 2 2 3 3 final class AlmanacServiceTransaction 4 - extends PhabricatorModularTransaction { 5 - 6 - public function getApplicationName() { 7 - return 'almanac'; 8 - } 9 - 10 - public function getApplicationTransactionCommentObject() { 11 - return null; 12 - } 4 + extends AlmanacModularTransaction { 13 5 14 6 public function getApplicationTransactionType() { 15 7 return AlmanacServicePHIDType::TYPECONST;
-38
src/applications/almanac/storage/AlmanacTransaction.php
··· 1 - <?php 2 - 3 - abstract class AlmanacTransaction 4 - extends PhabricatorApplicationTransaction { 5 - 6 - const TYPE_PROPERTY_UPDATE = 'almanac:property:update'; 7 - const TYPE_PROPERTY_REMOVE = 'almanac:property:remove'; 8 - 9 - public function getApplicationName() { 10 - return 'almanac'; 11 - } 12 - 13 - public function getApplicationTransactionCommentObject() { 14 - return null; 15 - } 16 - 17 - public function getTitle() { 18 - $author_phid = $this->getAuthorPHID(); 19 - 20 - switch ($this->getTransactionType()) { 21 - case self::TYPE_PROPERTY_UPDATE: 22 - $property_key = $this->getMetadataValue('almanac.property'); 23 - return pht( 24 - '%s updated the property "%s".', 25 - $this->renderHandleLink($author_phid), 26 - $property_key); 27 - case self::TYPE_PROPERTY_REMOVE: 28 - $property_key = $this->getMetadataValue('almanac.property'); 29 - return pht( 30 - '%s deleted the property "%s".', 31 - $this->renderHandleLink($author_phid), 32 - $property_key); 33 - } 34 - 35 - return parent::getTitle(); 36 - } 37 - 38 - }
+20
src/applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php
··· 1 + <?php 2 + 3 + final class AlmanacBindingDeletePropertyTransaction 4 + extends AlmanacBindingTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'almanac:property:remove'; 7 + 8 + public function generateOldValue($object) { 9 + return $this->getAlmanacPropertyOldValue($object); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + return $this->deleteAlmanacProperty($object); 14 + } 15 + 16 + public function getTitle() { 17 + return $this->getAlmanacDeletePropertyTitle(); 18 + } 19 + 20 + }
+24
src/applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php
··· 1 + <?php 2 + 3 + final class AlmanacBindingSetPropertyTransaction 4 + extends AlmanacBindingTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'almanac:property:update'; 7 + 8 + public function generateOldValue($object) { 9 + return $this->getAlmanacPropertyOldValue($object); 10 + } 11 + 12 + public function applyExternalEffects($object, $value) { 13 + return $this->setAlmanacProperty($object, $value); 14 + } 15 + 16 + public function getTitle() { 17 + return $this->getAlmanacSetPropertyTitle(); 18 + } 19 + 20 + public function validateTransactions($object, array $xactions) { 21 + return $this->validateAlmanacSetPropertyTransactions($object, $xactions); 22 + } 23 + 24 + }
+20
src/applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php
··· 1 + <?php 2 + 3 + final class AlmanacDeviceDeletePropertyTransaction 4 + extends AlmanacDeviceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'almanac:property:remove'; 7 + 8 + public function generateOldValue($object) { 9 + return $this->getAlmanacPropertyOldValue($object); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + return $this->deleteAlmanacProperty($object); 14 + } 15 + 16 + public function getTitle() { 17 + return $this->getAlmanacDeletePropertyTitle(); 18 + } 19 + 20 + }
+24
src/applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php
··· 1 + <?php 2 + 3 + final class AlmanacDeviceSetPropertyTransaction 4 + extends AlmanacDeviceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'almanac:property:update'; 7 + 8 + public function generateOldValue($object) { 9 + return $this->getAlmanacPropertyOldValue($object); 10 + } 11 + 12 + public function applyExternalEffects($object, $value) { 13 + return $this->setAlmanacProperty($object, $value); 14 + } 15 + 16 + public function getTitle() { 17 + return $this->getAlmanacSetPropertyTitle(); 18 + } 19 + 20 + public function validateTransactions($object, array $xactions) { 21 + return $this->validateAlmanacSetPropertyTransactions($object, $xactions); 22 + } 23 + 24 + }
+20
src/applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php
··· 1 + <?php 2 + 3 + final class AlmanacServiceDeletePropertyTransaction 4 + extends AlmanacServiceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'almanac:property:remove'; 7 + 8 + public function generateOldValue($object) { 9 + return $this->getAlmanacPropertyOldValue($object); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + return $this->deleteAlmanacProperty($object); 14 + } 15 + 16 + public function getTitle() { 17 + return $this->getAlmanacDeletePropertyTitle(); 18 + } 19 + 20 + }
+24
src/applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php
··· 1 + <?php 2 + 3 + final class AlmanacServiceSetPropertyTransaction 4 + extends AlmanacServiceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'almanac:property:update'; 7 + 8 + public function generateOldValue($object) { 9 + return $this->getAlmanacPropertyOldValue($object); 10 + } 11 + 12 + public function applyExternalEffects($object, $value) { 13 + return $this->setAlmanacProperty($object, $value); 14 + } 15 + 16 + public function getTitle() { 17 + return $this->getAlmanacSetPropertyTitle(); 18 + } 19 + 20 + public function validateTransactions($object, array $xactions) { 21 + return $this->validateAlmanacSetPropertyTransactions($object, $xactions); 22 + } 23 + 24 + }
+94 -1
src/applications/almanac/xaction/AlmanacTransactionType.php
··· 1 1 <?php 2 2 3 3 abstract class AlmanacTransactionType 4 - extends PhabricatorModularTransactionType {} 4 + extends PhabricatorModularTransactionType { 5 + 6 + protected function getAlmanacPropertyOldValue($object) { 7 + $property_key = $this->getMetadataValue('almanac.property'); 8 + $exists = $object->hasAlmanacProperty($property_key); 9 + $value = $object->getAlmanacPropertyValue($property_key); 10 + 11 + return array( 12 + 'existed' => $exists, 13 + 'value' => $value, 14 + ); 15 + } 16 + 17 + protected function setAlmanacProperty($object, $value) { 18 + $property_key = $this->getMetadataValue('almanac.property'); 19 + 20 + if ($object->hasAlmanacProperty($property_key)) { 21 + $property = $object->getAlmanacProperty($property_key); 22 + } else { 23 + $property = id(new AlmanacProperty()) 24 + ->setObjectPHID($object->getPHID()) 25 + ->setFieldName($property_key); 26 + } 27 + 28 + $property 29 + ->setFieldValue($value) 30 + ->save(); 31 + } 32 + 33 + protected function deleteAlmanacProperty($object) { 34 + $property_key = $this->getMetadataValue('almanac.property'); 35 + if ($object->hasAlmanacProperty($property_key)) { 36 + $property = $object->getAlmanacProperty($property_key); 37 + $property->delete(); 38 + } 39 + } 40 + 41 + protected function getAlmanacSetPropertyTitle() { 42 + $property_key = $this->getMetadataValue('almanac.property'); 43 + 44 + return pht( 45 + '%s updated the property %s.', 46 + $this->renderAuthor(), 47 + $this->renderValue($property_key)); 48 + } 49 + 50 + protected function getAlmanacDeletePropertyTitle() { 51 + $property_key = $this->getMetadataValue('almanac.property'); 52 + 53 + return pht( 54 + '%s removed the property %s.', 55 + $this->renderAuthor(), 56 + $this->renderValue($property_key)); 57 + } 58 + 59 + protected function validateAlmanacSetPropertyTransactions( 60 + $object, 61 + array $xactions) { 62 + $errors = array(); 63 + 64 + foreach ($xactions as $xaction) { 65 + $property_key = $xaction->getMetadataValue('almanac.property'); 66 + 67 + $message = null; 68 + try { 69 + AlmanacNames::validateName($property_key); 70 + } catch (Exception $ex) { 71 + $message = $ex->getMessage(); 72 + } 73 + 74 + if ($message !== null) { 75 + $errors[] = $this->newInvalidError($message, $xaction); 76 + continue; 77 + } 78 + 79 + $new_value = $xaction->getNewValue(); 80 + try { 81 + phutil_json_encode($new_value); 82 + } catch (Exception $ex) { 83 + $message = pht( 84 + 'Almanac property values must be representable in JSON. %s', 85 + $ex->getMessage()); 86 + } 87 + 88 + if ($message !== null) { 89 + $errors[] = $this->newInvalidError($message, $xaction); 90 + continue; 91 + } 92 + } 93 + 94 + return $errors; 95 + } 96 + 97 + }