Differential D20220 Diff 48333 src/applications/harbormaster/xaction/plan/HarbormasterBuildPlanBehaviorTransaction.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/harbormaster/xaction/plan/HarbormasterBuildPlanBehaviorTransaction.php
- This file was added.
<?php | |||||
final class HarbormasterBuildPlanBehaviorTransaction | |||||
extends HarbormasterBuildPlanTransactionType { | |||||
const TRANSACTIONTYPE = 'behavior'; | |||||
public function generateOldValue($object) { | |||||
$behavior = $this->getBehavior(); | |||||
return $behavior->getPlanOption($object)->getKey(); | |||||
} | |||||
public function applyInternalEffects($object, $value) { | |||||
$key = $this->getStorageKey(); | |||||
return $object->setPlanProperty($key, $value); | |||||
} | |||||
public function getTitle() { | |||||
$old_value = $this->getOldValue(); | |||||
$new_value = $this->getNewValue(); | |||||
$behavior = $this->getBehavior(); | |||||
if ($behavior) { | |||||
$behavior_name = $behavior->getName(); | |||||
$options = $behavior->getOptions(); | |||||
if (isset($options[$old_value])) { | |||||
$old_value = $options[$old_value]->getName(); | |||||
} | |||||
if (isset($options[$new_value])) { | |||||
$new_value = $options[$new_value]->getName(); | |||||
} | |||||
} else { | |||||
$behavior_name = $this->getBehaviorKey(); | |||||
} | |||||
return pht( | |||||
'%s changed the %s behavior for this plan from %s to %s.', | |||||
$this->renderAuthor(), | |||||
$this->renderValue($behavior_name), | |||||
$this->renderValue($old_value), | |||||
$this->renderValue($new_value)); | |||||
} | |||||
public function validateTransactions($object, array $xactions) { | |||||
$errors = array(); | |||||
$behaviors = HarbormasterBuildPlanBehavior::newPlanBehaviors(); | |||||
$behaviors = mpull($behaviors, null, 'getKey'); | |||||
foreach ($xactions as $xaction) { | |||||
$key = $this->getBehaviorKeyForTransaction($xaction); | |||||
if (!isset($behaviors[$key])) { | |||||
$errors[] = $this->newInvalidError( | |||||
pht( | |||||
'No behavior with key "%s" exists. Valid keys are: %s.', | |||||
$key, | |||||
implode(', ', array_keys($behaviors))), | |||||
$xaction); | |||||
continue; | |||||
} | |||||
$behavior = $behaviors[$key]; | |||||
$options = $behavior->getOptions(); | |||||
$storage_key = HarbormasterBuildPlanBehavior::getStorageKeyForBehaviorKey( | |||||
$key); | |||||
$old = $object->getPlanProperty($storage_key); | |||||
$new = $xaction->getNewValue(); | |||||
if ($old === $new) { | |||||
continue; | |||||
} | |||||
if (!isset($options[$new])) { | |||||
$errors[] = $this->newInvalidError( | |||||
pht( | |||||
'Value "%s" is not a valid option for behavior "%s". Valid '. | |||||
'options are: %s.', | |||||
$new, | |||||
$key, | |||||
implode(', ', array_keys($options))), | |||||
$xaction); | |||||
continue; | |||||
} | |||||
} | |||||
return $errors; | |||||
} | |||||
public function getTransactionTypeForConduit($xaction) { | |||||
return 'behavior'; | |||||
} | |||||
public function getFieldValuesForConduit($xaction, $data) { | |||||
return array( | |||||
'key' => $this->getBehaviorKeyForTransaction($xaction), | |||||
'old' => $xaction->getOldValue(), | |||||
'new' => $xaction->getNewValue(), | |||||
); | |||||
} | |||||
private function getBehaviorKeyForTransaction( | |||||
PhabricatorApplicationTransaction $xaction) { | |||||
$metadata_key = HarbormasterBuildPlanBehavior::getTransactionMetadataKey(); | |||||
return $xaction->getMetadataValue($metadata_key); | |||||
} | |||||
private function getBehaviorKey() { | |||||
$metadata_key = HarbormasterBuildPlanBehavior::getTransactionMetadataKey(); | |||||
return $this->getMetadataValue($metadata_key); | |||||
} | |||||
private function getBehavior() { | |||||
$behavior_key = $this->getBehaviorKey(); | |||||
$behaviors = HarbormasterBuildPlanBehavior::newPlanBehaviors(); | |||||
return idx($behaviors, $behavior_key); | |||||
} | |||||
private function getStorageKey() { | |||||
return HarbormasterBuildPlanBehavior::getStorageKeyForBehaviorKey( | |||||
$this->getBehaviorKey()); | |||||
} | |||||
} |