@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 recaptime-dev/main 87 lines 2.6 kB view raw
1<?php 2 3final class PhabricatorProjectSilenceController 4 extends PhabricatorProjectController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $request->getViewer(); 8 $id = $request->getURIData('id'); 9 $action = $request->getURIData('action'); 10 11 $project = id(new PhabricatorProjectQuery()) 12 ->setViewer($viewer) 13 ->withIDs(array($id)) 14 ->needMembers(true) 15 ->executeOne(); 16 if (!$project) { 17 return new Aphront404Response(); 18 } 19 20 $edge_type = PhabricatorProjectSilencedEdgeType::EDGECONST; 21 $done_uri = "/project/members/{$id}/"; 22 $viewer_phid = $viewer->getPHID(); 23 24 if (!$project->isUserMember($viewer_phid)) { 25 return $this->newDialog() 26 ->setTitle(pht('Not a Member')) 27 ->appendParagraph( 28 pht( 29 'You are not a project member, so you do not receive mail sent '. 30 'to members of this project.')) 31 ->addCancelButton($done_uri); 32 } 33 34 $silenced = PhabricatorEdgeQuery::loadDestinationPHIDs( 35 $project->getPHID(), 36 $edge_type); 37 $silenced = array_fuse($silenced); 38 $is_silenced = isset($silenced[$viewer_phid]); 39 40 if ($request->isDialogFormPost()) { 41 if ($is_silenced) { 42 $edge_action = '-'; 43 } else { 44 $edge_action = '+'; 45 } 46 47 $xactions = array(); 48 $xactions[] = id(new PhabricatorProjectTransaction()) 49 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 50 ->setMetadataValue('edge:type', $edge_type) 51 ->setNewValue( 52 array( 53 $edge_action => array($viewer_phid => $viewer_phid), 54 )); 55 56 $editor = id(new PhabricatorProjectTransactionEditor()) 57 ->setActor($viewer) 58 ->setContentSourceFromRequest($request) 59 ->setContinueOnNoEffect(true) 60 ->setContinueOnMissingFields(true) 61 ->applyTransactions($project, $xactions); 62 63 return id(new AphrontRedirectResponse())->setURI($done_uri); 64 } 65 66 if ($is_silenced) { 67 $title = pht('Enable Mail'); 68 $body = pht( 69 'When mail is sent to members of this project, you will receive a '. 70 'copy.'); 71 $button = pht('Enable Project Mail'); 72 } else { 73 $title = pht('Disable Mail'); 74 $body = pht( 75 'When mail is sent to members of this project, you will no longer '. 76 'receive a copy.'); 77 $button = pht('Disable Project Mail'); 78 } 79 80 return $this->newDialog() 81 ->setTitle($title) 82 ->appendParagraph($body) 83 ->addCancelButton($done_uri) 84 ->addSubmitButton($button); 85 } 86 87}