using System.Linq.Expressions; using MongoDB.Driver; using ExpenseTracker.Application.Common.Interfaces.Repositories; using ExpenseTracker.Domain.Entities; namespace ExpenseTracker.Persistence.MongoDb.Repositories; public abstract class BaseMongoDbRepository : IBaseRepository where TKey : IEquatable where TEntity : EntityBase { protected readonly MongoDbContext _dbContext; protected IMongoCollection _collection; public BaseMongoDbRepository(MongoDbContext dbContext, string collectionName) { _dbContext = dbContext; _collection = _dbContext.GetCollection(collectionName); } public IQueryable Queryable => _collection.AsQueryable(); public async Task AddOneAsync(TEntity entity, CancellationToken cancellationToken) { _dbContext.AddCommand(() => _collection.InsertOneAsync(entity, null, cancellationToken) ); return entity; } public async Task> AddManyAsync(IEnumerable entities, CancellationToken cancellationToken) { _dbContext.AddCommand( () => _collection.InsertManyAsync(entities, null, cancellationToken) ); return entities; } public async Task UpdateOneAsync(TEntity entity, CancellationToken cancellationToken) { _dbContext.AddCommand(() => _collection.ReplaceOneAsync( _dbContext.Session, e => e.Id.Equals(entity.Id), entity, new ReplaceOptions(), cancellationToken) ); return entity; } public async Task DeleteOneAsync(TKey id, CancellationToken cancellationToken) { _dbContext.AddCommand(() => _collection.DeleteOneAsync(_dbContext.Session, e => e.Id.Equals(id), null, cancellationToken) ); } public async Task DeleteManyAsync(Expression> predicate, CancellationToken cancellationToken) { _dbContext.AddCommand(() => _collection.DeleteManyAsync(_dbContext.Session, predicate, null, cancellationToken) ); } }