/**
  * @param $serialized
  * @return Envelope
  */
 public function unserialize($serialized)
 {
     $data = json_decode($serialized, true);
     $messageData = $data['message'];
     $messageData['created_at'] = \DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s.u', $messageData['created_at'], new \DateTimeZone('UTC'));
     $proophMessage = $this->messageFactory->createMessageFromArray($messageData['message_name'], $messageData);
     $envelope = new Envelope(BernardMessage::fromProophMessage($proophMessage));
     return $envelope;
 }
Exemplo n.º 2
0
 /**
  * @param Message $message
  * @return Message
  */
 public function createMessageFromPreviousMessage(Message $message)
 {
     $payloadObj = new \ArrayObject($this->defaultPayload);
     $metadataObj = new \ArrayObject($this->defaultMetadata);
     if (null !== $this->payloadGenerator) {
         $generator = $this->payloadGenerator;
         $generator($message, $payloadObj, $metadataObj);
     }
     return $this->messageFactory->createMessageFromArray($this->desiredMessageName, ['payload' => $payloadObj->getArrayCopy(), 'metadata' => $metadataObj->getArrayCopy()]);
 }
 /**
  * @return Message
  */
 public function current()
 {
     $current = $this->innerIterator->current();
     $metadata = [];
     foreach ($current as $key => $value) {
         if (!in_array($key, $this->standardColumns)) {
             $metadata[$key] = $value;
         }
     }
     $createdAt = \DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s.u', $current['created_at'], new \DateTimeZone('UTC'));
     return $this->messageFactory->createMessageFromArray($current['event_name'], ['uuid' => $current['_id'], 'version' => (int) $current['version'], 'created_at' => $createdAt, 'payload' => $current['payload'], 'metadata' => $metadata]);
 }
Exemplo n.º 4
0
 /**
  * @interitdoc
  */
 public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
 {
     $eventName = $request->getAttribute(self::NAME_ATTRIBUTE);
     if (null === $eventName) {
         return $next($request, $response, new RuntimeException(sprintf('Event name attribute ("%s") was not found in request.', self::NAME_ATTRIBUTE), Middleware::STATUS_CODE_BAD_REQUEST));
     }
     try {
         $event = $this->eventFactory->createMessageFromArray($eventName, ['payload' => $request->getParsedBody(), 'metadata' => $this->metadataGatherer->getFromRequest($request)]);
         $this->eventBus->dispatch($event);
         return $response->withStatus(Middleware::STATUS_CODE_ACCEPTED);
     } catch (\Exception $e) {
         return $next($request, $response, new RuntimeException(sprintf('An error occurred during dispatching of event "%s"', $eventName), Middleware::STATUS_CODE_INTERNAL_SERVER_ERROR, $e));
     }
 }
 /**
  * @param ActionEvent $actionEvent
  */
 public function __invoke(ActionEvent $actionEvent)
 {
     $message = $actionEvent->getParam(MessageBus::EVENT_PARAM_MESSAGE);
     if (!is_array($message)) {
         return;
     }
     if (!array_key_exists('message_name', $message)) {
         return;
     }
     $messageName = $message['message_name'];
     unset($message['message_name']);
     $message = $this->messageFactory->createMessageFromArray($messageName, $message);
     $actionEvent->setParam(MessageBus::EVENT_PARAM_MESSAGE, $message);
     $actionEvent->setParam(MessageBus::EVENT_PARAM_MESSAGE_NAME, $messageName);
 }
Exemplo n.º 6
0
 /**
  * @interitdoc
  */
 public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
 {
     $payload = null;
     $messageName = 'UNKNOWN';
     try {
         $payload = $request->getParsedBody();
         if (is_array($payload) && isset($payload['message_name'])) {
             $messageName = $payload['message_name'];
         }
         MessageDataAssertion::assert($payload);
         $message = $this->messageFactory->createMessageFromArray($payload['message_name'], $payload);
         switch ($message->messageType()) {
             case Message::TYPE_COMMAND:
                 $this->commandBus->dispatch($message);
                 return $response->withStatus(Middleware::STATUS_CODE_ACCEPTED);
             case Message::TYPE_EVENT:
                 $this->eventBus->dispatch($message);
                 return $response->withStatus(Middleware::STATUS_CODE_ACCEPTED);
             case Message::TYPE_QUERY:
                 return $this->responseStrategy->fromPromise($this->queryBus->dispatch($message));
             default:
                 return $next($request, $response, new RuntimeException(sprintf('Invalid message type "%s" for message "%s".', $message->messageType(), $messageName), Middleware::STATUS_CODE_BAD_REQUEST));
         }
     } catch (\Assert\InvalidArgumentException $e) {
         return $next($request, $response, new RuntimeException($e->getMessage(), Middleware::STATUS_CODE_BAD_REQUEST, $e));
     } catch (\Exception $e) {
         return $next($request, $response, new RuntimeException(sprintf('An error occurred during dispatching of message "%s"', $messageName), Middleware::STATUS_CODE_INTERNAL_SERVER_ERROR, $e));
     }
 }
