diff --git a/src/EventStores/SimpleCqrs.EventStore.File/FileEventStore.cs b/src/EventStores/SimpleCqrs.EventStore.File/FileEventStore.cs index 1b00fef..07dcb04 100644 --- a/src/EventStores/SimpleCqrs.EventStore.File/FileEventStore.cs +++ b/src/EventStores/SimpleCqrs.EventStore.File/FileEventStore.cs @@ -56,17 +56,39 @@ public void Insert(IEnumerable domainEvents) public IEnumerable GetEventsByEventTypes(IEnumerable domainEventTypes) { - throw new NotImplementedException(); + var eventInfos = GetEventInfos(); + return GetEventsByEventTypes(domainEventTypes, eventInfos); } public IEnumerable GetEventsByEventTypes(IEnumerable domainEventTypes, Guid aggregateRootId) { - throw new NotImplementedException(); + var eventInfos = GetEventInfosForAggregateRoot(aggregateRootId, 0); + return GetEventsByEventTypes(domainEventTypes, eventInfos); } public IEnumerable GetEventsByEventTypes(IEnumerable domainEventTypes, DateTime startDate, DateTime endDate) { - throw new NotImplementedException(); + return GetEventsByEventTypes(domainEventTypes). + Where(x => startDate <= x.EventDate && + x.EventDate <= endDate); + } + + private IEnumerable GetEventsByEventTypes(IEnumerable domainEventTypes, IEnumerable eventInfos) + { + var domainEvents = new List(); + foreach (var eventInfo in eventInfos) + { + using (Stream stream = System.IO.File.OpenRead(eventInfo.FilePath)) + { + var domainEvent = + (DomainEvent)serializer.ReadObject(stream); + Type eventType = domainEvent.GetType(); + if (domainEventTypes.Contains(eventType)) + domainEvents.Add(domainEvent); + } + } + + return domainEvents; } private IEnumerable GetEventInfosForAggregateRoot(Guid aggregateRootId, int startSequence) @@ -79,5 +101,26 @@ private IEnumerable GetEventInfosForAggregateRoot(Guid aggregateRootId, where sequence > startSequence select new { Sequence = sequence, FilePath = filePath }; } + + private IEnumerable GetEventInfos() + { + if (!Directory.Exists(baseDirectory)) + return new List(); + string[] filePaths = Directory.GetFiles( + baseDirectory, + "*.xml", + SearchOption.AllDirectories); + return GetEventInfos(filePaths); + } + + private static IEnumerable GetEventInfos(string[] filePaths) + { + return from filePath in filePaths + let fileName = Path.GetFileNameWithoutExtension(filePath) + where fileName != null + let sequence = int.Parse(fileName) + orderby sequence + select new { Sequence = sequence, FilePath = filePath }; + } } } \ No newline at end of file