using Diligent.Data; using MongoDB.Driver; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Diligent.Persistence.Mongo { public abstract class Repository : IRepository where TEntity : class, IEntity { public virtual string CollectionName => GetType().Name.Replace(nameof(Repository), ""); private readonly IMongoContext _context; private readonly IMongoCollection _collection; protected Repository(IMongoContext context) { _context = context; _collection = context.MongoDatabase.GetCollection(CollectionName); } public virtual TEntity Get(object id) { var filter = Builders.Filter.Eq(e => e.Id, id); return _collection.Find(filter).FirstOrDefault(); } public virtual IEnumerable GetAll() { return _collection.Find(_ => true).ToList(); } public virtual void Add(TEntity entity) { _collection.InsertOne(entity); } public virtual void Add(IEnumerable entities) { _collection.InsertMany(entities); } public virtual void Update(TEntity entity) { var filter = Builders.Filter.Eq(en => en.Id, entity.Id); _collection.ReplaceOne(filter, entity); } public virtual void Update(IEnumerable entities) { foreach (var entity in entities) Update(entity); } public virtual void Remove(TEntity entity) { var filter = Builders.Filter.Eq(en => en.Id, entity.Id); _collection.DeleteOne(filter); } public virtual void Remove(IEnumerable entities) { var filter = Builders.Filter.Where(en => entities.Contains(en)); _collection.DeleteMany(filter); } public virtual void SaveChanges() { _context.SaveChanges(); } public virtual async Task GetAsync(object id) { var filter = Builders.Filter.Eq(e => e.Id, id); return await _collection.FindAsync(filter).Result.FirstOrDefaultAsync(); } public virtual async Task> GetAllAsync() { return await _collection.FindAsync(_ => true).Result.ToListAsync(); } public virtual async Task AddAsync(TEntity entity) { await _collection.InsertOneAsync(entity); } public virtual async Task AddAsync(IEnumerable entities) { await _collection.InsertManyAsync(entities); } public virtual async Task UpdateAsync(TEntity entity) { var filter = Builders.Filter.Eq(en => en.Id, entity.Id); await _collection.ReplaceOneAsync(filter, entity); } public virtual async Task UpdateAsync(IEnumerable entities) { foreach (var entity in entities) await UpdateAsync(entity); } public virtual async Task RemoveAsync(TEntity entity) { var filter = Builders.Filter.Eq(en => en.Id, entity.Id); await _collection.DeleteOneAsync(filter); } public virtual async Task RemoveAsync(IEnumerable entities) { var filter = Builders.Filter.Where(en => entities.Contains(en)); await _collection.DeleteManyAsync(filter); } public virtual async Task SaveChangesAsync() { await _context.SaveChangesAsync(); } } }