Exemplo n.º 7
0
 /**
  * @interitdoc
  */
 public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
 {
     $queryName = $request->getAttribute(self::NAME_ATTRIBUTE);
     if (null === $queryName) {
         return $next($request, $response, new RuntimeException(sprintf('Query name attribute ("%s") was not found in request.', self::NAME_ATTRIBUTE), Middleware::STATUS_CODE_BAD_REQUEST));
     }
     $payload = $request->getQueryParams();
     if ($request->getMethod() === 'POST') {
         $payload['data'] = $request->getParsedBody();
     }
     try {
         $query = $this->queryFactory->createMessageFromArray($queryName, ['payload' => $payload, 'metadata' => $this->metadataGatherer->getFromRequest($request)]);
         return $this->responseStrategy->fromPromise($this->queryBus->dispatch($query));
     } catch (\Exception $e) {
         return $next($request, $response, new RuntimeException(sprintf('An error occurred during dispatching of query "%s"', $queryName), Middleware::STATUS_CODE_INTERNAL_SERVER_ERROR, $e));
     }
 }
Exemplo n.º 8
0
 /**
  * @param ServerRequestInterface $request
  * @param ResponseInterface $response
  * @param callable $next
  * @return ResponseInterface
  */
 public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
 {
     $commandName = $request->getAttribute('command');
     if (!$commandName) {
         return $next($request, $response);
     }
     try {
         $payload = $this->getPayloadFromRequest($request);
         $command = $this->commandFactory->createMessageFromArray($commandName, ['payload' => $payload]);
         $this->commandBus->dispatch($command);
         return $response->withStatus(202);
     } catch (MessageDispatchException $dispatchException) {
         $e = $dispatchException->getFailedDispatchEvent()->getParam('exception');
         return $this->populateError($response, $e);
     } catch (\Exception $e) {
         return $this->populateError($response, $e);
     }
 }
 /**
  * @param Envelope $envelope
  * @param Queue $queue
  * @return DeliveryResult
  */
 public function __invoke(Envelope $envelope, Queue $queue) : DeliveryResult
 {
     $data = json_decode($envelope->getBody(), true);
     if (!isset($data['created_at'])) {
         return DeliveryResult::MSG_REJECT();
     }
     $data['created_at'] = DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s.u', $data['created_at'], new DateTimeZone('UTC'));
     if (false === $data['created_at']) {
         return DeliveryResult::MSG_REJECT();
     }
     try {
         $command = $this->messageFactory->createMessageFromArray($envelope->getType(), $data);
         $this->commandBus->dispatch($command);
     } catch (\Throwable $e) {
         while ($e = $e->getPrevious()) {
             if ($e instanceof ConcurrencyException) {
                 return DeliveryResult::MSG_REJECT_REQUEUE();
             }
         }
         return DeliveryResult::MSG_REJECT();
     }
     return DeliveryResult::MSG_ACK();
 }
 /**
  * @return null|Message
  */
 public function current()
 {
     if (false === $this->currentItem) {
         return;
     }
     $payload = $this->payloadSerializer->unserializePayload($this->currentItem['payload']);
     $metadata = [];
     //Add metadata stored in table
     foreach ($this->currentItem as $key => $value) {
         if (!in_array($key, $this->standardColumns)) {
             $metadata[$key] = $value;
         }
     }
     $createdAt = \DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s.u', $this->currentItem['created_at'], new \DateTimeZone('UTC'));
     return $this->messageFactory->createMessageFromArray($this->currentItem['event_name'], ['uuid' => $this->currentItem['event_id'], 'version' => (int) $this->currentItem['version'], 'created_at' => $createdAt, 'payload' => $payload, 'metadata' => $metadata]);
 }
 /**
  * @param StreamName $streamName
  * @param array $metadata
  * @param null|int $minVersion
  * @return Message[]
  * @throws StreamNotFoundException
  */
 public function loadEventsByMetadataFrom(StreamName $streamName, array $metadata, $minVersion = null)
 {
     $collection = $this->getCollection();
     $query = $metadata;
     if (null !== $minVersion) {
         $query['version'] = ['$gte' => $minVersion];
     }
     $query['expire_at'] = ['$exists' => false];
     $query['transaction_id'] = ['$exists' => false];
     $results = $collection->find($query)->sort(['version' => $collection::ASCENDING]);
     $events = [];
     foreach ($results as $eventData) {
         //Add metadata stored in table
         foreach ($eventData as $key => $value) {
             if (!in_array($key, $this->standardColumns)) {
                 $metadata[$key] = $value;
             }
         }
         $createdAt = \DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s.u', $eventData['created_at'], new \DateTimeZone('UTC'));
         $events[] = $this->messageFactory->createMessageFromArray($eventData['event_name'], ['uuid' => $eventData['_id'], 'version' => (int) $eventData['version'], 'created_at' => $createdAt, 'payload' => $eventData['payload'], 'metadata' => $metadata]);
     }
     return $events;
 }
 /**
  * @param Document $document
  *
  * @return Message
  */
 private function convertDocumentToEvent(Document $document)
 {
     $createdAt = \DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s.u', $document->created_at, new \DateTimeZone('UTC'));
     return $this->messageFactory->createMessageFromArray($document->event_name, ['uuid' => $document->event_id, 'version' => (int) $document->version, 'created_at' => $createdAt, 'payload' => (array) $document->payload, 'metadata' => (array) $document->metadata]);
 }
Exemplo n.º 13
0
 /**
  * @param ChapterNumber $chapterNumber
  * @param MessageFactory $messageFactory
  * @return Message
  * @throws Exception\Story
  */
 private function getOriginalStartMessageForChapterNumber(ChapterNumber $chapterNumber, MessageFactory $messageFactory)
 {
     if (!isset($this->chapterNumberStartMessageMap[$chapterNumber->toString()])) {
         throw Exception\Story::hasNoStartMessageLoggedForChapterNumber($chapterNumber);
     }
     $messageData = $this->chapterNumberStartMessageMap[$chapterNumber->toString()];
     return $messageFactory->createMessageFromArray($messageData['message_name'], $messageData);
 }