public function indexFulltextObject($object, PhabricatorSearchAbstractDocument $document)
 {
     $query = PhabricatorApplicationTransactionQuery::newQueryForObject($object);
     if (!$query) {
         return;
     }
     $xactions = $query->setViewer($this->getViewer())->withObjectPHIDs(array($object->getPHID()))->needComments(true)->execute();
     foreach ($xactions as $xaction) {
         if (!$xaction->hasComment()) {
             continue;
         }
         $comment = $xaction->getComment();
         $document->addField(PhabricatorSearchDocumentFieldType::FIELD_COMMENT, $comment->getContent());
     }
 }
 /**
  * Load the transactions to be published.
  */
 private function loadTransactions(PhabricatorApplicationTransactionInterface $object)
 {
     $data = $this->getTaskData();
     $xaction_phids = idx($data, 'xactionPHIDs');
     if (!$xaction_phids) {
         throw new PhabricatorWorkerPermanentFailureException(pht('Task has no transaction PHIDs!'));
     }
     $viewer = PhabricatorUser::getOmnipotentUser();
     $query = PhabricatorApplicationTransactionQuery::newQueryForObject($object);
     if (!$query) {
         throw new PhabricatorWorkerPermanentFailureException(pht('Unable to load query for transaction object "%s"!', $object->getPHID()));
     }
     $xactions = $query->setViewer($viewer)->withPHIDs($xaction_phids)->needComments(true)->execute();
     $xactions = mpull($xactions, null, 'getPHID');
     $missing = array_diff($xaction_phids, array_keys($xactions));
     if ($missing) {
         throw new PhabricatorWorkerPermanentFailureException(pht('Unable to load transactions: %s.', implode(', ', $missing)));
     }
     return array_select_keys($xactions, $xaction_phids);
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $this->getViewer();
     $object = id(new PhabricatorObjectQuery())->withPHIDs(array($request->getURIData('phid')))->setViewer($viewer)->executeOne();
     if (!$object) {
         return new Aphront404Response();
     }
     if (!$object instanceof PhabricatorApplicationTransactionInterface) {
         return new Aphront404Response();
     }
     $query = PhabricatorApplicationTransactionQuery::newQueryForObject($object);
     if (!$query) {
         return new Aphront404Response();
     }
     $timeline = $this->buildTransactionTimeline($object, $query);
     $phui_timeline = $timeline->buildPHUITimelineView($with_hiding = false);
     $phui_timeline->setShouldAddSpacers(false);
     $events = $phui_timeline->buildEvents();
     return id(new AphrontAjaxResponse())->setContent(array('timeline' => hsprintf('%s', $events)));
 }
 /**
  * Load the transactions to be published.
  */
 private function loadTransactions(PhabricatorApplicationTransactionInterface $object)
 {
     $data = $this->getTaskData();
     $xaction_phids = idx($data, 'xactionPHIDs');
     if (!$xaction_phids) {
         // It's okay if we don't have any transactions. This can happen when
         // creating objects or performing no-op updates. We will still apply
         // meaningful side effects like updating search engine indexes.
         return array();
     }
     $viewer = PhabricatorUser::getOmnipotentUser();
     $query = PhabricatorApplicationTransactionQuery::newQueryForObject($object);
     if (!$query) {
         throw new PhabricatorWorkerPermanentFailureException(pht('Unable to load query for transaction object "%s"!', $object->getPHID()));
     }
     $xactions = $query->setViewer($viewer)->withPHIDs($xaction_phids)->needComments(true)->execute();
     $xactions = mpull($xactions, null, 'getPHID');
     $missing = array_diff($xaction_phids, array_keys($xactions));
     if ($missing) {
         throw new PhabricatorWorkerPermanentFailureException(pht('Unable to load transactions: %s.', implode(', ', $missing)));
     }
     return array_select_keys($xactions, $xaction_phids);
 }
 protected function buildTransactionTimeline(PhabricatorApplicationTransactionInterface $object, PhabricatorApplicationTransactionQuery $query, PhabricatorMarkupEngine $engine = null, $render_data = array())
 {
     $viewer = $this->getRequest()->getUser();
     $xaction = $object->getApplicationTransactionTemplate();
     $view = $xaction->getApplicationTransactionViewObject();
     $pager = id(new AphrontCursorPagerView())->readFromRequest($this->getRequest())->setURI(new PhutilURI('/transactions/showolder/' . $object->getPHID() . '/'));
     $xactions = $query->setViewer($viewer)->withObjectPHIDs(array($object->getPHID()))->needComments(true)->executeWithCursorPager($pager);
     $xactions = array_reverse($xactions);
     if ($engine) {
         foreach ($xactions as $xaction) {
             if ($xaction->getComment()) {
                 $engine->addObject($xaction->getComment(), PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
             }
         }
         $engine->process();
         $view->setMarkupEngine($engine);
     }
     $timeline = $view->setUser($viewer)->setObjectPHID($object->getPHID())->setTransactions($xactions)->setPager($pager)->setRenderData($render_data)->setQuoteTargetID($this->getRequest()->getStr('quoteTargetID'))->setQuoteRef($this->getRequest()->getStr('quoteRef'));
     $object->willRenderTimeline($timeline, $this->getRequest());
     return $timeline;
 }