/** * @param string $identity * @return EventDescriptor[] */ public function find(string $identity) : array { $cursor = $this->collection->find([$this->identityField => $identity]); return array_map(function (BSONDocument $eventData) : EventDescriptor { return EventDescriptor::reconstructFromArray($eventData->getArrayCopy()); }, $cursor->toArray()); }
/** * @param string $identity * @return EventDescriptor[] */ public function find(string $identity) : array { if (!$this->contains($identity)) { return []; } return array_map(function (array $event) : EventDescriptor { return EventDescriptor::reconstructFromArray($event); }, $this->data[$identity]); }
/** * @param Identity $identity * @param EventStorage $eventStorage * @param Serializer $serializer */ private function prepareSomeEvents(Identity $identity, EventStorage $eventStorage, Serializer $serializer) { // This is not the preferred way, but used for simplicity! You should use commands to achieve this. $event = new CreatedEvent($identity); $event->setVersion(1); $eventStorage->append(EventDescriptor::record($identity->getValue(), 'aggregateType', $event->getEventName(), $serializer->serialize($event), $event->getVersion())); $event = new DemonstratedEvent($identity); $event->setVersion(2); $eventStorage->append(EventDescriptor::record($identity->getValue(), 'aggregateType', $event->getEventName(), $serializer->serialize($event), $event->getVersion())); }
/** * @test */ public function findIdentitiesWillRetrieveAllKnownIdentities() { $identity1 = 'someidentity'; $identity2 = 'someotheridentity'; $event1 = EventDescriptor::record($identity1, 'aggregateType', 'someevent', '{}', 1); $event2 = EventDescriptor::record($identity2, 'aggregateType', 'someevent', '{}', 1); $storage = new MemoryEventStorage(); $storage->append($event1); $storage->append($event2); $identities = $storage->findIdentities(); self::assertCount(2, $identities); self::assertContains($identity1, $identities); self::assertContains($identity2, $identities); }
/** * @test */ public function findIdentitiesWillRetrieveAllKnownIdentities() { $collection = $this->getCollection(); $identityField = 'identity'; $identity1 = 'someidentity'; $identity2 = 'someotheridentity'; $event1 = EventDescriptor::record($identity1, 'aggregateType', 'someevent', '{}', 1); $event2 = EventDescriptor::record($identity2, 'aggregateType', 'someevent', '{}', 1); $storage = new MongoDbEventStorage($collection, $identityField); $storage->append($event1); $storage->append($event2); $identities = $storage->findIdentities(); self::assertCount(2, $identities); self::assertContains($identity1, $identities); self::assertContains($identity2, $identities); }
/** * @test */ public function getEventsForAggregateRetrievesEventLog() { $eventBus = $this->getEventBus(); $storage = $this->getEventStorage(); $serializer = $this->getSerializer(); $eventMap = $this->getEventMap(); $aggregateId = Identity::createNew(); $descriptors = [EventDescriptor::reconstructFromArray(['identity' => $aggregateId->getValue(), 'type' => 'aggregateType', 'event' => EventStoreTest_Event1::getName(), 'payload' => '{}', 'playHead' => 1, 'recorded' => date('r')]), EventDescriptor::reconstructFromArray(['identity' => $aggregateId->getValue(), 'type' => 'aggregateType', 'event' => EventStoreTest_Event2::getName(), 'payload' => '{}', 'playHead' => 2, 'recorded' => date('r')])]; $eventMap->expects(self::exactly(count($descriptors)))->method('getClassByEventName')->willReturnOnConsecutiveCalls(EventStoreTest_Event1::class, EventStoreTest_Event2::class); $storage->expects(self::once())->method('contains')->willReturn(true); $storage->expects(self::once())->method('find')->with($aggregateId->getValue())->willReturn($descriptors); $serializer->expects(self::exactly(count($descriptors)))->method('deserialize')->willReturnOnConsecutiveCalls(new EventStoreTest_Event1(), new EventStoreTest_Event2()); $eventStore = new EventStore($eventBus, $storage, $serializer, $eventMap); $events = $eventStore->getEventsForAggregate($aggregateId); self::assertCount(count($descriptors), $events->getIterator()); }
/** * @param Identity $aggregateId * @param string $aggregateType * @param Event $event */ private function saveEvent(Identity $aggregateId, string $aggregateType, Event $event) { $eventData = EventDescriptor::record($aggregateId->getValue(), $aggregateType, $event->getEventName(), $this->serializer->serialize($event), $event->getVersion()); $this->storage->append($eventData); }