/** * Takes a snapshot * @param StreamName $streamName * @param AggregateRootInterface $aggregate * @param DomainMessage $message - The domain message * @return bool */ public function take(StreamName $streamName, AggregateRootInterface $aggregate, DomainMessage $message) { $id = $aggregate->getAggregateRootId(); if (!$this->strategy->isFulfilled($streamName, $aggregate)) { return false; } if (!$this->snapshotStore->has($id, $message->getVersion())) { $this->snapshotStore->save(Snapshot::take($id, $aggregate, $message->getVersion())); } return true; }
public function save(StreamName $streamName, DomainMessage $event) { $id = (string) $event->getId(); $name = (string) $streamName; $events = $this->events->get($name); if (null === $events) { $events = new Map(); $this->events->add(new Pair($name, $events)); } if (!$events->containsKey($id)) { $events->add(new Pair($id, new Vector())); } $events->get($id)->add($event); }
/** * @test * @dataProvider messageProvider * @param AggregateIdInterface $aggregateId * @param $version * @param $payload * @param \DateTimeImmutable $date */ public function itShouldCreateAUuidFromNamedConstructor(AggregateIdInterface $aggregateId, $version, $payload, \DateTimeImmutable $date) { $message = DomainMessage::recordNow($aggregateId, $version, $payload); $this->assertInstanceOf(DomainMessage::class, $message); $this->assertNotEmpty((int) $message->getRecordedOn()->format('u'), 'Expected microseconds to be set'); $this->assertEquals(new \DateTimeZone('UTC'), $message->getRecordedOn()->getTimezone()); }
private function createEventData(DomainMessage $event) { return ['aggregate_id' => (string) $event->getId(), 'version' => $event->getVersion(), 'type' => $event->getType(), 'payload' => $this->serializer->serialize($event->getPayload(), 'json'), 'recorded_on' => $event->getRecordedOn()->format('Y-m-d\\TH:i:s.u')]; }
private function record(DomainEventInterface $event) { $this->uncommittedEvents[] = DomainMessage::recordNow($this->getAggregateRootId(), $this->version, $event); }