using EventFlow.MongoDB.EventStore; using EventFlow.MongoDB.ReadStores; using EventFlow.MongoDB.ValueObjects; using MongoDB.Driver; using System.Linq.Expressions; namespace MyTelegram.EventFlow.MongoDB; public abstract class MongoDbIndexesCreatorBase( IMongoDatabase database, IReadModelDescriptionProvider descriptionProvider, IMongoDbEventPersistenceInitializer eventPersistenceInitializer) : IMongoDbIndexesCreator { public async Task CreateAllIndexesAsync() { eventPersistenceInitializer.Initialize(); var snapShotCollectionName = "snapShots"; await CreateIndexAsync(p => p.AggregateId, snapShotCollectionName); await CreateIndexAsync(p => p.AggregateName, snapShotCollectionName); await CreateIndexAsync(p => p.AggregateSequenceNumber, snapShotCollectionName); await CreateAllIndexesCoreAsync(); } protected abstract Task CreateAllIndexesCoreAsync(); protected async Task CreateIndexAsync(Expression> field) where TReadModel : IMongoDbReadModel { var indexDefine = Builders.IndexKeys.Ascending(field); var collectionName = descriptionProvider.GetReadModelDescription().RootCollectionName; await database.GetCollection(collectionName.Value).Indexes .CreateOneAsync(new CreateIndexModel(indexDefine)); } protected async Task CreateIndexAsync(Expression> field, string collectionName) { var indexDefine = Builders.IndexKeys.Ascending(field); await database.GetCollection(collectionName).Indexes .CreateOneAsync(new CreateIndexModel(indexDefine)); } }