[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

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

   1  <?php
   2  
   3  final class DifferentialCommentPreviewController
   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      $revision = id(new DifferentialRevisionQuery())
  17        ->setViewer($viewer)
  18        ->withIDs(array($this->id))
  19        ->executeOne();
  20      if (!$revision) {
  21        return new Aphront404Response();
  22      }
  23  
  24      $type_comment = PhabricatorTransactions::TYPE_COMMENT;
  25      $type_action = DifferentialTransaction::TYPE_ACTION;
  26      $type_edge = PhabricatorTransactions::TYPE_EDGE;
  27      $type_subscribers = PhabricatorTransactions::TYPE_SUBSCRIBERS;
  28  
  29      $xactions = array();
  30  
  31      $action = $request->getStr('action');
  32      switch ($action) {
  33        case DifferentialAction::ACTION_COMMENT:
  34        case DifferentialAction::ACTION_ADDREVIEWERS:
  35        case DifferentialAction::ACTION_ADDCCS:
  36          break;
  37        default:
  38          $xactions[] = id(new DifferentialTransaction())
  39            ->setTransactionType($type_action)
  40            ->setNewValue($action);
  41          break;
  42      }
  43  
  44      $edge_reviewer = PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER;
  45  
  46      $reviewers = $request->getStrList('reviewers');
  47      if (DifferentialAction::allowReviewers($action) && $reviewers) {
  48        $faux_edges = array();
  49        foreach ($reviewers as $phid) {
  50          $faux_edges[$phid] = array(
  51            'src' => $revision->getPHID(),
  52            'type' => $edge_reviewer,
  53            'dst' => $phid,
  54          );
  55        }
  56  
  57        $xactions[] = id(new DifferentialTransaction())
  58          ->setTransactionType($type_edge)
  59          ->setMetadataValue('edge:type', $edge_reviewer)
  60          ->setOldValue(array())
  61          ->setNewValue($faux_edges);
  62      }
  63  
  64      $ccs = $request->getStrList('ccs');
  65      if ($ccs) {
  66        $xactions[] = id(new DifferentialTransaction())
  67          ->setTransactionType($type_subscribers)
  68          ->setOldValue(array())
  69          ->setNewValue(array_fuse($ccs));
  70      }
  71  
  72      // Add a comment transaction if there's nothing, so we'll generate a
  73      // nonempty result.
  74      if (strlen($request->getStr('content')) || !$xactions) {
  75        $xactions[] = id(new DifferentialTransaction())
  76          ->setTransactionType($type_comment)
  77          ->attachComment(
  78            id(new ManiphestTransactionComment())
  79              ->setContent($request->getStr('content')));
  80      }
  81  
  82      foreach ($xactions as $xaction) {
  83        $xaction->setAuthorPHID($viewer->getPHID());
  84      }
  85  
  86      $engine = new PhabricatorMarkupEngine();
  87      $engine->setViewer($request->getUser());
  88      foreach ($xactions as $xaction) {
  89        if ($xaction->hasComment()) {
  90          $engine->addObject(
  91            $xaction->getComment(),
  92            PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
  93        }
  94      }
  95      $engine->process();
  96  
  97      $phids = mpull($xactions, 'getRequiredHandlePHIDs');
  98      $phids = array_mergev($phids);
  99  
 100      $handles = id(new PhabricatorHandleQuery())
 101        ->setViewer($viewer)
 102        ->withPHIDs($phids)
 103        ->execute();
 104  
 105      foreach ($xactions as $xaction) {
 106        $xaction->setHandles($handles);
 107      }
 108  
 109      $view = id(new DifferentialTransactionView())
 110        ->setUser($viewer)
 111        ->setTransactions($xactions)
 112        ->setIsPreview(true);
 113  
 114      $metadata = array(
 115        'reviewers' => $reviewers,
 116        'ccs' => $ccs,
 117      );
 118      if ($action != DifferentialAction::ACTION_COMMENT) {
 119        $metadata['action'] = $action;
 120      }
 121  
 122      $draft_key = 'differential-comment-'.$this->id;
 123      $draft = id(new PhabricatorDraft())
 124        ->setAuthorPHID($viewer->getPHID())
 125        ->setDraftKey($draft_key)
 126        ->setDraft($request->getStr('content'))
 127        ->setMetadata($metadata)
 128        ->replaceOrDelete();
 129      if ($draft->isDeleted()) {
 130        DifferentialDraft::deleteHasDraft(
 131          $viewer->getPHID(),
 132          $revision->getPHID(),
 133          $draft_key);
 134      } else {
 135        DifferentialDraft::markHasDraft(
 136          $viewer->getPHID(),
 137          $revision->getPHID(),
 138          $draft_key);
 139      }
 140  
 141      return id(new AphrontAjaxResponse())
 142        ->setContent((string)phutil_implode_html('', $view->buildEvents()));
 143    }
 144  
 145  }


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