using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MongoDB.Driver; using WotBlitzStatisticsPro.Common; using WotBlitzStatisticsPro.Common.Dictionaries; using WotBlitzStatisticsPro.Common.Model; using WotBlitzStatisticsPro.DataAccess.Model; namespace WotBlitzStatisticsPro.DataAccess { public class DictionariesDataAccessor : IDictionariesDataAccessor { private const string LanguagesCollectionName = "dictionary-languages"; private const string NationsCollectionName = "dictionary-natons"; private const string VehicleTypesCollectionName = "dictionary-vehicle-types"; private const string ClanRolesCollectionName = "dictionary-clan-roles"; private const string AchievementsSectionsCollectionName = "dictionary-achievements-sections"; private const string AchievementsCollectionName = "dictionary-achievements"; private const string VehiclesCollectionName = "dictionary-vehicles"; private readonly IMongoDatabase _database; public DictionariesDataAccessor(IMongoSettings settings) { var client = new MongoClient(settings.ConnectionString); _database = client.GetDatabase(settings.DatabaseName); } public async Task UpdateLanguages(List languages) { var dbLanguages = _database.GetCollection(LanguagesCollectionName); await dbLanguages.DeleteManyAsync(Builders.Filter.Empty); await dbLanguages.InsertManyAsync(languages); } public async Task UpdateNations(List nations) { var dbNations = _database.GetCollection(NationsCollectionName); await dbNations.DeleteManyAsync(Builders.Filter.Empty); await dbNations.InsertManyAsync(nations); } public async Task UpdateVehicleTypes(List vehicleTypes) { var dbVehicleTypes = _database.GetCollection(VehicleTypesCollectionName); await dbVehicleTypes.DeleteManyAsync(Builders.Filter.Empty); await dbVehicleTypes.InsertManyAsync(vehicleTypes); } public async Task UpdateClanRoles(List clanRoles) { var dbClanRoles = _database.GetCollection(ClanRolesCollectionName); await dbClanRoles.DeleteManyAsync(Builders.Filter.Empty); await dbClanRoles.InsertManyAsync(clanRoles); } public async Task UpdateAchievementsSections(List achievementSections) { var dbAchievementSections = _database.GetCollection(AchievementsSectionsCollectionName); await dbAchievementSections.DeleteManyAsync(Builders.Filter.Empty); await dbAchievementSections.InsertManyAsync(achievementSections); } public async Task UpdateAchievements(List achievementDictionary) { var dbAchievementSections = _database.GetCollection(AchievementsCollectionName); await dbAchievementSections.DeleteManyAsync(Builders.Filter.Empty); await dbAchievementSections.InsertManyAsync(achievementDictionary); } public async Task UpdateVehicles(List vehiclesDictionary) { var dbVehicles = _database.GetCollection(VehiclesCollectionName); await dbVehicles.DeleteManyAsync(Builders.Filter.Empty); await dbVehicles.InsertManyAsync(vehiclesDictionary); } public async Task> ReadLanguages() { var collection = await _database.GetCollection(LanguagesCollectionName) .FindAsync(Builders.Filter.Empty); return collection.ToList(); } public async Task> GetTankTires(long[] tankIds) { var collection = await _database.GetCollection(VehiclesCollectionName) .Find(Builders.Filter.In(v => v.TankId, tankIds)) .Project(v => new { TankId = v.TankId, Tier = v.Tier }) .ToListAsync(); return collection.ToDictionary(k => k.TankId, v => v.Tier); } public async Task> GetVehicles(long[] tankIds) { var collection = await _database.GetCollection(VehiclesCollectionName) .Find(Builders.Filter.In(v => v.TankId, tankIds)) .ToListAsync(); return collection.ToDictionary(k => k.TankId, v => v as IVehiclesDictionary); } public async Task> GetNations(RequestLanguage language) { var collection = await _database.GetCollection(NationsCollectionName) .Find(Builders.Filter.Empty) .Project(n => new { nationId = n.NationId, nationValue = n.NationNames.First(v => v.Language == language).Value }) .ToListAsync(); return collection.ToDictionary(n => n.nationId, n => n.nationValue); } public async Task> GetTankTypes(RequestLanguage language) { var collection = await _database.GetCollection(VehicleTypesCollectionName) .Find(Builders.Filter.Empty) .Project(n => new { typeId = n.VehicleTypeId, typeValue = n.VehicleTypeNames.First(v => v.Language == language).Value }) .ToListAsync(); return collection.ToDictionary(n => n.typeId, n => n.typeValue); } public async Task> GetClanRoles(RequestLanguage language) { var collection = await _database.GetCollection(ClanRolesCollectionName) .Find(Builders.Filter.Empty) .Project(n => new { ClanRoleId = n.ClanRoleId, ClanRoleValueValue = n.ClanRoleNames.First(v => v.Language == language).Value }) .ToListAsync(); return collection.ToDictionary(n => n.ClanRoleId, n => n.ClanRoleValueValue); } } }