Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2891328
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
3 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php b/src/applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php
index 7da35f3703..b7644cd68d 100644
--- a/src/applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php
+++ b/src/applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php
@@ -1,121 +1,125 @@
<?php
final class PhabricatorSubscriptionsSubscribersPolicyRule
extends PhabricatorPolicyRule {
private $subscribed = array();
private $sourcePHIDs = array();
public function getObjectPolicyKey() {
return 'subscriptions.subscribers';
}
public function getObjectPolicyName() {
return pht('Subscribers');
}
public function getPolicyExplanation() {
return pht('Subscribers can take this action.');
}
public function getRuleDescription() {
return pht('subscribers');
}
public function canApplyToObject(PhabricatorPolicyInterface $object) {
return ($object instanceof PhabricatorSubscribableInterface);
}
public function willApplyRules(
PhabricatorUser $viewer,
array $values,
array $objects) {
// We want to let the user see the object if they're a subscriber or
// a member of any project which is a subscriber. Additionally, because
// subscriber state is complex, we need to read hints passed from
// the TransactionEditor to predict policy state after transactions apply.
$viewer_phid = $viewer->getPHID();
if (!$viewer_phid) {
return;
}
if (empty($this->subscribed[$viewer_phid])) {
$this->subscribed[$viewer_phid] = array();
}
// Load the project PHIDs the user is a member of.
if (!isset($this->sourcePHIDs[$viewer_phid])) {
- $source_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
- $viewer_phid,
- PhabricatorProjectMemberOfProjectEdgeType::EDGECONST);
+ $projects = id(new PhabricatorProjectQuery())
+ ->setViewer($viewer)
+ ->withMemberPHIDs(array($viewer_phid))
+ ->execute();
+
+ $source_phids = mpull($projects, 'getPHID');
$source_phids[] = $viewer_phid;
+
$this->sourcePHIDs[$viewer_phid] = $source_phids;
}
// Look for transaction hints.
foreach ($objects as $key => $object) {
$cache = $this->getTransactionHint($object);
if ($cache === null) {
// We don't have a hint for this object, so we'll deal with it below.
continue;
}
// We have a hint, so use that as the source of truth.
unset($objects[$key]);
foreach ($this->sourcePHIDs[$viewer_phid] as $source_phid) {
if (isset($cache[$source_phid])) {
$this->subscribed[$viewer_phid][$object->getPHID()] = true;
break;
}
}
}
$phids = mpull($objects, 'getPHID');
if (!$phids) {
return;
}
$edge_query = id(new PhabricatorEdgeQuery())
->withSourcePHIDs($this->sourcePHIDs[$viewer_phid])
->withEdgeTypes(
array(
PhabricatorSubscribedToObjectEdgeType::EDGECONST,
))
->withDestinationPHIDs($phids);
$edge_query->execute();
$subscribed = $edge_query->getDestinationPHIDs();
if (!$subscribed) {
return;
}
$this->subscribed[$viewer_phid] += array_fill_keys($subscribed, true);
}
public function applyRule(
PhabricatorUser $viewer,
$value,
PhabricatorPolicyInterface $object) {
$viewer_phid = $viewer->getPHID();
if (!$viewer_phid) {
return false;
}
if ($object->isAutomaticallySubscribed($viewer_phid)) {
return true;
}
$subscribed = idx($this->subscribed, $viewer_phid);
return isset($subscribed[$object->getPHID()]);
}
public function getValueControlType() {
return self::CONTROL_TYPE_NONE;
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sun, Jan 19, 15:02 (3 w, 2 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1125764
Default Alt Text
(3 KB)
Attached To
Mode
rP Phorge
Attached
Detach File
Event Timeline
Log In to Comment