@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 84 lines 2.4 kB view raw
1<?php 2 3final class PhabricatorSubscriptionsSearchEngineAttachment 4 extends PhabricatorSearchEngineAttachment { 5 6 public function getAttachmentName() { 7 return pht('Subscribers'); 8 } 9 10 public function getAttachmentDescription() { 11 return pht('Get information about subscribers.'); 12 } 13 14 public function loadAttachmentData(array $objects, $spec) { 15 $object_phids = mpull($objects, 'getPHID'); 16 $edge_type = PhabricatorObjectHasSubscriberEdgeType::EDGECONST; 17 18 19 $subscribers_query = id(new PhabricatorEdgeQuery()) 20 ->withSourcePHIDs($object_phids) 21 ->withEdgeTypes(array($edge_type)); 22 $subscribers_query->execute(); 23 24 $viewer = $this->getViewer(); 25 $viewer_phid = $viewer->getPHID(); 26 if ($viewer) { 27 $edges = id(new PhabricatorEdgeQuery()) 28 ->withSourcePHIDs($object_phids) 29 ->withEdgeTypes(array($edge_type)) 30 ->withDestinationPHIDs(array($viewer_phid)) 31 ->execute(); 32 33 $viewer_map = array(); 34 foreach ($edges as $object_phid => $types) { 35 if ($types[$edge_type]) { 36 $viewer_map[$object_phid] = true; 37 } 38 } 39 } else { 40 $viewer_map = array(); 41 } 42 43 return array( 44 'subscribers.query' => $subscribers_query, 45 'viewer.map' => $viewer_map, 46 ); 47 } 48 49 public function getAttachmentForObject($object, $data, $spec) { 50 $subscribers_query = idx($data, 'subscribers.query'); 51 $viewer_map = idx($data, 'viewer.map'); 52 $object_phid = $object->getPHID(); 53 54 $subscribed_phids = $subscribers_query->getDestinationPHIDs( 55 array($object_phid), 56 array(PhabricatorObjectHasSubscriberEdgeType::EDGECONST)); 57 $subscribed_count = count($subscribed_phids); 58 if ($subscribed_count > 10) { 59 $subscribed_phids = array_slice($subscribed_phids, 0, 10); 60 } 61 62 $subscribed_phids = array_values($subscribed_phids); 63 64 $viewer = $this->getViewer(); 65 $viewer_phid = $viewer->getPHID(); 66 67 if (!$viewer_phid) { 68 $self_subscribed = false; 69 } else if (isset($viewer_map[$object_phid])) { 70 $self_subscribed = true; 71 } else if ($object->isAutomaticallySubscribed($viewer_phid)) { 72 $self_subscribed = true; 73 } else { 74 $self_subscribed = false; 75 } 76 77 return array( 78 'subscriberPHIDs' => $subscribed_phids, 79 'subscriberCount' => $subscribed_count, 80 'viewerIsSubscribed' => $self_subscribed, 81 ); 82 } 83 84}