mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-12 08:36:13 +01:00
8544d0d00f
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
99 lines
2.7 KiB
PHP
99 lines
2.7 KiB
PHP
<?php
|
|
|
|
final class PhabricatorProjectUpdateController
|
|
extends PhabricatorProjectController {
|
|
|
|
private $id;
|
|
private $action;
|
|
|
|
public function willProcessRequest(array $data) {
|
|
$this->id = $data['id'];
|
|
$this->action = $data['action'];
|
|
}
|
|
|
|
public function processRequest() {
|
|
$request = $this->getRequest();
|
|
$user = $request->getUser();
|
|
|
|
$capabilities = array(
|
|
PhabricatorPolicyCapability::CAN_VIEW,
|
|
);
|
|
|
|
$process_action = false;
|
|
switch ($this->action) {
|
|
case 'join':
|
|
$capabilities[] = PhabricatorPolicyCapability::CAN_JOIN;
|
|
$process_action = $request->isFormPost();
|
|
break;
|
|
case 'leave':
|
|
$process_action = $request->isDialogFormPost();
|
|
break;
|
|
default:
|
|
return new Aphront404Response();
|
|
}
|
|
|
|
$project = id(new PhabricatorProjectQuery())
|
|
->setViewer($user)
|
|
->withIDs(array($this->id))
|
|
->needMembers(true)
|
|
->requireCapabilities($capabilities)
|
|
->executeOne();
|
|
if (!$project) {
|
|
return new Aphront404Response();
|
|
}
|
|
|
|
$project_uri = '/project/view/'.$project->getID().'/';
|
|
|
|
if ($process_action) {
|
|
|
|
$edge_action = null;
|
|
switch ($this->action) {
|
|
case 'join':
|
|
$edge_action = '+';
|
|
break;
|
|
case 'leave':
|
|
$edge_action = '-';
|
|
break;
|
|
}
|
|
|
|
$type_member = PhabricatorEdgeConfig::TYPE_PROJ_MEMBER;
|
|
$member_spec = array(
|
|
$edge_action => array($user->getPHID() => $user->getPHID()),
|
|
);
|
|
|
|
$xactions = array();
|
|
$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($project_uri);
|
|
}
|
|
|
|
$dialog = null;
|
|
switch ($this->action) {
|
|
case 'leave':
|
|
$dialog = new AphrontDialogView();
|
|
$dialog->setUser($user);
|
|
$dialog->setTitle(pht('Really leave project?'));
|
|
$dialog->appendChild(phutil_tag('p', array(), pht(
|
|
'Your tremendous contributions to this project will be sorely '.
|
|
'missed. Are you sure you want to leave?')));
|
|
$dialog->addCancelButton($project_uri);
|
|
$dialog->addSubmitButton(pht('Leave Project'));
|
|
break;
|
|
default:
|
|
return new Aphront404Response();
|
|
}
|
|
|
|
return id(new AphrontDialogResponse())->setDialog($dialog);
|
|
}
|
|
|
|
}
|