/**
  * @param WorkflowMessage $message
  * @param bool $forceInsert
  * @return LogMessage|WorkflowMessage
  */
 private function updateOrInsertPayload(WorkflowMessage $message, $forceInsert = false)
 {
     $processingType = $message->payload()->getTypeClass();
     /** @var $desc Description */
     $desc = $processingType::buildDescription();
     $successful = 0;
     $failed = 0;
     $failedMessages = [];
     if ($desc->nativeType() == NativeType::COLLECTION) {
         /** @var $prototype Prototype */
         $prototype = $processingType::prototype();
         $itemProto = $prototype->typeProperties()['item']->typePrototype();
         $typeObj = $message->payload()->toType();
         if ($typeObj) {
             $this->connection->beginTransaction();
             $insertStmt = null;
             /** @var $tableRow TableRow */
             foreach ($typeObj as $i => $tableRow) {
                 if (!$tableRow instanceof TableRow) {
                     return LogMessage::logUnsupportedMessageReceived($message);
                 }
                 try {
                     $insertStmt = $this->updateOrInsertTableRow($tableRow, $forceInsert, $insertStmt);
                     $successful++;
                 } catch (\Exception $e) {
                     $datasetIndex = $tableRow->description()->hasIdentifier() ? $tableRow->description()->identifierName() . " = " . $tableRow->property($tableRow->description()->identifierName())->value() : $i;
                     $failed++;
                     $failedMessages[] = sprintf('Dataset %s: %s', $datasetIndex, $e->getMessage());
                 }
             }
             $this->connection->commit();
         }
         $report = [MessageMetadata::SUCCESSFUL_ITEMS => $successful, MessageMetadata::FAILED_ITEMS => $failed, MessageMetadata::FAILED_MESSAGES => $failedMessages];
         if ($failed > 0) {
             return LogMessage::logItemsProcessingFailed($successful, $failed, $failedMessages, $message);
         } else {
             return $message->answerWithDataProcessingCompleted($report);
         }
     } else {
         $tableRow = $message->payload()->toType();
         if (!$tableRow instanceof TableRow) {
             return LogMessage::logUnsupportedMessageReceived($message);
         }
         $this->updateOrInsertTableRow($tableRow, $forceInsert);
         return $message->answerWithDataProcessingCompleted();
     }
 }
示例#2
0
 /**
  * @test
  */
 function it_can_log_a_items_processing_failed_message_with_a_failed_msg_for_each_failed_item()
 {
     $wfMessage = $this->getTestWorkflowMessage();
     $successfulItems = 3;
     $failedItems = 2;
     $failedMsgs = ['Processing failed!', 'Processing failed, too!'];
     $logMsg = LogMessage::logItemsProcessingFailed($successfulItems, $failedItems, $failedMsgs, $wfMessage);
     $this->assertTrue($logMsg->isError());
     $this->assertEquals(LogMessage::ERROR_ITEMS_PROCESSING_FAILED, $logMsg->msgCode());
     $this->assertEquals('Processing for 2 of 5 items failed', $logMsg->technicalMsg());
     $msgParams = $logMsg->msgParams();
     $this->assertTrue(isset($msgParams[LogMessage::MSG_PARAM_SUCCESSFUL_ITEMS]));
     $this->assertTrue(isset($msgParams[LogMessage::MSG_PARAM_FAILED_ITEMS]));
     $this->assertTrue(isset($msgParams[LogMessage::MSG_PARAM_FAILED_MESSAGES]));
     $this->assertEquals($successfulItems, $msgParams[LogMessage::MSG_PARAM_SUCCESSFUL_ITEMS]);
     $this->assertEquals($failedItems, $msgParams[LogMessage::MSG_PARAM_FAILED_ITEMS]);
     $this->assertEquals($failedMsgs, $msgParams[LogMessage::MSG_PARAM_FAILED_MESSAGES]);
 }