// WingsEmu // // Developed by NosWings Team using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MongoDB.Driver; namespace PhoenixLib.DAL.MongoDB { public sealed class SynchronizedMongoRepository : IGenericAsyncUuidRepository where TObject : class, IUuidDto { private readonly IMongoCollection Collection; // protected readonly ILogger Log; private readonly IMongoDatabase Database; public SynchronizedMongoRepository(MongoConfiguration conf) { var settings = MongoClientSettings.FromConnectionString(conf.ToString()); var client = new MongoClient(settings); 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(Guid 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) { return await Collection.FindOneAndUpdateAsync(o => o.Id == obj.Id, new ObjectUpdateDefinition(obj)); } public async Task> SaveAsync(IReadOnlyList objs) { // probably faster than FindOneAndUpdateOne for each object await Collection.DeleteManyAsync(o => objs.Any(s => s.Id == o.Id)); await Collection.InsertManyAsync(objs); return objs.ToList(); } public async Task DeleteByIdAsync(Guid id) { await Collection.DeleteOneAsync(obj => obj.Id == id); } public async Task DeleteByIdsAsync(IEnumerable ids) { await Collection.DeleteManyAsync(o => ids.Any(id => o.Id == id)); } } }