[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/differential/controller/ -> DifferentialCommentSaveController.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1