// WingsEmu // // Developed by NosWings Team using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using MongoDB.Driver; namespace PhoenixLib.DAL.MongoDB { public sealed class MappedMongoRepository : IGenericAsyncLongRepository where TObject : class, ILongDto { private readonly IMongoCollection _collection; public MappedMongoRepository(MongoConfigurationBuilder builder, IMongoClient client) : this(builder.Build(), client) { } private MappedMongoRepository(MongoConfiguration conf, IMongoClient client) { IMongoDatabase database = client.GetDatabase(conf.DatabaseName); _collection = database.GetCollection(typeof(TObject).Name); } public async Task> GetAllAsync() => await (await _collection.FindAsync(FilterDefinition.Empty)).ToListAsync(); public async Task GetByIdAsync(long id) { return await (await _collection.FindAsync(o => o.Id == id)).FirstOrDefaultAsync(); } public async Task> GetByIdsAsync(IEnumerable ids) { return await (await _collection.FindAsync(o => ids.Any(s => s == o.Id))).ToListAsync(); } public async Task SaveAsync(TObject obj) { await _collection.FindOneAndReplaceAsync(o => o.Id == obj.Id, obj, new FindOneAndReplaceOptions { IsUpsert = true }); return obj; } async Task> IGenericAsyncRepository.SaveAsync(IReadOnlyList objs) { var bulks = objs.Select(obj => new ReplaceOneModel(Builders.Filter.Where(s => s.Id == obj.Id), obj) { IsUpsert = true }).ToList(); await _collection.BulkWriteAsync(bulks, new BulkWriteOptions { IsOrdered = true }); return new List(objs); } public async Task DeleteByIdAsync(long id) { await _collection.DeleteOneAsync(obj => obj.Id == id); } public async Task DeleteByIdsAsync(IEnumerable ids) { await _collection.DeleteManyAsync(o => ids.Any(id => o.Id == id)); } public async Task> GetAllMatchingAsync(Func predicate) { Expression> expr = o => predicate(o); return await (await _collection.FindAsync(expr)).ToListAsync(); } public async Task GetFirstMatchingOrDefaultAsync(Func predicate) { Expression> expr = o => predicate(o); return await (await _collection.FindAsync(expr)).FirstOrDefaultAsync(); } } }