Changeset View
Changeset View
Standalone View
Standalone View
src/applications/almanac/editor/AlmanacEditor.php
| <?php | <?php | ||||
| abstract class AlmanacEditor | abstract class AlmanacEditor | ||||
| extends PhabricatorApplicationTransactionEditor { | extends PhabricatorApplicationTransactionEditor { | ||||
| public function getEditorApplicationClass() { | public function getEditorApplicationClass() { | ||||
| return 'PhabricatorAlmanacApplication'; | 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; | |||||
| } | |||||
| } | } | ||||