Correct a parameter order swap in "diffusion.historyquery" for Mercurial
[phabricator.git] / src / applications / project / policyrule / PhabricatorProjectMembersPolicyRule.php
blob5fa57a31dac114afeb408c228bac9a9db6176e67
1 <?php
3 final class PhabricatorProjectMembersPolicyRule extends PhabricatorPolicyRule {
5 private $memberships = array();
7 public function getRuleDescription() {
8 return pht('members of project');
11 public function willApplyRules(
12 PhabricatorUser $viewer,
13 array $values,
14 array $objects) {
16 $viewer_phid = $viewer->getPHID();
17 if (!$viewer_phid) {
18 return;
21 if (empty($this->memberships[$viewer_phid])) {
22 $this->memberships[$viewer_phid] = array();
25 foreach ($objects as $key => $object) {
26 $cache = $this->getTransactionHint($object);
27 if ($cache === null) {
28 continue;
31 unset($objects[$key]);
33 if (isset($cache[$viewer_phid])) {
34 $this->memberships[$viewer_phid][$object->getPHID()] = true;
38 if (!$objects) {
39 return;
42 $object_phids = mpull($objects, 'getPHID');
43 $edge_query = id(new PhabricatorEdgeQuery())
44 ->withSourcePHIDs(array($viewer_phid))
45 ->withDestinationPHIDs($object_phids)
46 ->withEdgeTypes(
47 array(
48 PhabricatorProjectMemberOfProjectEdgeType::EDGECONST,
49 ));
50 $edge_query->execute();
52 $memberships = $edge_query->getDestinationPHIDs();
53 if (!$memberships) {
54 return;
57 $this->memberships[$viewer_phid] += array_fill_keys($memberships, true);
60 public function applyRule(
61 PhabricatorUser $viewer,
62 $value,
63 PhabricatorPolicyInterface $object) {
64 $viewer_phid = $viewer->getPHID();
65 if (!$viewer_phid) {
66 return false;
69 $memberships = idx($this->memberships, $viewer_phid);
70 return isset($memberships[$object->getPHID()]);
73 public function getValueControlType() {
74 return self::CONTROL_TYPE_NONE;
77 public function canApplyToObject(PhabricatorPolicyInterface $object) {
78 return ($object instanceof PhabricatorProject);
81 public function getObjectPolicyKey() {
82 return 'project.members';
85 public function getObjectPolicyName() {
86 return pht('Project Members');
89 public function getObjectPolicyIcon() {
90 return 'fa-users';
93 public function getPolicyExplanation() {
94 return pht('Project members can take this action.');