protected function execute(ConduitAPIRequest $request)
 {
     $viewer = $request->getUser();
     $build_target_phid = $request->getValue('buildTargetPHID');
     $message_type = $request->getValue('type');
     $build_target = id(new HarbormasterBuildTargetQuery())->setViewer($viewer)->withPHIDs(array($build_target_phid))->executeOne();
     if (!$build_target) {
         throw new Exception(pht('No such build target!'));
     }
     $save = array();
     $lint_messages = $request->getValue('lint', array());
     foreach ($lint_messages as $lint) {
         $save[] = HarbormasterBuildLintMessage::newFromDictionary($build_target, $lint);
     }
     $unit_messages = $request->getValue('unit', array());
     foreach ($unit_messages as $unit) {
         $save[] = HarbormasterBuildUnitMessage::newFromDictionary($build_target, $unit);
     }
     $save[] = HarbormasterBuildMessage::initializeNewMessage($viewer)->setBuildTargetPHID($build_target->getPHID())->setType($message_type);
     $build_target->openTransaction();
     foreach ($save as $object) {
         $object->save();
     }
     $build_target->saveTransaction();
     // If the build has completely paused because all steps are blocked on
     // waiting targets, this will resume it.
     PhabricatorWorker::scheduleTask('HarbormasterBuildWorker', array('buildID' => $build_target->getBuild()->getID()));
     return null;
 }
 protected function newModernMessage(array $message)
 {
     return HarbormasterBuildLintMessage::newFromDictionary(new HarbormasterBuildTarget(), $this->getModernLintMessageDictionary($message));
 }