protected function execute(ConduitAPIRequest $request)
 {
     $source_phid = $request->getValue('sourcePHID');
     $owner_phid = $request->getValue('ownerPHID');
     $requestor_phid = $request->getValue('requestorPHID');
     $user = $request->getUser();
     $item = NuanceItem::initializeNewItem();
     $xactions = array();
     if ($source_phid) {
         $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_SOURCE)->setNewValue($source_phid);
     } else {
         throw new ConduitException('ERR-NO-SOURCE-PHID');
     }
     if ($owner_phid) {
         $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_OWNER)->setNewValue($owner_phid);
     }
     if ($requestor_phid) {
         $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_REQUESTOR)->setNewValue($requestor_phid);
     } else {
         throw new ConduitException('ERR-NO-REQUESTOR-PHID');
     }
     $source = PhabricatorContentSource::newFromConduitRequest($request);
     $editor = id(new NuanceItemEditor())->setActor($user)->setContentSource($source)->applyTransactions($item, $xactions);
     return $item->toDictionary();
 }
 protected function newNuanceItemFromGitHubRecord(array $record)
 {
     $source = $this->getSource();
     $id = $record['id'];
     $item_key = "github.issueevent.{$id}";
     $container_key = null;
     return NuanceItem::initializeNewItem()->setStatus(NuanceItem::STATUS_IMPORTING)->setSourcePHID($source->getPHID())->setItemType(NuanceGitHubEventItemType::ITEMTYPE)->setItemKey($item_key)->setItemContainerKey($container_key)->setItemProperty('api.type', 'issue')->setItemProperty('api.raw', $record);
 }
 protected function newItemFromProperties(NuanceRequestor $requestor, array $properties, PhabricatorContentSource $content_source)
 {
     // TODO: Should we have a tighter actor/viewer model? Requestors will
     // often have no real user associated with them...
     $actor = PhabricatorUser::getOmnipotentUser();
     $source = $this->requireSourceObject();
     $item = NuanceItem::initializeNewItem();
     $xactions = array();
     $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_SOURCE)->setNewValue($source->getPHID());
     $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_REQUESTOR)->setNewValue($requestor->getPHID());
     foreach ($properties as $key => $property) {
         $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_PROPERTY)->setMetadataValue(NuanceItemTransaction::PROPERTY_KEY, $key)->setNewValue($property);
     }
     $editor = id(new NuanceItemEditor())->setActor($actor)->setActingAsPHID($requestor->getActingAsPHID())->setContentSource($content_source);
     $editor->applyTransactions($item, $xactions);
     return $item;
 }
 protected function newItemFromProperties(array $properties, PhabricatorContentSource $content_source)
 {
     // TODO: Should we have a tighter actor/viewer model? Requestors will
     // often have no real user associated with them...
     $actor = PhabricatorUser::getOmnipotentUser();
     $source = $this->getSource();
     $item = NuanceItem::initializeNewItem();
     $xactions = array();
     $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_SOURCE)->setNewValue($source->getPHID());
     // TODO: Eventually, apply real routing rules. For now, just put everything
     // in the default queue for the source.
     $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_QUEUE)->setNewValue($source->getDefaultQueuePHID());
     foreach ($properties as $key => $property) {
         $xactions[] = id(new NuanceItemTransaction())->setTransactionType(NuanceItemTransaction::TYPE_PROPERTY)->setMetadataValue(NuanceItemTransaction::PROPERTY_KEY, $key)->setNewValue($property);
     }
     $editor = id(new NuanceItemEditor())->setActor($actor)->setContentSource($content_source);
     $editor->applyTransactions($item, $xactions);
     return $item;
 }