Changeset View
Changeset View
Standalone View
Standalone View
src/applications/project/editor/PhabricatorProjectEditor.php
Show All 22 Lines | public static function applyJoinProject( | ||||
PhabricatorUser $user) { | PhabricatorUser $user) { | ||||
$members = $project->getMemberPHIDs(); | $members = $project->getMemberPHIDs(); | ||||
$members[] = $user->getPHID(); | $members[] = $user->getPHID(); | ||||
self::applyOneTransaction( | self::applyOneTransaction( | ||||
$project, | $project, | ||||
$user, | $user, | ||||
PhabricatorProjectTransactionType::TYPE_MEMBERS, | PhabricatorProjectTransaction::TYPE_MEMBERS, | ||||
$members); | $members); | ||||
} | } | ||||
public static function applyLeaveProject( | public static function applyLeaveProject( | ||||
PhabricatorProject $project, | PhabricatorProject $project, | ||||
PhabricatorUser $user) { | PhabricatorUser $user) { | ||||
$members = array_fill_keys($project->getMemberPHIDs(), true); | $members = array_fill_keys($project->getMemberPHIDs(), true); | ||||
unset($members[$user->getPHID()]); | unset($members[$user->getPHID()]); | ||||
$members = array_keys($members); | $members = array_keys($members); | ||||
self::applyOneTransaction( | self::applyOneTransaction( | ||||
$project, | $project, | ||||
$user, | $user, | ||||
PhabricatorProjectTransactionType::TYPE_MEMBERS, | PhabricatorProjectTransaction::TYPE_MEMBERS, | ||||
$members); | $members); | ||||
} | } | ||||
private static function applyOneTransaction( | private static function applyOneTransaction( | ||||
PhabricatorProject $project, | PhabricatorProject $project, | ||||
PhabricatorUser $user, | PhabricatorUser $user, | ||||
$type, | $type, | ||||
$new_value) { | $new_value) { | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | try { | ||||
} | } | ||||
foreach ($this->addEdges as $phid) { | foreach ($this->addEdges as $phid) { | ||||
$editor->addEdge($project->getPHID(), $edge_type, $phid); | $editor->addEdge($project->getPHID(), $edge_type, $phid); | ||||
} | } | ||||
$editor->save(); | $editor->save(); | ||||
foreach ($transactions as $xaction) { | foreach ($transactions as $xaction) { | ||||
$xaction->setAuthorPHID($actor->getPHID()); | $xaction->setAuthorPHID($actor->getPHID()); | ||||
$xaction->setProjectID($project->getID()); | $xaction->setObjectPHID($project->getPHID()); | ||||
$xaction->setViewPolicy('public'); | |||||
$xaction->setEditPolicy($actor->getPHID()); | |||||
$xaction->setContentSource( | |||||
PhabricatorContentSource::newForSource( | |||||
PhabricatorContentSource::SOURCE_LEGACY, | |||||
array())); | |||||
$xaction->save(); | $xaction->save(); | ||||
} | } | ||||
$project->saveTransaction(); | $project->saveTransaction(); | ||||
foreach ($transactions as $xaction) { | |||||
$this->publishTransactionStory($project, $xaction); | |||||
} | |||||
} catch (AphrontQueryDuplicateKeyException $ex) { | } catch (AphrontQueryDuplicateKeyException $ex) { | ||||
// We already validated the slug, but might race. Try again to see if | // We already validated the slug, but might race. Try again to see if | ||||
// that's the issue. If it is, we'll throw a more specific exception. If | // that's the issue. If it is, we'll throw a more specific exception. If | ||||
// not, throw the original exception. | // not, throw the original exception. | ||||
$this->validateName($project); | $this->validateName($project); | ||||
throw $ex; | throw $ex; | ||||
} | } | ||||
Show All 32 Lines | final class PhabricatorProjectEditor extends PhabricatorEditor { | ||||
} | } | ||||
private function setTransactionOldValue( | private function setTransactionOldValue( | ||||
PhabricatorProject $project, | PhabricatorProject $project, | ||||
PhabricatorProjectTransaction $xaction) { | PhabricatorProjectTransaction $xaction) { | ||||
$type = $xaction->getTransactionType(); | $type = $xaction->getTransactionType(); | ||||
switch ($type) { | switch ($type) { | ||||
case PhabricatorProjectTransactionType::TYPE_NAME: | case PhabricatorProjectTransaction::TYPE_NAME: | ||||
$xaction->setOldValue($project->getName()); | $xaction->setOldValue($project->getName()); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_STATUS: | case PhabricatorProjectTransaction::TYPE_STATUS: | ||||
$xaction->setOldValue($project->getStatus()); | $xaction->setOldValue($project->getStatus()); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_MEMBERS: | case PhabricatorProjectTransaction::TYPE_MEMBERS: | ||||
$member_phids = $project->getMemberPHIDs(); | $member_phids = $project->getMemberPHIDs(); | ||||
$old_value = array_values($member_phids); | $old_value = array_values($member_phids); | ||||
$xaction->setOldValue($old_value); | $xaction->setOldValue($old_value); | ||||
$new_value = $xaction->getNewValue(); | $new_value = $xaction->getNewValue(); | ||||
$new_value = array_filter($new_value); | $new_value = array_filter($new_value); | ||||
$new_value = array_unique($new_value); | $new_value = array_unique($new_value); | ||||
$new_value = array_values($new_value); | $new_value = array_values($new_value); | ||||
$xaction->setNewValue($new_value); | $xaction->setNewValue($new_value); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_CAN_VIEW: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
$xaction->setOldValue($project->getViewPolicy()); | $xaction->setOldValue($project->getViewPolicy()); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_CAN_EDIT: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
$xaction->setOldValue($project->getEditPolicy()); | $xaction->setOldValue($project->getEditPolicy()); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_CAN_JOIN: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
$xaction->setOldValue($project->getJoinPolicy()); | $xaction->setOldValue($project->getJoinPolicy()); | ||||
break; | break; | ||||
default: | default: | ||||
throw new Exception("Unknown transaction type '{$type}'!"); | throw new Exception("Unknown transaction type '{$type}'!"); | ||||
} | } | ||||
return $this; | return $this; | ||||
} | } | ||||
private function applyTransactionEffect( | private function applyTransactionEffect( | ||||
PhabricatorProject $project, | PhabricatorProject $project, | ||||
PhabricatorProjectTransaction $xaction) { | PhabricatorProjectTransaction $xaction) { | ||||
$type = $xaction->getTransactionType(); | $type = $xaction->getTransactionType(); | ||||
switch ($type) { | switch ($type) { | ||||
case PhabricatorProjectTransactionType::TYPE_NAME: | case PhabricatorProjectTransaction::TYPE_NAME: | ||||
$old_slug = $project->getFullPhrictionSlug(); | $old_slug = $project->getFullPhrictionSlug(); | ||||
$project->setName($xaction->getNewValue()); | $project->setName($xaction->getNewValue()); | ||||
$project->setPhrictionSlug($xaction->getNewValue()); | $project->setPhrictionSlug($xaction->getNewValue()); | ||||
if ($xaction->getOldValue()) { | if ($xaction->getOldValue()) { | ||||
$old_document = id(new PhrictionDocument()) | $old_document = id(new PhrictionDocument()) | ||||
->loadOneWhere( | ->loadOneWhere( | ||||
'slug = %s', | 'slug = %s', | ||||
Show All 17 Lines | switch ($type) { | ||||
->moveHere($old_document->getID(), $old_document->getPHID()); | ->moveHere($old_document->getID(), $old_document->getPHID()); | ||||
$target_document = $target_editor->getDocument(); | $target_document = $target_editor->getDocument(); | ||||
$from_editor->moveAway($target_document->getID()); | $from_editor->moveAway($target_document->getID()); | ||||
} | } | ||||
} | } | ||||
$this->validateName($project); | $this->validateName($project); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_STATUS: | case PhabricatorProjectTransaction::TYPE_STATUS: | ||||
$project->setStatus($xaction->getNewValue()); | $project->setStatus($xaction->getNewValue()); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_MEMBERS: | case PhabricatorProjectTransaction::TYPE_MEMBERS: | ||||
$old = array_fill_keys($xaction->getOldValue(), true); | $old = array_fill_keys($xaction->getOldValue(), true); | ||||
$new = array_fill_keys($xaction->getNewValue(), true); | $new = array_fill_keys($xaction->getNewValue(), true); | ||||
$this->addEdges = array_keys(array_diff_key($new, $old)); | $this->addEdges = array_keys(array_diff_key($new, $old)); | ||||
$this->remEdges = array_keys(array_diff_key($old, $new)); | $this->remEdges = array_keys(array_diff_key($old, $new)); | ||||
if ($new === array()) { | if ($new === array()) { | ||||
$this->setShouldArchive(true); | $this->setShouldArchive(true); | ||||
} | } | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_CAN_VIEW: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
$project->setViewPolicy($xaction->getNewValue()); | $project->setViewPolicy($xaction->getNewValue()); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_CAN_EDIT: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
$project->setEditPolicy($xaction->getNewValue()); | $project->setEditPolicy($xaction->getNewValue()); | ||||
// You can't edit away your ability to edit the project. | // You can't edit away your ability to edit the project. | ||||
PhabricatorPolicyFilter::mustRetainCapability( | PhabricatorPolicyFilter::mustRetainCapability( | ||||
$this->getActor(), | $this->getActor(), | ||||
$project, | $project, | ||||
PhabricatorPolicyCapability::CAN_EDIT); | PhabricatorPolicyCapability::CAN_EDIT); | ||||
break; | break; | ||||
case PhabricatorProjectTransactionType::TYPE_CAN_JOIN: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
$project->setJoinPolicy($xaction->getNewValue()); | $project->setJoinPolicy($xaction->getNewValue()); | ||||
break; | break; | ||||
default: | default: | ||||
throw new Exception("Unknown transaction type '{$type}'!"); | throw new Exception("Unknown transaction type '{$type}'!"); | ||||
} | } | ||||
} | } | ||||
private function publishTransactionStory( | |||||
PhabricatorProject $project, | |||||
PhabricatorProjectTransaction $xaction) { | |||||
$related_phids = array( | |||||
$project->getPHID(), | |||||
$xaction->getAuthorPHID(), | |||||
); | |||||
id(new PhabricatorFeedStoryPublisher()) | |||||
->setStoryType(PhabricatorFeedStoryTypeConstants::STORY_PROJECT) | |||||
->setStoryData( | |||||
array( | |||||
'projectPHID' => $project->getPHID(), | |||||
'transactionID' => $xaction->getID(), | |||||
'type' => $xaction->getTransactionType(), | |||||
'old' => $xaction->getOldValue(), | |||||
'new' => $xaction->getNewValue(), | |||||
)) | |||||
->setStoryTime(time()) | |||||
->setStoryAuthorPHID($xaction->getAuthorPHID()) | |||||
->setRelatedPHIDs($related_phids) | |||||
->publish(); | |||||
} | |||||
private function transactionHasEffect( | private function transactionHasEffect( | ||||
PhabricatorProjectTransaction $xaction) { | PhabricatorProjectTransaction $xaction) { | ||||
return ($xaction->getOldValue() !== $xaction->getNewValue()); | return ($xaction->getOldValue() !== $xaction->getNewValue()); | ||||
} | } | ||||
/** | /** | ||||
* All transactions except joining or leaving a project require edit | * All transactions except joining or leaving a project require edit | ||||
Show All 23 Lines | final class PhabricatorProjectEditor extends PhabricatorEditor { | ||||
* the project. | * the project. | ||||
* | * | ||||
* Returns null in all other cases. | * Returns null in all other cases. | ||||
*/ | */ | ||||
private function isJoinOrLeaveTransaction( | private function isJoinOrLeaveTransaction( | ||||
PhabricatorProjectTransaction $xaction) { | PhabricatorProjectTransaction $xaction) { | ||||
$type = $xaction->getTransactionType(); | $type = $xaction->getTransactionType(); | ||||
if ($type != PhabricatorProjectTransactionType::TYPE_MEMBERS) { | if ($type != PhabricatorProjectTransaction::TYPE_MEMBERS) { | ||||
return null; | return null; | ||||
} | } | ||||
switch ($type) { | switch ($type) { | ||||
case PhabricatorProjectTransactionType::TYPE_MEMBERS: | case PhabricatorProjectTransaction::TYPE_MEMBERS: | ||||
$old = $xaction->getOldValue(); | $old = $xaction->getOldValue(); | ||||
$new = $xaction->getNewValue(); | $new = $xaction->getNewValue(); | ||||
$add = array_diff($new, $old); | $add = array_diff($new, $old); | ||||
$rem = array_diff($old, $new); | $rem = array_diff($old, $new); | ||||
if (count($add) > 1) { | if (count($add) > 1) { | ||||
return null; | return null; | ||||
Show All 24 Lines |