Implement "Edit Members" and "Join/Leave" with real ApplicationTransactions
Summary: Ref T4379. Projects has been partially converted to ApplicationTransactions, but the rough state of the world is that all the //storage// is modern, but most of the stuff on top isn't yet. Particularly, there's a `PhabricatorProjectEditor` which is //not// a subclass of `PhabricatorApplicationTransactionEditor`, but which fakes its way through writing reasonable data into modern storage. This introduces a real transaction editor, `PhabricatorProjectTransactionEditor`, with the eventual goal of moving all of the old functionality into it and deleting the old class. This diff only moves the membership transaction into new code (it doesn't even move all of it -- when we create a project, we add the author as a member, and that can't move quite yet since there are other transactions at the same time). Test Plan: - Created a new project. - Edited members. - Joined / left project. - This already has a pile of unit test coverage. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4379 Differential Revision: https://secure.phabricator.com/D8167
This commit is contained in:
@@ -29,41 +29,34 @@ final class PhabricatorProjectMembersEditController
|
||||
|
||||
$member_phids = $project->getMemberPHIDs();
|
||||
|
||||
$errors = array();
|
||||
if ($request->isFormPost()) {
|
||||
$changed_something = false;
|
||||
$member_map = array_fill_keys($member_phids, true);
|
||||
$member_spec = array();
|
||||
|
||||
$remove = $request->getStr('remove');
|
||||
if ($remove) {
|
||||
if (isset($member_map[$remove])) {
|
||||
unset($member_map[$remove]);
|
||||
$changed_something = true;
|
||||
}
|
||||
} else {
|
||||
$new_members = $request->getArr('phids');
|
||||
foreach ($new_members as $member) {
|
||||
if (empty($member_map[$member])) {
|
||||
$member_map[$member] = true;
|
||||
$changed_something = true;
|
||||
}
|
||||
}
|
||||
$member_spec['-'] = array_fuse(array($remove));
|
||||
}
|
||||
|
||||
$add_members = $request->getArr('phids');
|
||||
if ($add_members) {
|
||||
$member_spec['+'] = array_fuse($add_members);
|
||||
}
|
||||
|
||||
$type_member = PhabricatorEdgeConfig::TYPE_PROJ_MEMBER;
|
||||
|
||||
$xactions = array();
|
||||
if ($changed_something) {
|
||||
$xaction = new PhabricatorProjectTransaction();
|
||||
$xaction->setTransactionType(
|
||||
PhabricatorProjectTransaction::TYPE_MEMBERS);
|
||||
$xaction->setNewValue(array_keys($member_map));
|
||||
$xactions[] = $xaction;
|
||||
}
|
||||
|
||||
if ($xactions) {
|
||||
$editor = new PhabricatorProjectEditor($project);
|
||||
$editor->setActor($user);
|
||||
$editor->applyTransactions($xactions);
|
||||
}
|
||||
$xactions[] = id(new PhabricatorProjectTransaction())
|
||||
->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
|
||||
->setMetadataValue('edge:type', $type_member)
|
||||
->setNewValue($member_spec);
|
||||
|
||||
$editor = id(new PhabricatorProjectTransactionEditor($project))
|
||||
->setActor($user)
|
||||
->setContentSourceFromRequest($request)
|
||||
->setContinueOnNoEffect(true)
|
||||
->setContinueOnMissingFields(true)
|
||||
->applyTransactions($project, $xactions);
|
||||
|
||||
return id(new AphrontRedirectResponse())
|
||||
->setURI($request->getRequestURI());
|
||||
|
||||
Reference in New Issue
Block a user