[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class DifferentialCommentSaveController 4 extends DifferentialController { 5 6 private $id; 7 8 public function willProcessRequest(array $data) { 9 $this->id = $data['id']; 10 } 11 12 public function processRequest() { 13 $request = $this->getRequest(); 14 $viewer = $request->getUser(); 15 16 if (!$request->isFormPost()) { 17 return new Aphront400Response(); 18 } 19 20 $revision = id(new DifferentialRevisionQuery()) 21 ->setViewer($viewer) 22 ->withIDs(array($this->id)) 23 ->needReviewerStatus(true) 24 ->needReviewerAuthority(true) 25 ->executeOne(); 26 if (!$revision) { 27 return new Aphront404Response(); 28 } 29 30 $type_action = DifferentialTransaction::TYPE_ACTION; 31 $type_subscribers = PhabricatorTransactions::TYPE_SUBSCRIBERS; 32 $type_edge = PhabricatorTransactions::TYPE_EDGE; 33 $type_comment = PhabricatorTransactions::TYPE_COMMENT; 34 $type_inline = DifferentialTransaction::TYPE_INLINE; 35 36 $edge_reviewer = PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER; 37 38 $xactions = array(); 39 40 $action = $request->getStr('action'); 41 switch ($action) { 42 case DifferentialAction::ACTION_COMMENT: 43 case DifferentialAction::ACTION_ADDREVIEWERS: 44 case DifferentialAction::ACTION_ADDCCS: 45 // These transaction types have no direct effect, they just 46 // accompany other transaction types which can have an effect. 47 break; 48 default: 49 $xactions[] = id(new DifferentialTransaction()) 50 ->setTransactionType($type_action) 51 ->setNewValue($request->getStr('action')); 52 break; 53 } 54 55 $ccs = $request->getArr('ccs'); 56 if ($ccs) { 57 $xactions[] = id(new DifferentialTransaction()) 58 ->setTransactionType($type_subscribers) 59 ->setNewValue(array('+' => $ccs)); 60 } 61 62 $current_reviewers = mpull( 63 $revision->getReviewerStatus(), 64 null, 65 'getReviewerPHID'); 66 67 $reviewer_edges = array(); 68 $add_reviewers = $request->getArr('reviewers'); 69 foreach ($add_reviewers as $reviewer_phid) { 70 if (isset($current_reviewers[$reviewer_phid])) { 71 continue; 72 } 73 $reviewer = new DifferentialReviewer( 74 $reviewer_phid, 75 array( 76 'status' => DifferentialReviewerStatus::STATUS_ADDED, 77 )); 78 $reviewer_edges[$reviewer_phid] = array( 79 'data' => $reviewer->getEdgeData(), 80 ); 81 } 82 83 if ($add_reviewers) { 84 $xactions[] = id(new DifferentialTransaction()) 85 ->setTransactionType($type_edge) 86 ->setMetadataValue('edge:type', $edge_reviewer) 87 ->setNewValue(array('+' => $reviewer_edges)); 88 } 89 90 $inlines = DifferentialTransactionQuery::loadUnsubmittedInlineComments( 91 $viewer, 92 $revision); 93 foreach ($inlines as $inline) { 94 $xactions[] = id(new DifferentialTransaction()) 95 ->setTransactionType($type_inline) 96 ->attachComment($inline); 97 } 98 99 // NOTE: If there are no other transactions, add an empty comment 100 // transaction so that we'll raise a more user-friendly error message, 101 // to the effect of "you can not post an empty comment". 102 $no_xactions = !$xactions; 103 104 $comment = $request->getStr('comment'); 105 if (strlen($comment) || $no_xactions) { 106 $xactions[] = id(new DifferentialTransaction()) 107 ->setTransactionType($type_comment) 108 ->attachComment( 109 id(new DifferentialTransactionComment()) 110 ->setRevisionPHID($revision->getPHID()) 111 ->setContent($comment)); 112 } 113 114 115 $editor = id(new DifferentialTransactionEditor()) 116 ->setActor($viewer) 117 ->setContentSourceFromRequest($request) 118 ->setContinueOnMissingFields(true) 119 ->setContinueOnNoEffect($request->isContinueRequest()); 120 121 $revision_uri = '/D'.$revision->getID(); 122 123 try { 124 $editor->applyTransactions($revision, $xactions); 125 } catch (PhabricatorApplicationTransactionNoEffectException $ex) { 126 return id(new PhabricatorApplicationTransactionNoEffectResponse()) 127 ->setCancelURI($revision_uri) 128 ->setException($ex); 129 } catch (PhabricatorApplicationTransactionValidationException $ex) { 130 // TODO: Provide a nice Response for rendering these in a clean way. 131 throw $ex; 132 } 133 134 $user = $request->getUser(); 135 $draft = id(new PhabricatorDraft())->loadOneWhere( 136 'authorPHID = %s AND draftKey = %s', 137 $user->getPHID(), 138 'differential-comment-'.$revision->getID()); 139 if ($draft) { 140 $draft->delete(); 141 } 142 DifferentialDraft::deleteAllDrafts($user->getPHID(), $revision->getPHID()); 143 144 return id(new AphrontRedirectResponse()) 145 ->setURI('/D'.$revision->getID()); 146 } 147 148 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |