diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -12,6 +12,7 @@ 'AlamancServiceEditConduitAPIMethod' => 'applications/almanac/conduit/AlamancServiceEditConduitAPIMethod.php', 'AlmanacAddress' => 'applications/almanac/util/AlmanacAddress.php', 'AlmanacBinding' => 'applications/almanac/storage/AlmanacBinding.php', + 'AlmanacBindingDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php', 'AlmanacBindingDisableController' => 'applications/almanac/controller/AlmanacBindingDisableController.php', 'AlmanacBindingDisableTransaction' => 'applications/almanac/xaction/AlmanacBindingDisableTransaction.php', 'AlmanacBindingEditController' => 'applications/almanac/controller/AlmanacBindingEditController.php', @@ -20,6 +21,7 @@ 'AlmanacBindingPHIDType' => 'applications/almanac/phid/AlmanacBindingPHIDType.php', 'AlmanacBindingPropertyEditEngine' => 'applications/almanac/editor/AlmanacBindingPropertyEditEngine.php', 'AlmanacBindingQuery' => 'applications/almanac/query/AlmanacBindingQuery.php', + 'AlmanacBindingSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php', 'AlmanacBindingTableView' => 'applications/almanac/view/AlmanacBindingTableView.php', 'AlmanacBindingTransaction' => 'applications/almanac/storage/AlmanacBindingTransaction.php', 'AlmanacBindingTransactionQuery' => 'applications/almanac/query/AlmanacBindingTransactionQuery.php', @@ -40,6 +42,7 @@ 'AlmanacDAO' => 'applications/almanac/storage/AlmanacDAO.php', 'AlmanacDevice' => 'applications/almanac/storage/AlmanacDevice.php', 'AlmanacDeviceController' => 'applications/almanac/controller/AlmanacDeviceController.php', + 'AlmanacDeviceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php', 'AlmanacDeviceEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceEditConduitAPIMethod.php', 'AlmanacDeviceEditController' => 'applications/almanac/controller/AlmanacDeviceEditController.php', 'AlmanacDeviceEditEngine' => 'applications/almanac/editor/AlmanacDeviceEditEngine.php', @@ -52,6 +55,7 @@ 'AlmanacDeviceQuery' => 'applications/almanac/query/AlmanacDeviceQuery.php', 'AlmanacDeviceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceSearchConduitAPIMethod.php', 'AlmanacDeviceSearchEngine' => 'applications/almanac/query/AlmanacDeviceSearchEngine.php', + 'AlmanacDeviceSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php', 'AlmanacDeviceTransaction' => 'applications/almanac/storage/AlmanacDeviceTransaction.php', 'AlmanacDeviceTransactionQuery' => 'applications/almanac/query/AlmanacDeviceTransactionQuery.php', 'AlmanacDeviceTransactionType' => 'applications/almanac/xaction/AlmanacDeviceTransactionType.php', @@ -80,6 +84,7 @@ 'AlmanacManagementTrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementTrustKeyWorkflow.php', 'AlmanacManagementUntrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementUntrustKeyWorkflow.php', 'AlmanacManagementWorkflow' => 'applications/almanac/management/AlmanacManagementWorkflow.php', + 'AlmanacModularTransaction' => 'applications/almanac/storage/AlmanacModularTransaction.php', 'AlmanacNames' => 'applications/almanac/util/AlmanacNames.php', 'AlmanacNamesTestCase' => 'applications/almanac/util/__tests__/AlmanacNamesTestCase.php', 'AlmanacNamespace' => 'applications/almanac/storage/AlmanacNamespace.php', @@ -127,6 +132,7 @@ 'AlmanacService' => 'applications/almanac/storage/AlmanacService.php', 'AlmanacServiceController' => 'applications/almanac/controller/AlmanacServiceController.php', 'AlmanacServiceDatasource' => 'applications/almanac/typeahead/AlmanacServiceDatasource.php', + 'AlmanacServiceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php', 'AlmanacServiceEditController' => 'applications/almanac/controller/AlmanacServiceEditController.php', 'AlmanacServiceEditEngine' => 'applications/almanac/editor/AlmanacServiceEditEngine.php', 'AlmanacServiceEditor' => 'applications/almanac/editor/AlmanacServiceEditor.php', @@ -138,6 +144,7 @@ 'AlmanacServiceQuery' => 'applications/almanac/query/AlmanacServiceQuery.php', 'AlmanacServiceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacServiceSearchConduitAPIMethod.php', 'AlmanacServiceSearchEngine' => 'applications/almanac/query/AlmanacServiceSearchEngine.php', + 'AlmanacServiceSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php', 'AlmanacServiceTransaction' => 'applications/almanac/storage/AlmanacServiceTransaction.php', 'AlmanacServiceTransactionQuery' => 'applications/almanac/query/AlmanacServiceTransactionQuery.php', 'AlmanacServiceTransactionType' => 'applications/almanac/xaction/AlmanacServiceTransactionType.php', @@ -146,7 +153,6 @@ 'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php', 'AlmanacServiceTypeTransaction' => 'applications/almanac/xaction/AlmanacServiceTypeTransaction.php', 'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php', - 'AlmanacTransaction' => 'applications/almanac/storage/AlmanacTransaction.php', 'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php', 'AphlictDropdownDataQuery' => 'applications/aphlict/query/AphlictDropdownDataQuery.php', 'Aphront304Response' => 'aphront/response/Aphront304Response.php', @@ -5194,6 +5200,7 @@ 'PhabricatorDestructibleInterface', 'PhabricatorExtendedPolicyInterface', ), + 'AlmanacBindingDeletePropertyTransaction' => 'AlmanacBindingTransactionType', 'AlmanacBindingDisableController' => 'AlmanacServiceController', 'AlmanacBindingDisableTransaction' => 'AlmanacBindingTransactionType', 'AlmanacBindingEditController' => 'AlmanacServiceController', @@ -5202,8 +5209,9 @@ 'AlmanacBindingPHIDType' => 'PhabricatorPHIDType', 'AlmanacBindingPropertyEditEngine' => 'AlmanacPropertyEditEngine', 'AlmanacBindingQuery' => 'AlmanacQuery', + 'AlmanacBindingSetPropertyTransaction' => 'AlmanacBindingTransactionType', 'AlmanacBindingTableView' => 'AphrontView', - 'AlmanacBindingTransaction' => 'PhabricatorModularTransaction', + 'AlmanacBindingTransaction' => 'AlmanacModularTransaction', 'AlmanacBindingTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'AlmanacBindingTransactionType' => 'AlmanacTransactionType', 'AlmanacBindingViewController' => 'AlmanacServiceController', @@ -5233,6 +5241,7 @@ 'PhabricatorExtendedPolicyInterface', ), 'AlmanacDeviceController' => 'AlmanacController', + 'AlmanacDeviceDeletePropertyTransaction' => 'AlmanacDeviceTransactionType', 'AlmanacDeviceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'AlmanacDeviceEditController' => 'AlmanacDeviceController', 'AlmanacDeviceEditEngine' => 'PhabricatorEditEngine', @@ -5245,7 +5254,8 @@ 'AlmanacDeviceQuery' => 'AlmanacQuery', 'AlmanacDeviceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'AlmanacDeviceSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'AlmanacDeviceTransaction' => 'PhabricatorModularTransaction', + 'AlmanacDeviceSetPropertyTransaction' => 'AlmanacDeviceTransactionType', + 'AlmanacDeviceTransaction' => 'AlmanacModularTransaction', 'AlmanacDeviceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'AlmanacDeviceTransactionType' => 'AlmanacTransactionType', 'AlmanacDeviceViewController' => 'AlmanacDeviceController', @@ -5265,13 +5275,13 @@ 'AlmanacInterfaceDeviceTransaction' => 'AlmanacInterfaceTransactionType', 'AlmanacInterfaceEditController' => 'AlmanacDeviceController', 'AlmanacInterfaceEditEngine' => 'PhabricatorEditEngine', - 'AlmanacInterfaceEditor' => 'PhabricatorApplicationTransactionEditor', + 'AlmanacInterfaceEditor' => 'AlmanacEditor', 'AlmanacInterfaceNetworkTransaction' => 'AlmanacInterfaceTransactionType', 'AlmanacInterfacePHIDType' => 'PhabricatorPHIDType', 'AlmanacInterfacePortTransaction' => 'AlmanacInterfaceTransactionType', 'AlmanacInterfaceQuery' => 'AlmanacQuery', 'AlmanacInterfaceTableView' => 'AphrontView', - 'AlmanacInterfaceTransaction' => 'PhabricatorModularTransaction', + 'AlmanacInterfaceTransaction' => 'AlmanacModularTransaction', 'AlmanacInterfaceTransactionType' => 'AlmanacTransactionType', 'AlmanacKeys' => 'Phobject', 'AlmanacManageClusterServicesCapability' => 'PhabricatorPolicyCapability', @@ -5279,6 +5289,7 @@ 'AlmanacManagementTrustKeyWorkflow' => 'AlmanacManagementWorkflow', 'AlmanacManagementUntrustKeyWorkflow' => 'AlmanacManagementWorkflow', 'AlmanacManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'AlmanacModularTransaction' => 'PhabricatorModularTransaction', 'AlmanacNames' => 'Phobject', 'AlmanacNamesTestCase' => 'PhabricatorTestCase', 'AlmanacNamespace' => array( @@ -5293,14 +5304,14 @@ 'AlmanacNamespaceController' => 'AlmanacController', 'AlmanacNamespaceEditController' => 'AlmanacNamespaceController', 'AlmanacNamespaceEditEngine' => 'PhabricatorEditEngine', - 'AlmanacNamespaceEditor' => 'PhabricatorApplicationTransactionEditor', + 'AlmanacNamespaceEditor' => 'AlmanacEditor', 'AlmanacNamespaceListController' => 'AlmanacNamespaceController', 'AlmanacNamespaceNameNgrams' => 'PhabricatorSearchNgrams', 'AlmanacNamespaceNameTransaction' => 'AlmanacNamespaceTransactionType', 'AlmanacNamespacePHIDType' => 'PhabricatorPHIDType', 'AlmanacNamespaceQuery' => 'AlmanacQuery', 'AlmanacNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'AlmanacNamespaceTransaction' => 'PhabricatorModularTransaction', + 'AlmanacNamespaceTransaction' => 'AlmanacModularTransaction', 'AlmanacNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'AlmanacNamespaceTransactionType' => 'AlmanacTransactionType', 'AlmanacNamespaceViewController' => 'AlmanacNamespaceController', @@ -5314,14 +5325,14 @@ 'AlmanacNetworkController' => 'AlmanacController', 'AlmanacNetworkEditController' => 'AlmanacNetworkController', 'AlmanacNetworkEditEngine' => 'PhabricatorEditEngine', - 'AlmanacNetworkEditor' => 'PhabricatorApplicationTransactionEditor', + 'AlmanacNetworkEditor' => 'AlmanacEditor', 'AlmanacNetworkListController' => 'AlmanacNetworkController', 'AlmanacNetworkNameNgrams' => 'PhabricatorSearchNgrams', 'AlmanacNetworkNameTransaction' => 'AlmanacNetworkTransactionType', 'AlmanacNetworkPHIDType' => 'PhabricatorPHIDType', 'AlmanacNetworkQuery' => 'AlmanacQuery', 'AlmanacNetworkSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'AlmanacNetworkTransaction' => 'PhabricatorModularTransaction', + 'AlmanacNetworkTransaction' => 'AlmanacModularTransaction', 'AlmanacNetworkTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'AlmanacNetworkTransactionType' => 'AlmanacTransactionType', 'AlmanacNetworkViewController' => 'AlmanacNetworkController', @@ -5352,6 +5363,7 @@ ), 'AlmanacServiceController' => 'AlmanacController', 'AlmanacServiceDatasource' => 'PhabricatorTypeaheadDatasource', + 'AlmanacServiceDeletePropertyTransaction' => 'AlmanacServiceTransactionType', 'AlmanacServiceEditController' => 'AlmanacServiceController', 'AlmanacServiceEditEngine' => 'PhabricatorEditEngine', 'AlmanacServiceEditor' => 'AlmanacEditor', @@ -5363,7 +5375,8 @@ 'AlmanacServiceQuery' => 'AlmanacQuery', 'AlmanacServiceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'AlmanacServiceSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'AlmanacServiceTransaction' => 'PhabricatorModularTransaction', + 'AlmanacServiceSetPropertyTransaction' => 'AlmanacServiceTransactionType', + 'AlmanacServiceTransaction' => 'AlmanacModularTransaction', 'AlmanacServiceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'AlmanacServiceTransactionType' => 'AlmanacTransactionType', 'AlmanacServiceType' => 'Phobject', @@ -5371,7 +5384,6 @@ 'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase', 'AlmanacServiceTypeTransaction' => 'AlmanacServiceTransactionType', 'AlmanacServiceViewController' => 'AlmanacServiceController', - 'AlmanacTransaction' => 'PhabricatorApplicationTransaction', 'AlmanacTransactionType' => 'PhabricatorModularTransactionType', 'AphlictDropdownDataQuery' => 'Phobject', 'Aphront304Response' => 'AphrontResponse', diff --git a/src/applications/almanac/controller/AlmanacPropertyDeleteController.php b/src/applications/almanac/controller/AlmanacPropertyDeleteController.php --- a/src/applications/almanac/controller/AlmanacPropertyDeleteController.php +++ b/src/applications/almanac/controller/AlmanacPropertyDeleteController.php @@ -39,8 +39,10 @@ $validation_exception = null; if ($request->isFormPost()) { + $xaction_type = $object->getAlmanacPropertyDeleteTransactionType(); + $xaction = $object->getApplicationTransactionTemplate() - ->setTransactionType(AlmanacTransaction::TYPE_PROPERTY_REMOVE) + ->setTransactionType($xaction_type) ->setMetadataValue('almanac.property', $key); $editor = $object->getApplicationTransactionEditor() diff --git a/src/applications/almanac/editor/AlmanacBindingEditor.php b/src/applications/almanac/editor/AlmanacBindingEditor.php --- a/src/applications/almanac/editor/AlmanacBindingEditor.php +++ b/src/applications/almanac/editor/AlmanacBindingEditor.php @@ -15,4 +15,8 @@ return pht('%s created %s.', $author, $object); } + protected function supportsSearch() { + return true; + } + } diff --git a/src/applications/almanac/editor/AlmanacDeviceEditor.php b/src/applications/almanac/editor/AlmanacDeviceEditor.php --- a/src/applications/almanac/editor/AlmanacDeviceEditor.php +++ b/src/applications/almanac/editor/AlmanacDeviceEditor.php @@ -7,6 +7,18 @@ return pht('Almanac Device'); } + public function getCreateObjectTitle($author, $object) { + return pht('%s created this device.', $author); + } + + public function getCreateObjectTitleForFeed($author, $object) { + return pht('%s created %s.', $author, $object); + } + + protected function supportsSearch() { + return true; + } + public function getTransactionTypes() { $types = parent::getTransactionTypes(); diff --git a/src/applications/almanac/editor/AlmanacEditor.php b/src/applications/almanac/editor/AlmanacEditor.php --- a/src/applications/almanac/editor/AlmanacEditor.php +++ b/src/applications/almanac/editor/AlmanacEditor.php @@ -7,150 +7,4 @@ return 'PhabricatorAlmanacApplication'; } - protected function supportsSearch() { - return true; - } - - public function getTransactionTypes() { - $types = parent::getTransactionTypes(); - - $types[] = AlmanacTransaction::TYPE_PROPERTY_UPDATE; - $types[] = AlmanacTransaction::TYPE_PROPERTY_REMOVE; - - return $types; - } - - protected function getCustomTransactionOldValue( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - switch ($xaction->getTransactionType()) { - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: - $property_key = $xaction->getMetadataValue('almanac.property'); - $exists = $object->hasAlmanacProperty($property_key); - $value = $object->getAlmanacPropertyValue($property_key); - return array( - 'existed' => $exists, - 'value' => $value, - ); - } - - return parent::getCustomTransactionOldValue($object, $xaction); - } - - protected function getCustomTransactionNewValue( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - - switch ($xaction->getTransactionType()) { - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: - return $xaction->getNewValue(); - } - - return parent::getCustomTransactionNewValue($object, $xaction); - } - - protected function applyCustomInternalTransaction( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - - switch ($xaction->getTransactionType()) { - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: - return; - } - - return parent::applyCustomInternalTransaction($object, $xaction); - } - - protected function applyCustomExternalTransaction( - PhabricatorLiskDAO $object, - PhabricatorApplicationTransaction $xaction) { - - switch ($xaction->getTransactionType()) { - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: - $property_key = $xaction->getMetadataValue('almanac.property'); - if ($object->hasAlmanacProperty($property_key)) { - $property = $object->getAlmanacProperty($property_key); - } else { - $property = id(new AlmanacProperty()) - ->setObjectPHID($object->getPHID()) - ->setFieldName($property_key); - } - $property - ->setFieldValue($xaction->getNewValue()) - ->save(); - return; - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: - $property_key = $xaction->getMetadataValue('almanac.property'); - if ($object->hasAlmanacProperty($property_key)) { - $property = $object->getAlmanacProperty($property_key); - $property->delete(); - } - return; - } - - return parent::applyCustomExternalTransaction($object, $xaction); - } - - protected function validateTransaction( - PhabricatorLiskDAO $object, - $type, - array $xactions) { - - $errors = parent::validateTransaction($object, $type, $xactions); - - switch ($type) { - case AlmanacTransaction::TYPE_PROPERTY_UPDATE: - foreach ($xactions as $xaction) { - $property_key = $xaction->getMetadataValue('almanac.property'); - - $message = null; - try { - AlmanacNames::validateName($property_key); - } catch (Exception $ex) { - $message = $ex->getMessage(); - } - - if ($message !== null) { - $error = new PhabricatorApplicationTransactionValidationError( - $type, - pht('Invalid'), - $message, - $xaction); - $errors[] = $error; - continue; - } - - $new_value = $xaction->getNewValue(); - try { - phutil_json_encode($new_value); - } catch (Exception $ex) { - $message = pht( - 'Almanac property values must be representable in JSON. %s', - $ex->getMessage()); - } - - if ($message !== null) { - $error = new PhabricatorApplicationTransactionValidationError( - $type, - pht('Invalid'), - $message, - $xaction); - $errors[] = $error; - continue; - } - } - break; - - case AlmanacTransaction::TYPE_PROPERTY_REMOVE: - // NOTE: No name validation on removals since it's OK to delete - // an invalid property that somehow came into existence. - break; - } - - return $errors; - } - } diff --git a/src/applications/almanac/editor/AlmanacInterfaceEditor.php b/src/applications/almanac/editor/AlmanacInterfaceEditor.php --- a/src/applications/almanac/editor/AlmanacInterfaceEditor.php +++ b/src/applications/almanac/editor/AlmanacInterfaceEditor.php @@ -1,11 +1,7 @@ getPropertyKey(); - $xaction_type = AlmanacTransaction::TYPE_PROPERTY_UPDATE; + $xaction_type = $object->getAlmanacPropertySetTransactionType(); return array( id(new PhabricatorTextEditField()) diff --git a/src/applications/almanac/property/AlmanacPropertyInterface.php b/src/applications/almanac/property/AlmanacPropertyInterface.php --- a/src/applications/almanac/property/AlmanacPropertyInterface.php +++ b/src/applications/almanac/property/AlmanacPropertyInterface.php @@ -9,5 +9,7 @@ public function getAlmanacPropertyValue($key, $default = null); public function getAlmanacPropertyFieldSpecifications(); public function newAlmanacPropertyEditEngine(); + public function getAlmanacPropertySetTransactionType(); + public function getAlmanacPropertyDeleteTransactionType(); } diff --git a/src/applications/almanac/storage/AlmanacBinding.php b/src/applications/almanac/storage/AlmanacBinding.php --- a/src/applications/almanac/storage/AlmanacBinding.php +++ b/src/applications/almanac/storage/AlmanacBinding.php @@ -134,6 +134,14 @@ return new AlmanacBindingPropertyEditEngine(); } + public function getAlmanacPropertySetTransactionType() { + return AlmanacBindingSetPropertyTransaction::TRANSACTIONTYPE; + } + + public function getAlmanacPropertyDeleteTransactionType() { + return AlmanacBindingDeletePropertyTransaction::TRANSACTIONTYPE; + } + /* -( PhabricatorPolicyInterface )----------------------------------------- */ diff --git a/src/applications/almanac/storage/AlmanacBindingTransaction.php b/src/applications/almanac/storage/AlmanacBindingTransaction.php --- a/src/applications/almanac/storage/AlmanacBindingTransaction.php +++ b/src/applications/almanac/storage/AlmanacBindingTransaction.php @@ -1,20 +1,12 @@ setTransactionType(AlmanacTransaction::TYPE_PROPERTY_UPDATE) + ->setTransactionType($object->getAlmanacPropertySetTransactionType()) ->setMetadataValue('almanac.property', $name) ->setNewValue($property); } @@ -71,7 +71,7 @@ $xactions = array(); foreach ($properties as $property) { $xactions[] = id(clone $template) - ->setTransactionType(AlmanacTransaction::TYPE_PROPERTY_REMOVE) + ->setTransactionType($object->getAlmanacPropertyDeleteTransactionType()) ->setMetadataValue('almanac.property', $property) ->setNewValue(null); } diff --git a/src/applications/almanac/storage/AlmanacService.php b/src/applications/almanac/storage/AlmanacService.php --- a/src/applications/almanac/storage/AlmanacService.php +++ b/src/applications/almanac/storage/AlmanacService.php @@ -160,6 +160,14 @@ return new AlmanacServicePropertyEditEngine(); } + public function getAlmanacPropertySetTransactionType() { + return AlmanacServiceSetPropertyTransaction::TRANSACTIONTYPE; + } + + public function getAlmanacPropertyDeleteTransactionType() { + return AlmanacServiceDeletePropertyTransaction::TRANSACTIONTYPE; + } + /* -( PhabricatorPolicyInterface )----------------------------------------- */ diff --git a/src/applications/almanac/storage/AlmanacServiceTransaction.php b/src/applications/almanac/storage/AlmanacServiceTransaction.php --- a/src/applications/almanac/storage/AlmanacServiceTransaction.php +++ b/src/applications/almanac/storage/AlmanacServiceTransaction.php @@ -1,15 +1,7 @@ getAuthorPHID(); - - switch ($this->getTransactionType()) { - case self::TYPE_PROPERTY_UPDATE: - $property_key = $this->getMetadataValue('almanac.property'); - return pht( - '%s updated the property "%s".', - $this->renderHandleLink($author_phid), - $property_key); - case self::TYPE_PROPERTY_REMOVE: - $property_key = $this->getMetadataValue('almanac.property'); - return pht( - '%s deleted the property "%s".', - $this->renderHandleLink($author_phid), - $property_key); - } - - return parent::getTitle(); - } - -} diff --git a/src/applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php b/src/applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php @@ -0,0 +1,20 @@ +getAlmanacPropertyOldValue($object); + } + + public function applyInternalEffects($object, $value) { + return $this->deleteAlmanacProperty($object); + } + + public function getTitle() { + return $this->getAlmanacDeletePropertyTitle(); + } + +} diff --git a/src/applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php b/src/applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php @@ -0,0 +1,24 @@ +getAlmanacPropertyOldValue($object); + } + + public function applyExternalEffects($object, $value) { + return $this->setAlmanacProperty($object, $value); + } + + public function getTitle() { + return $this->getAlmanacSetPropertyTitle(); + } + + public function validateTransactions($object, array $xactions) { + return $this->validateAlmanacSetPropertyTransactions($object, $xactions); + } + +} diff --git a/src/applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php b/src/applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php @@ -0,0 +1,20 @@ +getAlmanacPropertyOldValue($object); + } + + public function applyInternalEffects($object, $value) { + return $this->deleteAlmanacProperty($object); + } + + public function getTitle() { + return $this->getAlmanacDeletePropertyTitle(); + } + +} diff --git a/src/applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php b/src/applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php @@ -0,0 +1,24 @@ +getAlmanacPropertyOldValue($object); + } + + public function applyExternalEffects($object, $value) { + return $this->setAlmanacProperty($object, $value); + } + + public function getTitle() { + return $this->getAlmanacSetPropertyTitle(); + } + + public function validateTransactions($object, array $xactions) { + return $this->validateAlmanacSetPropertyTransactions($object, $xactions); + } + +} diff --git a/src/applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php b/src/applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php @@ -0,0 +1,20 @@ +getAlmanacPropertyOldValue($object); + } + + public function applyInternalEffects($object, $value) { + return $this->deleteAlmanacProperty($object); + } + + public function getTitle() { + return $this->getAlmanacDeletePropertyTitle(); + } + +} diff --git a/src/applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php b/src/applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php @@ -0,0 +1,24 @@ +getAlmanacPropertyOldValue($object); + } + + public function applyExternalEffects($object, $value) { + return $this->setAlmanacProperty($object, $value); + } + + public function getTitle() { + return $this->getAlmanacSetPropertyTitle(); + } + + public function validateTransactions($object, array $xactions) { + return $this->validateAlmanacSetPropertyTransactions($object, $xactions); + } + +} diff --git a/src/applications/almanac/xaction/AlmanacTransactionType.php b/src/applications/almanac/xaction/AlmanacTransactionType.php --- a/src/applications/almanac/xaction/AlmanacTransactionType.php +++ b/src/applications/almanac/xaction/AlmanacTransactionType.php @@ -1,4 +1,97 @@ getMetadataValue('almanac.property'); + $exists = $object->hasAlmanacProperty($property_key); + $value = $object->getAlmanacPropertyValue($property_key); + + return array( + 'existed' => $exists, + 'value' => $value, + ); + } + + protected function setAlmanacProperty($object, $value) { + $property_key = $this->getMetadataValue('almanac.property'); + + if ($object->hasAlmanacProperty($property_key)) { + $property = $object->getAlmanacProperty($property_key); + } else { + $property = id(new AlmanacProperty()) + ->setObjectPHID($object->getPHID()) + ->setFieldName($property_key); + } + + $property + ->setFieldValue($value) + ->save(); + } + + protected function deleteAlmanacProperty($object) { + $property_key = $this->getMetadataValue('almanac.property'); + if ($object->hasAlmanacProperty($property_key)) { + $property = $object->getAlmanacProperty($property_key); + $property->delete(); + } + } + + protected function getAlmanacSetPropertyTitle() { + $property_key = $this->getMetadataValue('almanac.property'); + + return pht( + '%s updated the property %s.', + $this->renderAuthor(), + $this->renderValue($property_key)); + } + + protected function getAlmanacDeletePropertyTitle() { + $property_key = $this->getMetadataValue('almanac.property'); + + return pht( + '%s removed the property %s.', + $this->renderAuthor(), + $this->renderValue($property_key)); + } + + protected function validateAlmanacSetPropertyTransactions( + $object, + array $xactions) { + $errors = array(); + + foreach ($xactions as $xaction) { + $property_key = $xaction->getMetadataValue('almanac.property'); + + $message = null; + try { + AlmanacNames::validateName($property_key); + } catch (Exception $ex) { + $message = $ex->getMessage(); + } + + if ($message !== null) { + $errors[] = $this->newInvalidError($message, $xaction); + continue; + } + + $new_value = $xaction->getNewValue(); + try { + phutil_json_encode($new_value); + } catch (Exception $ex) { + $message = pht( + 'Almanac property values must be representable in JSON. %s', + $ex->getMessage()); + } + + if ($message !== null) { + $errors[] = $this->newInvalidError($message, $xaction); + continue; + } + } + + return $errors; + } + +}