Page MenuHomec4science

PhabricatorApplicationTransactionPublishWorker.php
No OneTemporary

File Metadata

Created
Mon, Dec 23, 10:25

PhabricatorApplicationTransactionPublishWorker.php

<?php
/**
* Performs backgroundable work after applying transactions.
*
* This class handles email, notifications, feed stories, search indexes, and
* other similar backgroundable work.
*/
final class PhabricatorApplicationTransactionPublishWorker
extends PhabricatorWorker {
/**
* Publish information about a set of transactions.
*/
protected function doWork() {
$object = $this->loadObject();
$editor = $this->buildEditor($object);
$xactions = $this->loadTransactions($object);
$editor->publishTransactions($object, $xactions);
}
/**
* Load the object the transactions affect.
*/
private function loadObject() {
$viewer = PhabricatorUser::getOmnipotentUser();
$data = $this->getTaskData();
if (!is_array($data)) {
throw new PhabricatorWorkerPermanentFailureException(
pht('Task has invalid task data.'));
}
$phid = idx($data, 'objectPHID');
if (!$phid) {
throw new PhabricatorWorkerPermanentFailureException(
pht('Task has no object PHID!'));
}
$object = id(new PhabricatorObjectQuery())
->setViewer($viewer)
->withPHIDs(array($phid))
->executeOne();
if (!$object) {
throw new PhabricatorWorkerPermanentFailureException(
pht(
'Unable to load object with PHID "%s"!',
$phid));
}
return $object;
}
/**
* Build and configure an Editor to publish these transactions.
*/
private function buildEditor(
PhabricatorApplicationTransactionInterface $object) {
$data = $this->getTaskData();
$daemon_source = PhabricatorContentSource::newForSource(
PhabricatorContentSource::SOURCE_DAEMON,
array());
$viewer = PhabricatorUser::getOmnipotentUser();
$editor = $object->getApplicationTransactionEditor()
->setActor($viewer)
->setContentSource($daemon_source)
->setActingAsPHID(idx($data, 'actorPHID'))
->loadWorkerState(idx($data, 'state', array()));
return $editor;
}
/**
* 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();
$type = phid_get_subtype(head($xaction_phids));
$xactions = $this->buildTransactionQuery($type)
->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);
}
/**
* Build a new transaction query of the appropriate class so we can load
* the transactions.
*/
private function buildTransactionQuery($type) {
$queries = id(new PhutilClassMapQuery())
->setAncestorClass('PhabricatorApplicationTransactionQuery')
->execute();
foreach ($queries as $query) {
$query_type = $query
->getTemplateApplicationTransaction()
->getApplicationTransactionType();
if ($query_type == $type) {
return $query;
}
}
throw new PhabricatorWorkerPermanentFailureException(
pht(
'Unable to load query for transaction type "%s"!',
$type));
}
}

Event Timeline