Eventuous / eventuous

Event Sourcing library for .NET
https://eventuous.dev
Apache License 2.0
447 stars 71 forks source link

MongoProjector ignores exceptions returning EventHandlingStatus.Success with no logs #230

Closed makp0 closed 1 year ago

makp0 commented 1 year ago

CleanShot 2023-07-29 at 21 08 08

Here if the task fails before checking the 'if' codition, the task not awaited, thus exception is not thrown and EventHandlingStatus.Success is returned as nothing happened.

Relates to #94

Was it intentional?

To Reproduce Steps to reproduce the behavior:

  1. Make an UpdateDefinitionBuilder in On method that will fail. My case: I've tried to use a negative indexer to set an array element in a document like described here https://kevsoft.net/2020/03/23/updating-arrays-in-mongodb-with-csharp.html#:~:text=(x%20%3D%3E-,x.Friends%5B%2D1%5D.Name,-%2C%20%22Bob%22 (WRONG! here's a correct way https://stackoverflow.com/a/76723319)

  2. Send an event that will trigger the update.

Expected behavior Projector should throw an exception for it to appear in logs and thus return EventHandlingStatus.Failure

Temporary (I hope!) Workaround

Decorate IMongoDatabase with a decorator that return collection that will be a logging decorator over a real collection that will log any exception thrown upon execution of UpdateOneAsync method, which Eventuous uses to update projections. Or I find a more sane way. ```c# using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; using Serilog; public class LoggingMongoDatabase : IMongoDatabase { private readonly IMongoDatabase _mongoDatabaseImplementation; private readonly ILogger _logger; public LoggingMongoDatabase(IMongoDatabase mongoDatabaseImplementation, ILogger logger) { _mongoDatabaseImplementation = mongoDatabaseImplementation; _logger = logger; } public IMongoCollection GetCollection(string name, MongoCollectionSettings settings = null) => new LoggingMongoDocument(_mongoDatabaseImplementation.GetCollection(name, settings), _logger); #region Delegated Implementation public IAsyncCursor Aggregate(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.Aggregate(pipeline, options, cancellationToken); } public IAsyncCursor Aggregate(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.Aggregate(session, pipeline, options, cancellationToken); } public Task> AggregateAsync(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.AggregateAsync(pipeline, options, cancellationToken); } public Task> AggregateAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.AggregateAsync(session, pipeline, options, cancellationToken); } public void AggregateToCollection(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.AggregateToCollection(pipeline, options, cancellationToken); } public void AggregateToCollection(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.AggregateToCollection(session, pipeline, options, cancellationToken); } public Task AggregateToCollectionAsync(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.AggregateToCollectionAsync(pipeline, options, cancellationToken); } public Task AggregateToCollectionAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.AggregateToCollectionAsync(session, pipeline, options, cancellationToken); } public void CreateCollection(string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.CreateCollection(name, options, cancellationToken); } public void CreateCollection(IClientSessionHandle session, string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.CreateCollection(session, name, options, cancellationToken); } public Task CreateCollectionAsync(string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.CreateCollectionAsync(name, options, cancellationToken); } public Task CreateCollectionAsync(IClientSessionHandle session, string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.CreateCollectionAsync(session, name, options, cancellationToken); } public void CreateView(string viewName, string viewOn, PipelineDefinition pipeline, CreateViewOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.CreateView(viewName, viewOn, pipeline, options, cancellationToken); } public void CreateView(IClientSessionHandle session, string viewName, string viewOn, PipelineDefinition pipeline, CreateViewOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.CreateView(session, viewName, viewOn, pipeline, options, cancellationToken); } public Task CreateViewAsync(string viewName, string viewOn, PipelineDefinition pipeline, CreateViewOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.CreateViewAsync(viewName, viewOn, pipeline, options, cancellationToken); } public Task CreateViewAsync(IClientSessionHandle session, string viewName, string viewOn, PipelineDefinition pipeline, CreateViewOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.CreateViewAsync(session, viewName, viewOn, pipeline, options, cancellationToken); } public void DropCollection(string name, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.DropCollection(name, cancellationToken); } public void DropCollection(string name, DropCollectionOptions options, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.DropCollection(name, options, cancellationToken); } public void DropCollection(IClientSessionHandle session, string name, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.DropCollection(session, name, cancellationToken); } public void DropCollection(IClientSessionHandle session, string name, DropCollectionOptions options, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.DropCollection(session, name, options, cancellationToken); } public Task DropCollectionAsync(string name, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.DropCollectionAsync(name, cancellationToken); } public Task DropCollectionAsync(string name, DropCollectionOptions options, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.DropCollectionAsync(name, options, cancellationToken); } public Task DropCollectionAsync(IClientSessionHandle session, string name, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.DropCollectionAsync(session, name, cancellationToken); } public Task DropCollectionAsync(IClientSessionHandle session, string name, DropCollectionOptions options, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.DropCollectionAsync(session, name, options, cancellationToken); } public IAsyncCursor ListCollectionNames(ListCollectionNamesOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollectionNames(options, cancellationToken); } public IAsyncCursor ListCollectionNames(IClientSessionHandle session, ListCollectionNamesOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollectionNames(session, options, cancellationToken); } public Task> ListCollectionNamesAsync(ListCollectionNamesOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollectionNamesAsync(options, cancellationToken); } public Task> ListCollectionNamesAsync(IClientSessionHandle session, ListCollectionNamesOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollectionNamesAsync(session, options, cancellationToken); } public IAsyncCursor ListCollections(ListCollectionsOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollections(options, cancellationToken); } public IAsyncCursor ListCollections(IClientSessionHandle session, ListCollectionsOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollections(session, options, cancellationToken); } public Task> ListCollectionsAsync(ListCollectionsOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollectionsAsync(options, cancellationToken); } public Task> ListCollectionsAsync(IClientSessionHandle session, ListCollectionsOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.ListCollectionsAsync(session, options, cancellationToken); } public void RenameCollection(string oldName, string newName, RenameCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.RenameCollection(oldName, newName, options, cancellationToken); } public void RenameCollection(IClientSessionHandle session, string oldName, string newName, RenameCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoDatabaseImplementation.RenameCollection(session, oldName, newName, options, cancellationToken); } public Task RenameCollectionAsync(string oldName, string newName, RenameCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.RenameCollectionAsync(oldName, newName, options, cancellationToken); } public Task RenameCollectionAsync(IClientSessionHandle session, string oldName, string newName, RenameCollectionOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.RenameCollectionAsync(session, oldName, newName, options, cancellationToken); } public TResult RunCommand(Command command, ReadPreference readPreference = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.RunCommand(command, readPreference, cancellationToken); } public TResult RunCommand(IClientSessionHandle session, Command command, ReadPreference readPreference = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.RunCommand(session, command, readPreference, cancellationToken); } public Task RunCommandAsync(Command command, ReadPreference readPreference = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.RunCommandAsync(command, readPreference, cancellationToken); } public Task RunCommandAsync(IClientSessionHandle session, Command command, ReadPreference readPreference = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.RunCommandAsync(session, command, readPreference, cancellationToken); } public IChangeStreamCursor Watch(PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.Watch(pipeline, options, cancellationToken); } public IChangeStreamCursor Watch(IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.Watch(session, pipeline, options, cancellationToken); } public Task> WatchAsync(PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.WatchAsync(pipeline, options, cancellationToken); } public Task> WatchAsync(IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoDatabaseImplementation.WatchAsync(session, pipeline, options, cancellationToken); } public IMongoDatabase WithReadConcern(ReadConcern readConcern) { return _mongoDatabaseImplementation.WithReadConcern(readConcern); } public IMongoDatabase WithReadPreference(ReadPreference readPreference) { return _mongoDatabaseImplementation.WithReadPreference(readPreference); } public IMongoDatabase WithWriteConcern(WriteConcern writeConcern) { return _mongoDatabaseImplementation.WithWriteConcern(writeConcern); } public IMongoClient Client => _mongoDatabaseImplementation.Client; public DatabaseNamespace DatabaseNamespace => _mongoDatabaseImplementation.DatabaseNamespace; public MongoDatabaseSettings Settings => _mongoDatabaseImplementation.Settings; #endregion } public class LoggingMongoDocument : IMongoCollection { private readonly IMongoCollection _mongoCollectionImplementation; private readonly ILogger _logger; public LoggingMongoDocument(IMongoCollection mongoCollectionImplementation, ILogger logger) { _mongoCollectionImplementation = mongoCollectionImplementation; _logger = logger; } public async Task UpdateOneAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { try { return await _mongoCollectionImplementation.UpdateOneAsync(filter, update, options, cancellationToken).ConfigureAwait(false); } catch (Exception e) { _logger.Error(e, "Error while updating mongodb document {Name}", this.CollectionNamespace.FullName); throw; } } #region Delegated Implementation public IAsyncCursor Aggregate(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Aggregate(pipeline, options, cancellationToken); } public IAsyncCursor Aggregate(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Aggregate(session, pipeline, options, cancellationToken); } public async Task> AggregateAsync(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.AggregateAsync(pipeline, options, cancellationToken); } public async Task> AggregateAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.AggregateAsync(session, pipeline, options, cancellationToken); } public void AggregateToCollection(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoCollectionImplementation.AggregateToCollection(pipeline, options, cancellationToken); } public void AggregateToCollection(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoCollectionImplementation.AggregateToCollection(session, pipeline, options, cancellationToken); } public async Task AggregateToCollectionAsync(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { await _mongoCollectionImplementation.AggregateToCollectionAsync(pipeline, options, cancellationToken); } public async Task AggregateToCollectionAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { await _mongoCollectionImplementation.AggregateToCollectionAsync(session, pipeline, options, cancellationToken); } public BulkWriteResult BulkWrite(IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.BulkWrite(requests, options, cancellationToken); } public BulkWriteResult BulkWrite(IClientSessionHandle session, IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.BulkWrite(session, requests, options, cancellationToken); } public async Task> BulkWriteAsync(IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.BulkWriteAsync(requests, options, cancellationToken); } public async Task> BulkWriteAsync(IClientSessionHandle session, IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.BulkWriteAsync(session, requests, options, cancellationToken); } public long Count(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Count(filter, options, cancellationToken); } public long Count(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Count(session, filter, options, cancellationToken); } public async Task CountAsync(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.CountAsync(filter, options, cancellationToken); } public async Task CountAsync(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.CountAsync(session, filter, options, cancellationToken); } public long CountDocuments(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.CountDocuments(filter, options, cancellationToken); } public long CountDocuments(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.CountDocuments(session, filter, options, cancellationToken); } public async Task CountDocumentsAsync(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.CountDocumentsAsync(filter, options, cancellationToken); } public async Task CountDocumentsAsync(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.CountDocumentsAsync(session, filter, options, cancellationToken); } public DeleteResult DeleteMany(FilterDefinition filter, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.DeleteMany(filter, cancellationToken); } public DeleteResult DeleteMany(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.DeleteMany(filter, options, cancellationToken); } public DeleteResult DeleteMany(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.DeleteMany(session, filter, options, cancellationToken); } public async Task DeleteManyAsync(FilterDefinition filter, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DeleteManyAsync(filter, cancellationToken); } public async Task DeleteManyAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DeleteManyAsync(filter, options, cancellationToken); } public async Task DeleteManyAsync(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DeleteManyAsync(session, filter, options, cancellationToken); } public DeleteResult DeleteOne(FilterDefinition filter, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.DeleteOne(filter, cancellationToken); } public DeleteResult DeleteOne(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.DeleteOne(filter, options, cancellationToken); } public DeleteResult DeleteOne(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.DeleteOne(session, filter, options, cancellationToken); } public async Task DeleteOneAsync(FilterDefinition filter, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DeleteOneAsync(filter, cancellationToken); } public async Task DeleteOneAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DeleteOneAsync(filter, options, cancellationToken); } public async Task DeleteOneAsync(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DeleteOneAsync(session, filter, options, cancellationToken); } public IAsyncCursor Distinct(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Distinct(field, filter, options, cancellationToken); } public IAsyncCursor Distinct(IClientSessionHandle session, FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Distinct(session, field, filter, options, cancellationToken); } public async Task> DistinctAsync(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DistinctAsync(field, filter, options, cancellationToken); } public async Task> DistinctAsync(IClientSessionHandle session, FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.DistinctAsync(session, field, filter, options, cancellationToken); } public long EstimatedDocumentCount(EstimatedDocumentCountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.EstimatedDocumentCount(options, cancellationToken); } public async Task EstimatedDocumentCountAsync(EstimatedDocumentCountOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.EstimatedDocumentCountAsync(options, cancellationToken); } public IAsyncCursor FindSync(FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindSync(filter, options, cancellationToken); } public IAsyncCursor FindSync(IClientSessionHandle session, FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindSync(session, filter, options, cancellationToken); } public async Task> FindAsync(FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindAsync(filter, options, cancellationToken); } public async Task> FindAsync(IClientSessionHandle session, FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindAsync(session, filter, options, cancellationToken); } public TProjection FindOneAndDelete(FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindOneAndDelete(filter, options, cancellationToken); } public TProjection FindOneAndDelete(IClientSessionHandle session, FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindOneAndDelete(session, filter, options, cancellationToken); } public async Task FindOneAndDeleteAsync(FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindOneAndDeleteAsync(filter, options, cancellationToken); } public async Task FindOneAndDeleteAsync(IClientSessionHandle session, FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindOneAndDeleteAsync(session, filter, options, cancellationToken); } public TProjection FindOneAndReplace(FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindOneAndReplace(filter, replacement, options, cancellationToken); } public TProjection FindOneAndReplace(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindOneAndReplace(session, filter, replacement, options, cancellationToken); } public async Task FindOneAndReplaceAsync(FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindOneAndReplaceAsync(filter, replacement, options, cancellationToken); } public async Task FindOneAndReplaceAsync(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindOneAndReplaceAsync(session, filter, replacement, options, cancellationToken); } public TProjection FindOneAndUpdate(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindOneAndUpdate(filter, update, options, cancellationToken); } public TProjection FindOneAndUpdate(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.FindOneAndUpdate(session, filter, update, options, cancellationToken); } public async Task FindOneAndUpdateAsync(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindOneAndUpdateAsync(filter, update, options, cancellationToken); } public async Task FindOneAndUpdateAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.FindOneAndUpdateAsync(session, filter, update, options, cancellationToken); } public void InsertOne(TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoCollectionImplementation.InsertOne(document, options, cancellationToken); } public void InsertOne(IClientSessionHandle session, TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoCollectionImplementation.InsertOne(session, document, options, cancellationToken); } public async Task InsertOneAsync(TDocument document, CancellationToken _cancellationToken) { await _mongoCollectionImplementation.InsertOneAsync(document, _cancellationToken); } public async Task InsertOneAsync(TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { await _mongoCollectionImplementation.InsertOneAsync(document, options, cancellationToken); } public async Task InsertOneAsync(IClientSessionHandle session, TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { await _mongoCollectionImplementation.InsertOneAsync(session, document, options, cancellationToken); } public void InsertMany(IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoCollectionImplementation.InsertMany(documents, options, cancellationToken); } public void InsertMany(IClientSessionHandle session, IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { _mongoCollectionImplementation.InsertMany(session, documents, options, cancellationToken); } public async Task InsertManyAsync(IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { await _mongoCollectionImplementation.InsertManyAsync(documents, options, cancellationToken); } public async Task InsertManyAsync(IClientSessionHandle session, IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { await _mongoCollectionImplementation.InsertManyAsync(session, documents, options, cancellationToken); } public IAsyncCursor MapReduce(BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.MapReduce(map, reduce, options, cancellationToken); } public IAsyncCursor MapReduce(IClientSessionHandle session, BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.MapReduce(session, map, reduce, options, cancellationToken); } public async Task> MapReduceAsync(BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.MapReduceAsync(map, reduce, options, cancellationToken); } public async Task> MapReduceAsync(IClientSessionHandle session, BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.MapReduceAsync(session, map, reduce, options, cancellationToken); } public IFilteredMongoCollection OfType() where TDerivedDocument : TDocument { return _mongoCollectionImplementation.OfType(); } public ReplaceOneResult ReplaceOne(FilterDefinition filter, TDocument replacement, ReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.ReplaceOne(filter, replacement, options, cancellationToken); } public ReplaceOneResult ReplaceOne(FilterDefinition filter, TDocument replacement, UpdateOptions options, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.ReplaceOne(filter, replacement, options, cancellationToken); } public ReplaceOneResult ReplaceOne(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, ReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.ReplaceOne(session, filter, replacement, options, cancellationToken); } public ReplaceOneResult ReplaceOne(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, UpdateOptions options, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.ReplaceOne(session, filter, replacement, options, cancellationToken); } public async Task ReplaceOneAsync(FilterDefinition filter, TDocument replacement, ReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.ReplaceOneAsync(filter, replacement, options, cancellationToken); } public async Task ReplaceOneAsync(FilterDefinition filter, TDocument replacement, UpdateOptions options, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.ReplaceOneAsync(filter, replacement, options, cancellationToken); } public async Task ReplaceOneAsync(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, ReplaceOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.ReplaceOneAsync(session, filter, replacement, options, cancellationToken); } public async Task ReplaceOneAsync(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, UpdateOptions options, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.ReplaceOneAsync(session, filter, replacement, options, cancellationToken); } public UpdateResult UpdateMany(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.UpdateMany(filter, update, options, cancellationToken); } public UpdateResult UpdateMany(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.UpdateMany(session, filter, update, options, cancellationToken); } public async Task UpdateManyAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.UpdateManyAsync(filter, update, options, cancellationToken); } public async Task UpdateManyAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.UpdateManyAsync(session, filter, update, options, cancellationToken); } public UpdateResult UpdateOne(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.UpdateOne(filter, update, options, cancellationToken); } public UpdateResult UpdateOne(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.UpdateOne(session, filter, update, options, cancellationToken); } public async Task UpdateOneAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.UpdateOneAsync(session, filter, update, options, cancellationToken); } public IChangeStreamCursor Watch(PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Watch(pipeline, options, cancellationToken); } public IChangeStreamCursor Watch(IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return _mongoCollectionImplementation.Watch(session, pipeline, options, cancellationToken); } public async Task> WatchAsync(PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.WatchAsync(pipeline, options, cancellationToken); } public async Task> WatchAsync(IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = new CancellationToken()) { return await _mongoCollectionImplementation.WatchAsync(session, pipeline, options, cancellationToken); } public IMongoCollection WithReadConcern(ReadConcern readConcern) { return _mongoCollectionImplementation.WithReadConcern(readConcern); } public IMongoCollection WithReadPreference(ReadPreference readPreference) { return _mongoCollectionImplementation.WithReadPreference(readPreference); } public IMongoCollection WithWriteConcern(WriteConcern writeConcern) { return _mongoCollectionImplementation.WithWriteConcern(writeConcern); } public CollectionNamespace CollectionNamespace => _mongoCollectionImplementation.CollectionNamespace; public IMongoDatabase Database => _mongoCollectionImplementation.Database; public IBsonSerializer DocumentSerializer => _mongoCollectionImplementation.DocumentSerializer; public IMongoIndexManager Indexes => _mongoCollectionImplementation.Indexes; public MongoCollectionSettings Settings => _mongoCollectionImplementation.Settings; #endregion }

```
alexeyzimarev commented 1 year ago

No, it is not intentional. The error check is indeed missing.